这是我的情况: 我正在开发一个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。
答案 0 :(得分:1)
您可以尝试将文本框清除代码定义为Runnable
并通过SwingUtilities.html.invokeLater
执行,以绕过IllegalStateException
。