我在网上搜索并没有得到关于在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();
}
}
我在网上搜索并没有得到关于在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();
}
}
消费函数负责KeyListeners
在某些特定类型的事件发生期间不处理代码。例如:如果我想textfield
在java中制作一个它只在按下数字时响应,那么我可以使用consume方法来消费(不处理不是由于按下数字而引起的keyevents)这样的事件。
查看文档:InputEvent类的KeyEvent
继承consume
方法。consume 方法使用此事件,以便它不会由发起它的源以默认方式处理。
它是AWTEvent
类的一种方法。它用于消费this
事件,如果它可以被消费的话。
你检查了AWTEvent.consume()
吗?
此外,看看consume() 是如何工作的?用于解释究竟消费是做什么的。
当事件被消费时,事件源(例如在键入键时具有焦点的 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,如果侦听器使用了键类型事件,则不会更新该字段(但使用键按下事件将没有效果)。
请注意,鼠标事件的行为不同,其中一个侦听器使用的事件仍由组件处理。