【发布时间】:2020-09-10 01:02:24
【问题描述】:
在下面的 SSCCE 中,我有一个带有已注册 KeyListener 的 JTextField。 KeyRelease 函数,如果键是 ENTER,将显示一个 JOptionPane。
问题是:如果用户使用 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函数打开JOptionPane 会怎样?另外,我没有看到你自己消费关键事件。
标签: java swing jtextfield joptionpane