【问题标题】:Action Listener for a JTextField fails after first "use"第一次“使用”后 JTextField 的操作侦听器失败
【发布时间】:2020-09-22 12:28:31
【问题描述】:

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

        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("");
            }
        }

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

【问题讨论】:

  • 不再做任何事情 - 定义它。你怎么知道什么都不做?你有一个 if 语句。如果陈述是假的,那么什么都不会发生。所以你需要显示你正在比较的值,看看为什么这个语句是错误的。

标签: java swing actionlistener jtextfield


【解决方案1】:
Pair now = woerter.shuffle();

您将“现在”定义为局部变量。

now = woerter.shuffle();

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

不要定义变量两次。摆脱局部变量:

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

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

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

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

【讨论】:

  • 谢谢。我以这种方式更改了我的类 Woerter,它现在可以返回当前对的值。这让我摆脱了大部分糟糕的代码,现在它可以正常工作了。
猜你喜欢
  • 2011-11-27
  • 2013-03-23
  • 2021-05-23
  • 1970-01-01
  • 2017-12-26
  • 2011-04-26
  • 2011-05-21
相关资源
最近更新 更多