我观察到以下行为:
向JComboBox添加一个新的KeyListener并调用e.consume()会阻止Default 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,它负责所有滚动 - Stuff首先被执行,所以e.consume()不应该阻止它工作。顺便说一句,调用e.consume()
是唯一停止滚动机制的方法!即使调用cb.removeKeyListener(cb.getKeyListeners()[0]);
不也不会停止滚动机制的工作(在我看来,这似乎非常奇怪!)。
任何帮助表示赞赏!
答案 0 :(得分:1)
我希望,默认的KeyListener,负责所有滚动 - Stuff首先被执行,
实际上,事件触发的顺序没有定义,您永远不应该假定特定的顺序进行编码。实际上,当前的默认实现会调用最后添加的最后一个侦听器。
甚至调用cb.removeKeyListener(cb.getKeyListeners()[0]);并没有阻止滚动机制的工作(在我看来,这似乎很奇怪!)。
Swing旨在使用Key Bindings。通过映射到Down键的默认Action启用滚动。您可以通过查看Key Binding Defaults
来查看所有默认映射调用e.consume()是停止滚动机制的唯一方法!
您可以使用以下方法禁用向下箭头的默认Key Binding
:
InputMap im = comboBox.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
im.put(KeyStroke.getKeyStroke("DOWN"), "none");