Java 局部变量;我";是否在内部类修复程序中访问?

Java 局部变量;我";是否在内部类修复程序中访问?,java,actionlistener,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.setLayou

我以前看过一些关于这个的帖子,但是我还没有找到一个关于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);
 }
JButton jb[]=新JButton[9];
int checkB[]=新int[9];
公共SomethingSimple(){
JPanel p1=新的JPanel();
p1.设置布局(新网格布局(3,3,5,5));
p1.立根背景(颜色:红色);
对于(int i=0;i

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

我认为最好的解决方案是将
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]));
}    
for(int i = 0; i < jb.length(); i++)
{
  jb[i].addActionListener(class that implements the listener);
}
for(int i=0;i
我认为最好的解决方案是将
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]));
}    
for(int i = 0; i < jb.length(); i++)
{
  jb[i].addActionListener(class that implements the listener);
}
for(int i=0;i
在forloop中创建一个最终的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]);

      }
for(int i=0;i
在forloop中创建一个最终的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]);

      }
for(int i=0;i
本地和匿名类只能访问
final
本地变量,因此请执行以下操作

final JButton btn = jb[i];

在创建
新JButton
后,立即在
for
循环中执行
操作,然后您可以在
操作执行中引用
btn
,本地和匿名类只能访问
最终的
本地变量,因此执行类似操作

final JButton btn = jb[i];
for
循环中,在创建
新的JButton
之后,您可以立即参考
btn
执行的操作
这是来自一位15岁的C程序员,所以请谨慎对待。首先,我理解了您的问题,您希望使用for循环将
actionListener
添加到数组
jb
中的所有jbutton中。 基本上根据我的java经验,您必须将
actionListener
实现到您的类中(或者实现到任何充当实际侦听器的类中)。那么您的代码应该如下所示:

for (int i = 0; i < jb.length; i++) {
    jb[i] = new JButton("");
    p1.add(jb[i]);
    jb[i].addActionListener(new MyActionLisener(jb[i]));
}    
for(int i = 0; i < jb.length(); i++)
{
  jb[i].addActionListener(class that implements the listener);
}
for(int i=0;i
如果我误解了你的问题,请告诉我。

这是一位15岁的C#程序员发来的,请恕我直言。首先,我理解了您的问题,您希望使用for循环将
actionListener
添加到数组
jb
中的所有jbutton中。 基本上根据我的java经验,您必须将
actionListener
实现到您的类中(或者实现到任何充当实际侦听器的类中)。那么您的代码应该如下所示:

for (int i = 0; i < jb.length; i++) {
    jb[i] = new JButton("");
    p1.add(jb[i]);
    jb[i].addActionListener(new MyActionLisener(jb[i]));
}    
for(int i = 0; i < jb.length(); i++)
{
  jb[i].addActionListener(class that implements the listener);
}
for(int i=0;i

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

不过他仍然想使用迭代器。@Human我是说在for循环中,我想我最初写的方式不是特别清楚。哦,好吧,这是有道理的。
btn
还会引用与
jb[i]
相同的对象吗?尽管如此,他还是想使用迭代器。@Human我是说在for循环中,我想我最初编写它的方式不是特别清楚。哦,好吧,这很有意义。
btn
还会引用与
jb[i]
相同的对象吗?我尝试了类似的方法,但它告诉我无法更改最终变量。我记不清我到底做了什么。我现在知道我能做到。谢谢我尝试了类似的方法,但它告诉我无法更改最终变量。我记不清我到底做了什么。我现在知道我能做到。谢谢最后决定。事实上,它是一个
ActionListener
对答案没有任何影响。可能的重复项使其成为最终结果。事实上,它是一个
ActionListener
对答案没有任何影响。可能的重复