gpt4 book ai didi

java - actionListener 的 2d 数组和 JButton 的 2d 数组麻烦

转载 作者:太空宇宙 更新时间:2023-11-04 15:03:44 25 4
gpt4 key购买 nike

我在使用 Jbuttons 获取 actionListeners 时遇到了一些麻烦...所以我有 3 个文件 - 一个用于模型(信息存储),一个用于实际 GUI,然后第三个文件处理所有内容按钮的操作。在我的 GUI 中,我制作了一个 8 x 8 的带有图标的 JButton 数组,每个数组还配备了一个 selectedIcon。然后,在我的 Controller 类中,我为所有按钮设置了操作监听器。如何为 JButton 的 2D 数组正确设置和使用它们?我使用了一个双 for 循环来制作网格..对于 Controller 类,这是我现在拥有的 Action 监听器的代码:

for (i = 0; i < model.ROWS; i ++) {
for (j = 0; j < model.ROWS; j ++) {

buttonListeners[i][j] = new ActionListener() {
public void actionPerformed(ActionEvent e) {
view.buttonGrid[i][j].setSelected(!view.buttonGrid[i][j].isSelected());
}
};
}
}
i = 0;
j = 0;
enableListeners();

它现在所做的是,当我单击任何按钮时,它只选择和取消选择第一个按钮...任何帮助将不胜感激!!

最佳答案

当您想在您创建的 ActionListener 中使用变量 ij 时,这些变量必须是 final,或封闭类的实例变量。

目前,它们显然被声明为实例变量。创建操作监听器后,将它们设置回 i=0j=0。这就是为什么所有操作监听器仅影响 buttonGrid[0][0]!

您可以根据您的目的定义局部最终变量:

for (int i = 0; i < model.ROWS; i ++) 
{
for (int j = 0; j < model.ROWS; j ++)
{
final int fi = i;
final int fj = j;
buttonListeners[i][j] = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
view.buttonGrid[fi][fj].setSelected(
!view.buttonGrid[fi][fj].isSelected());
}
};
}
}

(不要忘记删除实例变量 ij,您不应该再需要它们了)

关于java - actionListener 的 2d 数组和 JButton 的 2d 数组麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22275236/

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