Открива кой бутон е щракнат в 2D масив Java

В нашия код имаме масив от бутони 10 на 10. Направихме масива 10 на 10 с помощта на вложен for цикъл и нямаме проблем при създаването на бутоните. Освен това го имаме, така че когато се щракне върху бутон a, той показва „Щракнат бутон“. Но как можем да определим кой бутон е щракнат?

Ние използваме 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