我在网上搜索,没有找到关于在Java KeyEvent处理中经常使用的e.consume()的清晰解释。就像下面的代码一样。
public void keyTyped( KeyEvent e ) {
char c = e.getKeyChar();
if ( c != KeyEvent.CHAR_UNDEFINED ) {
s = s + c;
repaint();
e.consume();
}
}
我在网上搜索,没有找到关于在Java KeyEvent处理中经常使用的e.consume()的清晰解释。就像下面的代码一样。
public void keyTyped( KeyEvent e ) {
char c = e.getKeyChar();
if ( c != KeyEvent.CHAR_UNDEFINED ) {
s = s + c;
repaint();
e.consume();
}
}
Consume函数负责在发生特定类型事件时不处理KeyListeners代码。例如:如果我想创建一个Java中的textfield
,使其只在按数字键时响应,那么我可以使用consume方法来消费(不处理由于未按数字键而引起的按键事件)此类事件。
event.isConsumed()
是否要跳过它。 - Emmanuel Bourg当事件被消耗时,事件源(例如在键入按键时具有焦点的JTextField)将忽略该事件。
如果您查看JComponent
类的processKeyEvent
方法:
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,如果侦听器消耗了键入事件,则该字段不会更新(但消耗按下事件将没有影响)。
请注意,鼠标事件的行为不同,由侦听器消耗的事件仍然会被组件处理。
event.isConsumed()
来决定是否应处理该事件。请注意,侦听器实际上按照它们声明的顺序被调用。 - Emmanuel Bourgjava.awt.Component
只有一个键监听器,addKeyListener
调用AWTEventMulticaster.add(currentListener, addedListener)
添加新的监听器。创建的组合监听器先调用旧的监听器,再调用新增加的监听器,因此监听器按照注册的顺序通知。 - Emmanuel BourgEventListenerList
实际上并不以相反顺序存储侦听器,组件只是以相反顺序遍历列表。 - Emmanuel BourgEventListenerList
以相反的顺序“存储”它们,我只是说它以相反的顺序“排序”它们——内部机制应该在很大程度上是实现细节,对于调用者来说,重要的是它看起来是什么样子。在我的回答中,我从未提到“内部”机制或KeyEvent
或KeyListener
,而是做了一个“抽象”的观察。因为,正如我们所看到的,在API中有多个事件分派工作流程。 - MadProgrammer