Java InputMap/ActionMap的Swing问题

Java InputMap/ActionMap的Swing问题,java,swing,Java,Swing,我希望我的JTextField不仅在按下ENTER键时处理文本, 但当空间被压缩时也是如此。您可以在下面的代码中看到,我关联了通常与ENTER to SPACE关联的操作,但我得到了一些意外行为(请参见下文) 如果我键入“x空格”,将生成ActionEvent,并清除JTextField。 但是,刷新的JTextField 不是请求的“null”字符串,而是“”。上一个操作的空格 已经“泄漏”到刷新的JTextField,这很烦人 我查看了一下swing代码。我的最佳猜测是,ActionEven

我希望我的JTextField不仅在按下ENTER键时处理文本, 但当空间被压缩时也是如此。您可以在下面的代码中看到,我关联了通常与ENTER to SPACE关联的操作,但我得到了一些意外行为(请参见下文)

如果我键入“x空格”,将生成ActionEvent,并清除JTextField。 但是,刷新的JTextField 不是请求的“null”字符串,而是“”。上一个操作的空格 已经“泄漏”到刷新的JTextField,这很烦人

我查看了一下swing代码。我的最佳猜测是,ActionEvent是由某些KeyEvent生成的,KeyEvent.isConsumed()会产生不同的结果,这取决于KeyEvent是ENTER还是空格(ENTER被吞没,但不是空格)


有人知道怎么解决这个问题吗?或者知道一种不同的方法来实现我的目标?

我修改了您的测试用例,以便在键入空格字符时使用一个键侦听器。只需添加以下内容,其余内容保持不变

    textField.addKeyListener(new KeyListener() {
        public void keyTyped(KeyEvent e) {
            if (e.getKeyChar() == ' ') {
                System.out.println("Was a space character");
                e.consume();
            }
        }

        public void keyPressed(KeyEvent e) {
        }

        public void keyReleased(KeyEvent e) {
        }
    });

我认为问题在于ENTER不是文本字段的可显示字符,而空格字符是。如果您在文本区域尝试类似的操作,我猜您也会遇到ENTER键的相同问题。

正在生成多个事件。您的代码正在按下
键的事件中执行。但是,使用空格键也会导致生成
keyTyped
事件。在执行
键后,文本组件将处理此问题,因此
文档将被清除,然后向其添加一个空格

有人知道怎么解决这个问题吗

不要使用
键侦听器

将您的代码添加到EDT的末尾,以便在
文档
用空格更新后执行:

textField.addActionListener(new ActionListener()
{
    @Override
    public void actionPerformed(final ActionEvent evt)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                textField.setText(null);
                System.out.println("event received:[" + evt.getActionCommand() + "]");
            }
        });
    }
});

谢谢使用KeyAdapter而不是KeyListener可以使其变短(无需定义keyPressed和keyReleased).-1尽管在被接受的答案中已经解释了正确的方式,但仍然以错误的方式做事。@BradMace如果你看时间戳,你会发现我在被接受的完全正确的答案之前发布了我的答案。我把这个放在这里是为了让别人看到我的错误。如果我之前不够清楚的话,我完全同意被接受的答案。如果你愿意的话,请继续给我投反对票,但你的声明与我的答案发布时间不符。你可以将所有代码保留在ActionListener中。请参见下文。谢谢,这也是一个很好的解决方案,但我认为KeyListener是一个更干净/更可读的解决方案。@toto,将代码放在一个地方更干净/更可读,更易于维护。此外,一般来说,应该避免使用键盘侦听器。Swing设计为使用键绑定。您试图混合使用绑定和事件侦听器,这更令人困惑。@camickr您能否链接到一些支持文档,以获得有关KeyListeners和KeyBinding的评论?我只是好奇你是从哪里听到这个的。(顺便说一句,我认为这两种解决方案都很好。)@Joshua,没有什么值得一读的。它是编程知识随着时间的积累。一般来说,应该使用更高级别的抽象。Swing比AWT更具发展性,它提供了这些抽象。关于一些基础知识,你可以在上面阅读。解决办法不一样。同时使用ActionListener和KeyListener来完成一项功能是没有意义的。这是一场维护噩梦。同样,经验是你的指南。谢谢你的评论。我从来没有说过解决方案是一样的。现在,请听够了,接着回答下面的问题吧!:)
textField.addActionListener(new ActionListener()
{
    @Override
    public void actionPerformed(final ActionEvent evt)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                textField.setText(null);
                System.out.println("event received:[" + evt.getActionCommand() + "]");
            }
        });
    }
});