JComboBox第二个KeyListener阻止第一个被触发

时间:2015-01-14 16:26:08

标签: java swing jcombobox keylistener

我观察到以下行为:

向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]); 也不会停止滚动机制的工作(在我看来,这似乎非常奇怪!)。

任何帮助表示赞赏!

1 个答案:

答案 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");