在 actionlistener 中使用非局部变量
Use non-local variables in 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 数组时,出现此错误:
local variables referenced from an inner class must be final or effectively final
i want when button clicked show it's icon ...
错误的意思正是它所说的:您的数组变量 Btn
不是 final
,因此无法从内部 class 访问它。使其成为 final
将解决问题:
final JToggleButton[] Btn = new ...
另一个解决方案是将数组移动到 class:
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
};
这会做同样的事情,并使您的代码更短。
I want when button clicked show its icon
您根本不需要使用数组:与其引用 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);
}
我想在它的动作侦听器中使用一个变量。 这是我的代码:
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 数组时,出现此错误:
local variables referenced from an inner class must be final or effectively final i want when button clicked show it's icon ...
错误的意思正是它所说的:您的数组变量 Btn
不是 final
,因此无法从内部 class 访问它。使其成为 final
将解决问题:
final JToggleButton[] Btn = new ...
另一个解决方案是将数组移动到 class:
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
};
这会做同样的事情,并使您的代码更短。
I want when button clicked show its icon
您根本不需要使用数组:与其引用 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);
}