JTextField 的动作侦听器在第一个 "use" 之后失败

Action Listener for a JTextField fails after first "use"

我正在尝试创建一个小程序,您必须在看到匹配的字谜时猜测单词。我的代码是这样的:

        JFrame frame = generateJFrame(BACKGROUND, FOREGROUND);
        JLabel display = generateDisplay(BACKGROUND, FOREGROUND);

        Pair now = woerter.shuffle();
        display.setText(now.getAnagram());

        JTextField input = generateInputBox(BACKGROUND, FOREGROUND);
        ActionListener action = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nextWord(now, woerter, display, input);
            }
        };

        input.addActionListener(action);
[...] 
        private static void nextWord(Pair now, Woerter woerter, JLabel display, JTextField input) {
            if (now.getRealWord().equalsIgnoreCase(input.getText())) {
            now = woerter.shuffle();
            display.setText(now.getAnagram());
            input.setText("");
            }
        }

现在,当我执行它时,它第一次工作(当您输入正确的单词并按回车键时,会显示一个新的字谜并且输入字段会被清除),但之后它会中断并且回车不再执行任何操作. 我究竟做错了什么?任何帮助将不胜感激。

Pair now = woerter.shuffle();

您正在将 "now" 定义为局部变量。

now = woerter.shuffle();

但是你在你的nextWord(…)方法中也引用了它,这表明你也将它定义为静态变量。

不要定义变量两次。去掉局部变量:

//Pair now = woerter.shuffle();
now = woerter.shuffle();

此外,将方法和变量定义为静态表示设计不佳。您的 nextWor() 方法不应该是静态的,因此 "now" 变量不需要是静态的。

阅读 How to Use Text Fields 上的 Swing 教程部分。 TextDemo 代码将向您展示如何更好地构建代码,以便文本字段的 ActionListener 可以访问文本字段和 class 中的其余数据。

所以下载工作演示代码并修改它以满足您的要求。