我观察到以下行为:
向 JComboBox 添加新的 KeyListener 并调用 e.consume() 会阻止默认 KeyListener 触发其事件。
这是我的示例代码:
final JComboBox cb = new JComboBox(fooList);
final KeyListener fooKeyListener = new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
System.out.println("VK_DOWN fired");
e.consume();
}
}
};
cb.addKeyListener(fooKeyListener);
contentPanel.add(cb);
在此之后,当我按下向下箭头按钮时,我只会输出"VK_DOWN触发",并且整个滚动/选择机制停止工作。
我希望默认的KeyListener负责所有滚动的东西首先被执行,所以e.consume()不应该阻止它工作。顺便说一下,调用e.consume()
是停止滚动机制的唯一方法!即使调用cb.removeKeyListener(cb.getKeyListeners()[0]);
也不会阻止滚动机制工作(在我看来,这似乎很奇怪!
任何帮助表示赞赏!
我希望默认的KeyListener,它负责所有滚动的东西首先被执行,
实际上,事件触发的顺序没有定义,你永远不应该假设特定的顺序进行编码。实际上,当前的默认实现调用首先添加的最后一个侦听器。
即使调用cb.removeKeyListener(cb.getKeyListeners()[0]);也不会阻止滚动机制工作(在我看来,这似乎很奇怪!)。
Swing被设计为使用键绑定。滚动由映射到向下键的默认操作启用。可以通过查看键绑定默认值来查看所有默认映射
调用 e.consume() 是停止滚动机制的唯一方法!
您可以使用以下方法禁用向下箭头的默认Key Binding
:
InputMap im = comboBox.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
im.put(KeyStroke.getKeyStroke("DOWN"), "none");