【问题标题】:Passing a variable into an ActionListener将变量传递给 ActionListener
【发布时间】:2012-12-17 00:18:00
【问题描述】:

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

如何将变量传递给 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 中的位置分配适当的动作侦听器,但是,我似乎无法将存储它们位置的变量传递到actionlistener 本身,所以我被卡住了。我在写这篇文章时意识到我真的应该使用一个 foreach,所以以后会改变它。 (请注意谁会指出这一点)我意识到我不能也使该变量成为最终变量,因为它在 for 循环期间发生了变化。我还尝试将 currentRect ((y * 5) + x) 的值传递给函数,但无济于事。

谢谢,

安德鲁吉斯17

【问题讨论】:

  • 你能从event对象中得到你需要的东西吗?
  • 如错误信息提示,您可以将currentRect声明为final以满足编译器的要求。这是否是一个好的设计完全是另一回事。

标签: java variables for-loop jbutton actionlistener


【解决方案1】:

解决方案很简单,只需在块内声明一个新的 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。这是违反直觉的,因为看起来 final 变量每次都在重新初始化,但实际上,您必须将其视为一个新变量,对于块的每个循环仅初始化一次。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2020-01-24
    • 2012-02-13
    • 2014-09-05
    • 2011-10-13
    • 2013-12-07
    • 2014-04-30
    相关资源
    最近更新 更多