2011-01-05 57 views
3

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

} 

回答

8

你尝试过:

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

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