13

我在网上搜索并没有得到关于在java KeyEvent Handle中经常使用的e.consume()的使用的明确解释。就像下面的代码一样。

public void keyTyped( KeyEvent e ) {
    char c = e.getKeyChar();
    if ( c != KeyEvent.CHAR_UNDEFINED ) {
        s = s + c; 
        repaint();
        e.consume();
    } 
}
4

5 回答 5

8

来自JavaDocs

使用此事件,以便它不会由发起它的源以默认方式处理。

本质上,这意味着您不希望将事件分派给任何其他事件侦听器或由任何其他事件侦听器处理。

虽然,一般来说,这取决于各个侦听器的实现

于 2012-09-23T07:36:29.153 回答
3

消费函数负责KeyListeners在某些特定类型的事件发生期间不处理代码。例如:如果我想textfield在java中制作一个它只在按下数字时响应,那么我可以使用consume方法来消费(不处理不是由于按下数字而引起的keyevents)这样的事件。

于 2012-09-23T07:36:32.467 回答
3

查看文档InputEvent类的KeyEvent继承consume方法。consume 方法使用此事件,以便它不会由发起它的源以默认方式处理

于 2012-09-23T07:33:26.147 回答
2

它是AWTEvent类的一种方法。它用于消费this事件,如果它可以被消费的话。

你检查了AWTEvent.consume()吗?

此外,看看consume() 是如何工作的?用于解释究竟消费是做什么的。

于 2012-09-23T07:33:08.917 回答
0

当事件被消费时,事件源(例如在键入键时具有焦点的 JTextField)将忽略该事件。

如果你看一下类的processKeyEvent方法JComponent

protected void processKeyEvent(KeyEvent e) {
    boolean result;
    boolean shouldProcessKey;

    // This gives the key event listeners a crack at the event
    super.processKeyEvent(e);

    // give the component itself a crack at the event
    if (! e.isConsumed()) {
        processComponentKeyEvent(e);
    }

您可以看到它super.processKeyEvent(e)首先被调用,这会将事件分派给注册的侦听器component.addKeyListener()。监听器按照它们最初注册的顺序被通知,即使其中一个消费了事件,它们也会被通知。唯一可以阻止事件被其余侦听器处理的是未捕获的异常。

在通知侦听器后,组件本身将处理该事件,但前提是它尚未被其中一个侦听器消费。对于 JTextField,如果侦听器使用了键类型事件,则不会更新该字段(但使用键按下事件将没有效果)。

请注意,鼠标事件的行为不同,其中一个侦听器使用的事件仍由组件处理。

于 2021-06-07T08:18:40.247 回答