Computer Science 523
Advanced Programming

Summer 2014, The College of Saint Rose

VotingManyLayout Demo

A working demo of VotingManyLayout will appear below. Click inside the applet to interact with it.



VotingManyLayout BlueJ Project

Click here to download a BlueJ project for VotingManyLayout.


VotingManyLayout Source Code

The Java source code for VotingManyLayout is below. Click on a file name to download it.


VotingManyLayout.java

/*
 * Example VotingManyLayout: a prettier version of the many voting example
 *
 * Jim Teresco, The College of Saint Rose, CSC 523, Summer 2014
 *
 * $Id: VotingManyLayout.java 2381 2014-06-18 12:48:37Z terescoj $
 */
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class VotingManyLayout extends JApplet implements ActionListener {
    
    // a named constant for the number of candidates
    private static final int NUM_CANDIDATES = 5;
    
    // We need arrays for the buttons, counts, and labels
    private JButton[] buttons;
    private int[] votes;
    private JLabel[] labels;
    
    public void init() {
        Container contentPane = getContentPane();
        
        contentPane.setLayout(new GridLayout(NUM_CANDIDATES+1, 1));
        
        // our array of vote tallies
        votes = new int[NUM_CANDIDATES];
        for (int c = 0; c < NUM_CANDIDATES; c++) {
            votes[c] = 0;
        }
        
        // set up our labels but this time add them to the GridLayout so we have
        // them all in a column

        labels = new JLabel[NUM_CANDIDATES];
        for (int c = 0; c < NUM_CANDIDATES; c++) {
            labels[c] = new JLabel("Candidate " + (c+1) + ": 0");
        }
        Font currentFont = labels[0].getFont();
        Font newFont = new Font(currentFont.getFontName(), currentFont.getStyle(), 30);
        for (int c = 0; c < NUM_CANDIDATES; c++) {
            labels[c].setFont(newFont);
            contentPane.add(labels[c]);
        }
        
        // add our buttons in a JPanel, set them up with our action listener
        JPanel buttonPanel = new JPanel();
        
        buttons = new JButton[NUM_CANDIDATES];
        for (int c = 0; c < NUM_CANDIDATES; c++) {
            buttons[c] = new JButton("Vote for " + (c+1));
            buttons[c].addActionListener(this);
            buttonPanel.add(buttons[c]);
        }
        
        // this will add to the last slot in the GridLayout
        contentPane.add(buttonPanel);
        
        contentPane.validate();
    }
    
    // our actionPerformed method now needs to deal with all of the
    // buttons
    public void actionPerformed(ActionEvent e) {
        
        // we need to know which button was pressed so let's check each
        for (int c = 0; c < NUM_CANDIDATES; c++) {
            if (e.getSource() == buttons[c]) {
                votes[c]++;
                labels[c].setText("Candidate " + (c+1) + ": " + votes[c]);
                
                // no need to continue once we've found a match
                return;
            }
        }
    }
}