3

假设我有一个带有二维按钮数组的程序,当您单击其中一个按钮时,它会变成红色。我不想单独声明每个按钮,所以我只是为它们创建了 JButton[][] 数组。问题是我不知道如何在数组中的任何按钮上使用动作监听器,因此它会改变这个特定按钮的颜色,并且没有任何相关问题与此相关。我尝试使用“for”,但没有帮助:

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

}
4

1 回答 1

8

你有没有尝试过:

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

您的代码可能无法正常工作的一个原因是JButton[][]您用于创建按钮的按钮对于您的MainW构造函数来说是本地的。我提供的方法将允许您忽略这个范围界定问题。它还将删除您的迭代方法,并将其替换为更有效的解决方案。在您的代码中,即使事件是由列表中的第一项触发的,或者甚至不是由您的一个按钮触发的,您也将始终遍历整个 2D 数组并测试每个。

于 2011-01-05T03:37:59.950 回答