0

好的,所以我在其他任何地方都找不到我需要的东西,所以就这样吧。

我将如何将变量传递给 ActionListener() 内的函数?这是我的代码。

for(int y = 0; y < 5; y ++) {
        for(int x = 0; x < 5; x ++) {
            currentRect = (y * 5) + x;
            mainButtons.get(currentRect).addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    answerField.setText(questions.get(currentRect).getAnswer());
                }
            });
        }
    }

错误在第六行,它在“currentRect”下划线,然后抱怨这个,

不能在不同方法中定义的内部类中引用非最终变量 currentRect

所做的是遍历一组 JButtons (javax.swing) ,然后根据它们在 ArrayList 中的位置分配适当的动作侦听器,但是,我似乎无法将存储其位置的变量传递给动作侦听器本身,所以我被困住了。我在写这篇文章时意识到我真的应该使用一个 foreach,所以以后会改变它。(请注意谁会指出这一点)我意识到我不能也使该变量成为最终变量,因为它在 for 循环期间发生了变化。我还尝试将 currentRect ((y * 5) + x) 的值传递给函数,但无济于事。

谢谢,

安德鲁吉斯17

4

1 回答 1

2

解决方案很简单,只需在块内声明一个新的 final 变量:

for(int y = 0; y < 5; y ++) {
        for(int x = 0; x < 5; x ++) {
            final int currentRect = (y * 5) + x;

或者如果您需要块外的 currentRect 的值:

for(int y = 0; y < 5; y ++) {
        for(int x = 0; x < 5; x ++) {
            currentRect = (y * 5) + x;
            final int currentRect2 = currentRect;

并且您在匿名类中使用 currentRect2 而不是 currentRect 。这是违反直觉的,因为看起来最终变量每次都在重新初始化,但实际上,您必须将其视为一个新变量,对于块的每个循环仅初始化一次。

然而,这并不是解决这个问题的最聪明的方法;因为您正在为每个按钮创建一个全新的匿名类,只是为了存储它们之间不同的小值。这些可以在有限的设备上快速加起来。一个更好的主意是将 currentRect 的值存储为每个按钮的标签。这样,您可以在外部类中声明匿名类的单个实例并将其重用于所有按钮。

于 2012-12-18T00:34:09.000 回答