e.consume()在java中做了什么

时间:2012-09-23 07:30:28

标签: java

我在网上搜索并没有得到关于e.consume()的使用的明确解释,e.consume()常用于java KeyEvent Handle.Like遵循以下代码。

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

5 个答案:

答案 0 :(得分:6)

来自JavaDocs

  

使用此事件,以便在默认情况下不会处理它   源于它的来源的方式。

基本上它意味着你不希望将事件发送给任何其他事件监听器。

如果我没记错的话,事件会以后进先出的方式发送

答案 1 :(得分:2)

这是AWTEvent类的方法。它用于消耗this事件(如果可以使用它)。

您是否检查了AWTEvent.consume()

此外,请查看How Does consume() Work?有关确切消费的解释。

答案 2 :(得分:2)

查看documentationKeyEvent继承InputEvent类的consume方法。使用消费方法会消耗此事件,因此将不会以默认方式处理来源

答案 3 :(得分:2)

Consume函数负责在某些特定类型的事件发生期间不处理KeyListeners代码。例如:如果我想在java中创建一个textfield,它只会在按下数字时响应,那么我可以使用consume方法来消耗(不处理由于按下而导致的键事件数字)此类事件。

答案 4 :(得分: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,如果侦听器使用了键类型事件,则该字段不会更新(但使用键按下事件将无效)。

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