之前我已经看过一些帖子了,但是我还没找到一个关于actionListeners的帖子。我正在尝试使用JButton数组创建tic-tac-toe。如果可能的话,如何在使用for循环临时变量的同时为它们添加动作侦听器?感谢您的帮助。
JButton jb [] = new JButton[9];
int checkB [] = new int[9];
public SomethingSimple(){
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(3, 3, 5, 5));
p1.setBackground(Color.red);
for (int i = 0; i < jb.length; i++){
checkB[i] = 0;
}
for (int i = 0; i < jb.length; i++){
jb[i] = new JButton("");
p1.add(jb[i]);
jb[i].addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
jb[i].setText("O");
}
});
}
add(p1);
}
感谢大家的帮助,你给了我一些解决方案!
答案 0 :(得分:3)
在for循环中创建一个final int;您无法从类中访问本地变量到匿名类..
溶液:
for (int i = 0; i < jb.length; i++){
jb[i] = new JButton("");
final int index = i;
jb[i].addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
jb[index].setText("O");
}
});
p1.add(jb[i]);
}
答案 1 :(得分:2)
我认为最好的解决方案是将ActionListener
移到另一个类:
public class MyActionListener implements ActionListener {
private final JButton button;
public MyActionListener(JButton button) {
this.button = button;
}
@Override
public void actionPerformed(ActionEvent e){
button.setText("O");
}
}
并改变你的代码:
for (int i = 0; i < jb.length; i++) {
jb[i] = new JButton("");
p1.add(jb[i]);
jb[i].addActionListener(new MyActionLisener(jb[i]));
}
答案 2 :(得分:0)
本地和匿名类只能访问final
局部变量,所以请执行类似
final JButton btn = jb[i];
创建for
后立即在new JButton
循环内,然后您可以参考btn
内的actionPerformed
。
答案 3 :(得分:0)
这是来自一个15岁的C#程序员,所以请耐心等待。首先,当我理解您的问题时,您希望将actionListener
添加到数组jb
中的所有Jbuttons,并使用for循环。
基本上在我的java经验中,你必须将actionListener
实现到你的类中(或者作为实际监听器的任何类)。然后你的代码应该是这样的:
for(int i = 0; i < jb.length(); i++)
{
jb[i].addActionListener(class that implements the listener);
}
如果我误解了你的问题,请告诉我。