使用JTextField时,无法在内部类错误中引用非final变量

时间:2013-03-31 21:55:01

标签: java swing variables compiler-errors jtextfield

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

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

不能在不同方法

中定义的内部类中引用非final变量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();
    ...


}
}

3 个答案:

答案 0 :(得分:5)

回答你的问题:

final JTextField inputField = new JTextField();

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

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

答案 1 :(得分:0)

我认为你试图访问除声明之外的类或方法之外的变量“userInput”,除非前缀为关键字“final”,否则不能这样做,以便扩展变量的范围。 例如。 final String userInput;

答案 2 :(得分:0)

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