【问题标题】:What listener should I use for a JTextField in a typing game?在打字游戏中,我应该为 JTextField 使用什么侦听器?
【发布时间】:2011-05-14 18:16:20
【问题描述】:

这是我的情况: 我正在开发一个 java 打字游戏,我需要为我的 JTextField 找到最好的监听器。

JTextField typeBox;

侦听器应该能够检测到用户的输入,将框内的文本发送到游戏主部分进行处理,如果到达单词的结尾,则类型框必须清除(因此用户可以一次输入一个单词,就像在通常的打字游戏中一样)。 我试过 KeyListener

    public class TypeBoxListener implements KeyListener
    {
        @Override
        public void keyPressed(KeyEvent arg0) {
        }

        @Override
        public void keyReleased(KeyEvent arg0) {
            if (arg0.getKeyChar() == arg0.CHAR_UNDEFINED) return;
            String typedText = typeBox.getText();
            thisGUI.processUserInput(typedText);
        }

        @Override
        public void keyTyped(KeyEvent arg0) {
        }   
    }

这样的问题是,当用户在没有释放键的情况下到达一个单词的结尾,并立即键入另一个键,这个新键就丢失了。

我也试过 DocumentListener

public class TypeBoxListener implements DocumentListener
{
    @Override
    public void changedUpdate(DocumentEvent arg0) {
    }

    @Override
    public void insertUpdate(DocumentEvent arg0) {
        String typedText = paragraphPanel.typeBox.getText();
        thisGUI.processUserInput(typedText);
    }

    @Override
    public void removeUpdate(DocumentEvent arg0) {
        String typedText = paragraphPanel.typeBox.getText();
        thisGUI.processUserInput(typedText);
    }
}

此方法比使用 keyReleased 响应更快,但是,我无法使用此方法清除文本框,因为我会在尝试修改 DocumentListener 中的文档时遇到 IllegalStateException。

【问题讨论】:

    标签: java events listener jtextfield


    【解决方案1】:

    您可以尝试将您的文本框清除代码定义为Runnable,并通过SwingUtilities.html.invokeLater 执行它以绕过IllegalStateException

    【讨论】:

    • 感谢您的回答。我会尝试研究您的建议。
    最近更新 更多