JTextField和DefaultButton关于ENTER键消耗的问题。

问题描述 投票:0回答:1

在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();
            }
        });
    }
}
java swing jtextfield joptionpane
1个回答
1
投票

这是因为当对话框关闭时 keyPressed但你打开对话框时 keyReleased. 让我们通过一个例子来看看它是如何运行的。

  1. 你按 进入在文本字段上,什么都没有发生。
  2. 发布 进入弹出对话框。
  3. 你按 进入对话框关闭,文本字段获得焦点。
  4. 您释放 进入(因为你按了它来关闭对话框),对话框又弹了出来。

我建议你用以下方法解决,当涉及到 进入 挤进 JTextField:

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

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

现在,如果你想使用你的按键监听器,需要付出更多的努力才能安全实现。也许需要一个焦点监听器,它可以识别在文本字段中没有按下回车键的情况(在对话框中按下了回车键,但在文本字段中被释放)。

我想也有其他的变通方法,但我建议你使用动作监听器。

© www.soinside.com 2019 - 2024. All rights reserved.