Слушатель действий для массива JButton - PullRequest
3 голосов
/ 05 января 2011

Допустим, у меня есть программа с двумерным массивом кнопок, и когда вы нажимаете одну из них, она становится красной.Я не хотел объявлять каждую кнопку отдельно, поэтому я просто создал для них массив JButton [] [].Проблема в том, что я не знаю, как использовать слушатель действия на любой из кнопок в массиве, чтобы он изменил цвет этой конкретной кнопки, и ни один из связанных вопросов не имеет отношения к этому.Я пытался использовать "для", но это не помогает:

package appli;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MainW extends JFrame implements ActionListener {

    public MainW(){
        setSize(640,480);
        setTitle("title");
        setLayout(null);
        JButton[][] btnz = new JButton[5][5];
        for(Integer i=0;i<5;i++)
        {
            for(Integer j=0;j<5;j++)
            {
                btnz[i][j]= new JButton("");
                btnz[i][j].setBackground(Color.WHITE);
                btnz[i][j].setBounds(10+20*i,10+20*j,20,20);
                add(btnz[i][j]);
                btnz[i][j].addActionListener(this);
            }
        }
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e){
        for(Integer i=0;i<5;i++)
        {
            for(Integer j=0;j<5;j++)
            {
                if (e.getSource()==btnz[i][j]);
                {
                    btnz[i][j].setBackground(Color.RED);
                }
            }
        }
    }

}

1 Ответ

8 голосов
/ 05 января 2011

вы пробовали:

public void actionPerformed(ActionEvent e){
   if( e.getSource() instanceof JButton) {
       ((JButton)e.getSource()).setBackground(Color.red);
   }
}

Одна из причин, по которой ваш код может не работать, заключается в том, что JButton[][], который вы используете для создания кнопок, является локальным по отношению к вашему конструктору MainW.Предложенный мною подход позволит вам игнорировать эту проблему.Это также удалит ваш итеративный подход и заменит его более эффективным решением.В вашем коде, даже если событие вызывается первым элементом в вашем списке или даже не вызывается одной из ваших кнопок, вы всегда будете выполнять итерацию по всему 2D-массиву и проверять каждую из них.

...