8

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.

James MV
  • 8,569
  • 17
  • 65
  • 96

7 Answers7

19
JButton btnClear = new JButton("clear");
btnClear.addActionListener(this);
btnClear.setName("clear");

//..............
//..............

public void actionPerformed(ActionEvent e) {
   JButton o = (JButton)e.getSource();
   String name = o.getName();
   if (name == "clear")
   {
       euroMillText.setText("");
   }
   else if (name == "eumill")
   {
       getLottoNumbers();
   }
   //JOptionPane.showMessageDialog(null,name);      
}   
Rob
  • 199
  • 1
  • 2
11

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...
}
Yanick Rochon
  • 51,409
  • 25
  • 133
  • 214
  • Thanks Yanick, if I wanted to change a buttons icon could I do it using this method? – James MV Oct 23 '11 at 21:27
  • yes, of course, just use the button you fetch from the `Map` and do whatever you want with it, as it is the same button istance as the one added to the `JFrame` – Yanick Rochon Oct 23 '11 at 23:12
9
String buttonText = ((JButton) e.getSource()).getText()
Sean Patrick Floyd
  • 292,901
  • 67
  • 465
  • 588
1

you can set the Icon by using

((JButton)actionEvent.getSource()).setIcon("imageName.png");

//to get the name of button you can use
ArrayList<String> buttonNames;
buttonNames.add("button"+f+i);
Tim M.
  • 53,671
  • 14
  • 120
  • 163
vivek
  • 11
  • 1
1

Store your buttons in an array and use e.getSource() to figure out which it was...

Private JButton[] buttons;

public void actionPerformed(ActionEvent e) {
    int index = -1;

    for (int i = 0; i < buttons.length; i++) {
        if (e.getSource() == buttons[i]) {
            index = i;
            break;
        }
    }

    if (index == -1) {
        // e didn't come from the buttons
    } else {
        // do stuff
    }
}
Sibbo
  • 3,796
  • 2
  • 23
  • 41
  • e.getsource gives me a rather long result, is that normal? I've edited my question to give extra detail. – James MV Oct 23 '11 at 17:59
1

you have another three choices

1) by implements

  • JButton[] buttons;

  • ArrayList<JButton> buttons;

but still is required to determine which JButton is pressed from the loop

2) add to each JButton separate ActionListener

    myButton.addActionListener(new java.awt.event.ActionListener() {

        @Override
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            myButtonActionPerformed(evt);
        }

        private void myButtonActionPerformed(ActionEvent evt) {
            // some Action
        }
    });

3) add javax.swing.Action to the JButton

mKorbel
  • 109,525
  • 20
  • 134
  • 319
0

Another option that might work is to use the client properties of the button. The base JComponent class provides for setting/getting arbitrary properties:

Object JComponent.getClientProperty(Object key)
void JComponent.putClientProperty(Object key, Object value)

So what you can do is set an application defined property value on the component and then interrogate that property value inside the ActionListener method (just checking that source of the event is a JComponent).

Jere
  • 581
  • 2
  • 3