在actionlistener中使用非局部变量

时间:2015-05-15 11:45:50

标签: java icons actionlistener

我想在动作监听器中使用变量。 这是我的代码:

public class Face {

public Face(){

    Btn1 =  new JToggleButton();
    Btn2 =  new JToggleButton();
    Btn3 =  new JToggleButton();
    Btn4 =  new JToggleButton();
    Btn5 =  new JToggleButton();
    Btn6 =  new JToggleButton();

}


public Start6(){

    JToggleButton[] Btn = new javax.swing.JToggleButton[5]; // An array for saving address of all buttons

    Btn[0] = Btn1 ;
    Btn[1] = Btn2 ;
    Btn[2] = Btn3 ;
    Btn[3] = Btn4 ;
    Btn[4] = Btn5 ;
    Btn[5] = Btn6 ;

   for (int i = 0 ; i < 36 ; i++) {
        Btn[i].addActionListener(new ActionListener() {     
        @Override
        public void actionPerformed(ActionEvent e) {
        Btn[i].setSize(150, 150);
        ImageIcon BtnImage = new ImageIcon(getClass().getResource("/GameImages/" + /* a picture name*/ + ".jpg" ));
        Image img = BtnImage.getImage();
        Btn[i].setIcon( new ImageIcon(img.getScaledInstance(225,160 ,Image.SCALE_FAST)));
        X6P.add(Btn[i]);
        }
    });
    }


   }
  public javax.swing.JToggleButton Btn1;
  public javax.swing.JToggleButton Btn2;
  public javax.swing.JToggleButton Btn3;
  public javax.swing.JToggleButton Btn4;
  public javax.swing.JToggleButton Btn5;
  }

当我想在Btn数组(相同数组)的动作侦听器中使用Btn数组时,我收到此错误:

  

从内部类引用的局部变量必须是最终的或有效的最终   我想要点击按钮时显示它的图标......

1 个答案:

答案 0 :(得分:1)

错误意味着它所说的内容:您的数组变量Btn不是final,因此无法从内部类访问它。制作final将解决问题:

final JToggleButton[] Btn = new ...

另一个解决方案是将数组移动到类中:

public javax.swing.JToggleButton Btn1;
public javax.swing.JToggleButton Btn2;
public javax.swing.JToggleButton Btn3;
public javax.swing.JToggleButton Btn4;
public javax.swing.JToggleButton Btn5;
private javax.swing.JToggleButton[] Btn = new javax.swing.JToggleButton[] {
    Btn1, Btn2, Btn3, Btn4, Btn5
};

这会做同样的事情,让你的代码缩短。

  

我想要点击按钮时显示其图标

您根本不需要使用数组:而不是引用Btn[i],引用e.getSource()。它被设置为已被点击的按钮 - 您需要做的就是投射它:

javax.swing.JToggleButton sender = (javax.swing.JToggleButton)e.getSource();

在循环外创建一个动作侦听器 ,并在所有按钮上设置它。这将完全消除阵列:

// The same listener instance can handle all buttons
ActionListener actListener = new ActionListener() {     
    @Override
    public void actionPerformed(ActionEvent e) {
        javax.swing.JToggleButton senderButton = (javax.swing.JToggleButton)e.getSource();
        ... // Do anything you want with senderButton here
    }
};
// Add the same listener to all buttons
for (int i = 0 ; i < 36 ; i++) {
    Btn[i].addActionListener(actListener);
}