Определить, какая кнопка была нажата в 2D-массиве Java

В нашем коде у нас есть массив кнопок 10 на 10. Мы создали массив 10 на 10, используя вложенный цикл for, и у нас нет проблем с созданием кнопок. Кроме того, у нас есть так, что при нажатии кнопки отображается «Кнопка нажата». Но как определить, какая кнопка была нажата?

Мы используем методы actionListeners и actionPerformed.


person Hanna    schedule 09.02.2011    source источник


Ответы (6)


Вы можете вызвать метод getSource() для события.

Или вы можете использовать классы Action в своих кнопках и создавать новый экземпляр каждого из них при создании кнопок.

person jzd    schedule 09.02.2011

Сложите все кнопки в список (легко делается во внутреннем цикле), сделайте список доступным для ActionListener (например, как свойство внешнего класса; я не знаю, как ваша многочисленная команда расставила слушателей, поэтому не могу предоставить любые подробности). Затем позвоните:

  int buttonIndex = listWithButtons.indexOf(event.getSource())

Если кто-то из вас хочет узнать точные координаты кнопки, их можно рассчитать по формулам:

int row = buttonIndex / 10;
int col = buttonIndex % 10;
person fdreger    schedule 09.02.2011

Я предполагаю, что это JButton. Вы можете использовать setActionCommand("команда" + строка + "-" + столбец). Затем в слушателе просто скажите getActionCommand(), чтобы увидеть, какая кнопка была нажата.

person terloon    schedule 09.02.2011
comment
Мы не используем JButtons, извините, что не уточнили это. - person Hanna; 09.02.2011

Два простых решения, но, вероятно, не самые лучшие:

Класс кнопки, реализующий собственный слушатель.

Вы также можете просто проверить каждую кнопку, чтобы увидеть, равна ли она объекту action.getSource(). Или просто приведите (ButtonClass) к getSource(), чтобы иметь возможность использовать полученную кнопку.

person POSIX_ME_HARDER    schedule 09.02.2011

Вы можете использовать getActionCommand так:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestButtons extends JPanel {

    private static final long serialVersionUID = 1L;

public TestButtons() {

    JButton btn1 = new JButton("Btn1");
    btn1.addActionListener(new ButtonListener());
    add(btn1);
    JButton btn2 = new JButton("Btn2");
    btn2.addActionListener(new ButtonListener());
    add(btn2);

  }

  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.getContentPane().add(new TestButtons());

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200, 200);
    frame.setVisible(true);
  }
}

class ButtonListener implements ActionListener {
  ButtonListener() {
  }

  public void actionPerformed(ActionEvent e) {
      System.out.println(e.getActionCommand()+ " has been clicked");
  }
}
person jhurtado    schedule 09.02.2011

В итоге мы использовали вложенный цикл for внутри actionPerformed, который проходил через массив 2d и оттуда вызывал методы действия. Вероятно, это не лучшее решение, и, вероятно, лучше использовать другую технику, но, похоже, она работает нормально.

Хотя здесь есть несколько действительно хороших идей, спасибо, ребята!

person Hanna    schedule 09.02.2011