Question

I'm trying to make a simple calculator in Java using Swing, and I've created my buttons the following way:

//Our number keypad
public static JPanel numbers(){

    //our panel to return
    JPanel panel = new JPanel();

    //Create and add 3x4 grid layout to panel
    GridLayout gl = new GridLayout(3, 4);
    panel.setLayout(gl);

    //For creating and adding buttons to panel
    for(int i = 0; i < 10; i++){

        //Create a new button where the name is the value of i
        String name = "" + i + "";
        JButton button = new JButton(name);

        //add action listener
        button.addActionListener(handler);

        //Add button to panel
        panel.add(button);
    }

    return panel;
}

My question is how do I reference each specific button in my event handler? I can't think of a way to do this without having to manually create each button rather than using a loop.

Thanks.

Was it helpful?

Solution

In your listener, call event.getSource(), and that will return the button which has been pressed. Get the text of the button, and you have its number.

Or create a different instance of your handler for every button, and pass the value of the button (i) to the constructor of the handler. This last solution is cleaner, IMO, because it doesn't depend on the text of the button. If you replaced the text by an image, for example, the first technique wouldn't work anymore.

OTHER TIPS

You can distinguish created buttons by adding the following inside handler:

String buttonText = ((JButton) e.getSource()).getText();
if (<text1>.equals(buttonText)){
    //do the stuff
} else if (<text2>.equals(buttonText)){
    //do the stuff
} else {
    //do the stuff
}

Method #1: go through the child components of the parent JPanel (quite tedious, has to be rebuilt every time you modify the contents of that JPanel). Make sure they're JButtons by using an if . . instanceof clause.

Method #2: as you create them in that loop, add them to a List (or even better, a Map). I prefer a Map personally as it lets me customise the key for that specific JComponent

i.e.

HashMap<String, JComponent> buttonList = new HashMap<String, JComponent>();

for(. .) {
    buttonList.put("nameForEachButton", button);
}

I recommend generating the button name based off of the loop counter. Either use your existing name value, or just set it to "button" + i;

Declare your buttons using an array.

JButton[] button = new JButton[9]; //outside the for loop

for (int i = 0; i < 10; i++) {
    //put your code

    button[i] = new JButton(name);

    //your code
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top