局部变量" i"是在内部类修复中访问的?

时间:2014-04-28 00:05:16

标签: java actionlistener

之前我已经看过一些帖子了,但是我还没找到一个关于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);
 }

感谢大家的帮助,你给了我一些解决方案!

4 个答案:

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

如果我误解了你的问题,请告诉我。