JComboBox 第二个 KeyListener 可防止第一个被触发



我观察到以下行为:

向 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");

相关内容

最新更新