gpt4 book ai didi

Java For 循环 - 那个时刻的变量 - JButton 的二维数组

转载 作者:行者123 更新时间:2023-12-04 20:51:20 24 4
gpt4 key购买 nike

我在下面的 for 循环中遇到了一个大问题,我正在尝试为一系列 JButton 创建 Action 监听器,并且每个 JButton 都必须为“Column”和“Row”分配不同的值,但是,对于所有按钮“Column”和“Row”只会成为 for 循环的最高可能值,就像在 for 循环中 m 上升到 7 一样,“Column”对于所有按钮都等于 7,它不会增加。换句话说,我希望第一个按钮 'but[0][0]' 使 'Column' 等于 0,但我也希望 'but[1][0]' 使 'Column' 等于 1,等等在。任何帮助将不胜感激。

按钮的用途是更改程序中其他地方声明的“Column”和“Row”的值,因此每个按钮都需要使“Column”和“Row”相等。

for (m = 0; m < width; m++){
for (n = 0; n < width; n++){
but[m][n].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e){
Column = m;
Row = n;
enablenumbers();
disablecolumns();
disablerows();
choose.setText("Now Choose The Nummber You Want To Put In This Square");
}
}
);
}
}

最佳答案

我猜 mn 被声明为周围类中的字段(否则 ActionListener 无法访问它们,即会出现编译错误)。

单击操作时将调用 actionPerformed 方法。此时,for 循环已执行完毕,在字段mn 中留下最大列数和行数。换句话说,所有的 Action 监听器都访问相同的 mn,但它们都应该看到不同的值。

这已经暗示了解决方案:每个 ActionListener 都需要自己的变量 mn。在代码中:

        final int col = m;
final int row = n;
but[m][n].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e){
Column = col;
Row = row;
enablenumbers();
disablecolumns();
disablerows();
choose.setText("Now Choose The Nummber You Want To Put In This Square");
}
}
);

请注意,变量是在内部 for 循环中声明的;它们只存在一次迭代。因为它们是最终的,所以它们对匿名内部类是可见的(在幕后,这些最终变量的值将被复制到匿名类的字段中(这个声明的证据在这个答案的附录中给出)

或者,您可以采用显式路由并使用内部类:

class MyActionListener implements ActionListener {
final int col;
final int row;

// constructor goes here

// impl of actionPerformed goes here, using col and row instead of m and n
}

您将使用它附加

for (m = 0; m < width; m++){
for (n = 0; n < width; n++){
but[m][n].addActionListener(new MyActionListener(m,n));
}
}

附录:内部类访问封闭变量的实现

对于内部类访问的封闭作用域中声明的每个最终局部变量,编译器会自动在内部类中创建一个附加字段来保存其值,并修改构造函数以从新的构造函数参数分配该字段。这可以通过运行以下代码来验证:

public class Test {
public static void main(final String[] args) throws Exception {
System.out.println(new Object() {
@Override
public String toString() {
for (Field f : getClass().getDeclaredFields()) {
System.out.println(f.getName());
}
System.out.println(getClass().getDeclaredConstructors()[0].toString());
return "" + args.length;
}
});
}
}

打印:

val$args
Test$1(java.lang.String[])
0

关于Java For 循环 - 那个时刻的变量 - JButton 的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5286694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com