【问题标题】:Cannot refer to a non-final variable inside an inner class error when using JTextField使用 JTextField 时无法在内部类错误中引用非最终变量
【发布时间】:2013-03-31 21:55:00
【问题描述】:

我花了几个小时搜索,但我不知道如何解决这个问题。也许我只是完全关闭,但我不断收到错误“无法在以不同方法定义的内部类中引用非最终变量 userInput”。如果有人可以帮助我弄清楚为什么会发生这种情况或如何解决它,那将不胜感激。

我得到 2 个编译错误: 不能在不同方法中定义的内部类中引用非最终变量 userInput

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

编辑:一些澄清,我想保持我的 userInput 变量不是最终的。

这是我的代码,也许有人能看出我做错了什么,我已经省略了所有与此错误无关的代码:

//Import libraries
...
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
...

public class TextGame {
public static void main(String[] args) throws FileNotFoundException {

    ...  
    String userInput = "Input";
    ...

    // Create the window
    JFrame gameWindow = new JFrame("Game");
    gameWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gameWindow.setVisible(true);
    // Centre the window
    gameWindow.setLocationRelativeTo(null);

    ...

    // Add input box to window
    JTextField inputField = new JTextField();
    inputField.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            userInput = inputField.getText(); ****Here is where the error occurs***
        }
    });

    gameWindow.add(inputField, BorderLayout.SOUTH);

    // Size the window to what it contains
    gameWindow.pack();
    ...


}
}

【问题讨论】:

  • userInputmain 的局部变量。它必须是实例或静态(类)成员,Java 才能让您从除main 的上下文之外的任何地方修改它。在这种情况下,您可以将其设置为 TextGame 上的字段(静态或实例,取决于您是否打算拥有该类的实例)。

标签: java swing variables compiler-errors jtextfield


【解决方案1】:

回答你的问题:

final JTextField inputField = new JTextField();

但是,更好的解决方案是从 ActionEvent 访问文本字段:

JTextField textField =  (JTextField)e.getSource();
userInput = textField.getText();

【讨论】:

  • 当我这样做时,我仍然得到变量的错误。即使我将变量更改为 final,我也会收到错误 The final local variable userInput cannot be assigned, because it is defined in an enclosure type
  • 对不起,我没有仔细看你的代码。问题是您正在尝试在 main 方法中构建您的 GUI。相反,您应该创建一个扩展 JPanel 的自定义类。然后您可以定义类级别的变量(如 userInput)。然后您只需将面板添加到 JFrame。查看How to Use Labels 上的 Swing 教程。下载演示并像演示代码一样构建您的程序。
  • 好吧,我希望不要那样做,但似乎我必须这样做。会改变的,谢谢。
【解决方案2】:

我认为您试图在声明它的位置以外的类或方法之外访问变量“userInput”,除非它以关键字“final”为前缀,以便扩展变量的范围,否则您不能这样做。 例如。最终字符串用户输入;

【讨论】:

  • 好的,但我需要变量不是最终的。有什么办法可以解决这个问题,同时仍然让变量不是最终的?
  • 它是您需要最终确定的文本字段,而不是字符串变量。
  • 当我将文本字段设为 final 时,我收到一个错误,即该变量必须是 final 的。
  • 在类中全局声明,则不需要使用final修饰符
【解决方案3】:

您正在创建内部匿名类 ActionListener 的实例。如果此类类使用来自父类的变量,则所有此类变量都应标记为 final。这是因为这些变量被复制到内部类的自动生成的构造函数中。为了避免副本的不协调更改,它们应该是恒定的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多