提问者:小点点

JTextField和DefaultButton关于ENTER键消费


在SSCCE下面,我有一个带有注册KeyListener的JTextField。如果密钥为ENTER,KeyRelease函数将显示一个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();
            }
        });
    }
}

共1个答案

匿名用户

发生这种情况是因为对话框在keyP“”时关闭,但您在keyRele“”时打开对话框。让我们通过一个例子看看它是如何运行的:

  1. 在文本字段上按Enter,什么都不会发生。
  2. 您释放输入,弹出对话框。
  3. Enter,对话框关闭,文本字段获得焦点。
  4. 您释放Enter,(因为您按下它以关闭对话框),然后再次弹出对话框。

我建议您使用以下解决方案,当涉及到EnterJTextField时:

tf.addActionListener(e -> {
    JOptionPane.showMessageDialog(f, "Invalid input value, Press ENTER");
});

自己检查一下,你会发现它表现得很完美。

现在,如果你想使用你的键侦听器,为了安全地实现它,需要更多的努力。也许一个识别输入时间的焦点侦听器一开始没有在文本字段中按下(它在对话框中被按下,但在文本字段中被释放)。

我想还有其他解决方法,但我建议您使用动作侦听器。