Search code examples
javaswingjbutton

Get button name from ActionListener?


I have scoured the internet but can't find an answer to this :

I'm using a for loop to create 36 buttons called a1, a2, etc. and assigning each of them a unique Action Command at the same time.

Later on I wanted to get the name of the button from the actionPerformed(ActionEvent e) method.

I could get the ActionCommand easy enough, but I need the name of the button as well.

Any help much appreciated!

Edit:

Here is the code I'm using:

String letters[] = {"0", "a", "b", "c", "d", "e", "f"};
JButton btn[] = new JButton[35];
int count = 0;


for (int f=1; f < 7;f++){

        for (int i=1; i < 7;i++){
            btn[i] = new JButton(letters[f]+i, cup);
            System.out.println(btn[i]));
            mainGameWindow.add(btn[i]);
            btn[i].addActionListener(this);
            String StringCommand = Integer.toString(randomArrayNum());
            btn[i].setActionCommand(StringCommand);
            count++;
            if(count == 18){
                generateArray();
            }

        }

}

This gives you 36 buttons for a 6x6 grid that go a1-6, b1-6, c1-6 etc

I just can't seem to control the buttons once I've created them this way, I can't assign icons or get the name of the button.

Thanks in Advance.


Solution

  • Keep a reference of the buttons in a Map

    String letters[] = {"0", "a", "b", "c", "d", "e", "f"};
    JButton btn;
    int count = 0;
    
    HashMap<String,JButton> buttonCache = new HashMap<String,JButton>();
    
    
    for (int f=1; f < 7;f++){
    
        for (int i=1; i < 7;i++){
            btn = new JButton(letters[f]+i, cup);
            mainGameWindow.add(btn[i]);
            btn.addActionListener(this);
            String stringCommand = Integer.toString(randomArrayNum());
            btn.setActionCommand(stringCommand);
            buttonMap.put(stringCommand,btn);
            count++;
            if(count == 18){
                generateArray();
            }
    
        }
    
    } 
    

    Then, in your ActionListener, get the button back from the command :

    public void actionPerformed(ActionEvent e) {
        String command = ((JButton) e.getSource()).getActionCommand();
        JButton button = buttonCache.get(command);
        if (null != button) {
            // do something with the button
        }
    }
    

    Edit

    Revisiting this answer over five years later, I have no idea why I suggested a HashMap :P

    This code does the exact same thing, no third party Map :

    String letters[] = {"0", "a", "b", "c", "d", "e", "f"};
    int count = 0;
    
    for (int f=1; f < 7;f++){
        for (int i=1; i < 7;i++) {
            String stringCommand = Integer.toString(randomArrayNum());
            Button btn = new JButton(letters[f]+i, cup);
    
            btn.setActionCommand(stringCommand);
            btn.addActionListener(this);
            mainGameWindow.add(btn[i]);
    
            // NOTE : I have no idea what this is for...
            count++;
            if(count == 18){
                generateArray();
            }
        }
    }
    

    in the ActionListener...

    public void actionPerformed(ActionEvent e) {
        JButton button = (JButton) e.getSource();
        String command = button.getActionCommand();
    
        // do something with the button
        // the command may help identifying the button...
    }