Получить имя кнопки от ActionListener? - PullRequest
6 голосов
/ 23 октября 2011

Я искал в Интернете, но не могу найти ответ на этот вопрос:

Я использую цикл for для создания 36 кнопок с именами a1, a2 и т. Д. И назначаю каждому из них уникальное действиеКоманда в то же время.

Позже я хотел получить имя кнопки из метода actionPerformed (ActionEvent e).

Я мог бы получить ActionCommand достаточно легко, но мне также нужно название кнопки.

Любая помощь высоко ценится!

Редактировать:

Вот код, который я использую:

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();
            }

        }

}

Это дает вам 36 кнопок для сетки 6x6, которые идут a1-6, b1-6, c1-6 и т. д.

Я просто не могу управлять кнопками, как только я их создал, я не могу назначать значки или получать имя кнопки.

Заранее спасибо.

Ответы [ 7 ]

14 голосов
/ 11 октября 2012
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);      
}   
10 голосов
/ 23 октября 2011

Сохраните ссылку на кнопки в 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();
        }

    }

} 

Затем в вашем ActionListener верните кнопку обратно из команды:

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

Редактировать

Возвращаясь к этому ответу через пять лет, я понятия не имею, почему я предложил HashMap: P

Этот код делает то же самое, без третьей стороны 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();
        }
    }
}

в 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...
}
8 голосов
/ 23 октября 2011
String buttonText = ((JButton) e.getSource()).getText()
1 голос
/ 14 апреля 2012

вы можете установить иконку с помощью

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

//to get the name of button you can use
ArrayList<String> buttonNames;
buttonNames.add("button"+f+i);
1 голос
/ 23 октября 2011

у вас есть еще три варианта

1) навесным оборудованием

  • JButton[] buttons;

  • ArrayList<JButton> buttons;

, но все еще требуется для определения, какой JButton нажат из цикла

2) добавить к каждому JButton отдельного 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) добавьте javax.swing. Действие в JButton

1 голос
/ 23 октября 2011

Сохраните ваши кнопки в массиве и используйте e.getSource(), чтобы выяснить, что это было ...

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
    }
}
0 голосов
/ 24 октября 2011

Еще один вариант, который может сработать, - использовать клиентские свойства кнопки. Базовый класс JComponent обеспечивает установку / получение произвольных свойств:

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

Итак, что вы можете сделать, это установить значение свойства приложения для компонента, а затем запросить это значение свойства в методе ActionListener (просто проверяя, что источником события является JComponent).

...