在SSCCE bellow中,我有一个JTextField,有一个注册的KeyListener.KeyRelease功能,如果按键是ENTER,就会显示一个JOptionPane.问题是:如果用户使用ENTER键验证JOptionPane,就会再次出现选项面板!似乎ENTER键没有被消耗并转发到JTextField。
问题是:如果用户使用ENTER键验证JOptionPane,选项窗格将再次出现!似乎ENTER键没有被消耗并转发到JTextField。
有什么线索吗?
import java.awt.EventQueue;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class DefaultButtonAndTextFieldKeypress {
private static void createGUI() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JTextField tf = new JTextField("Press ENTER");
tf.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("TextField::keyReleased");
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
JOptionPane.showMessageDialog(f, "Invalid input value, Press ENTER");
}
}
@Override
public void keyPressed(KeyEvent e) {}
});
f.add(tf);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createGUI();
}
});
}
}
这是因为当对话框关闭时 keyPressed
但你打开对话框时 keyReleased
. 让我们通过一个例子来看看它是如何运行的。
我建议你用以下方法解决,当涉及到 进入 挤进 JTextField
:
tf.addActionListener(e -> {
JOptionPane.showMessageDialog(f, "Invalid input value, Press ENTER");
});
自己检查一下,你会发现它表现得很完美。
现在,如果你想使用你的按键监听器,需要付出更多的努力才能安全实现。也许需要一个焦点监听器,它可以识别在文本字段中没有按下回车键的情况(在对话框中按下了回车键,但在文本字段中被释放)。
我想也有其他的变通方法,但我建议你使用动作监听器。