gpt4 book ai didi

java - JComboBox 第二个 KeyListener 防止第一个被解雇

转载 作者:行者123 更新时间:2023-12-01 12:01:37 25 4
gpt4 key购买 nike

我观察到以下行为:

向 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_DOWNfired”,并且整个滚动/选择机制停止工作。

我希望默认的 KeyListener 负责首先执行所有滚动内容,因此 e.consume() 不应阻止它工作。顺便说一句,调用e.consume()是停止滚动机制的唯一方法!即使调用 cb.removeKeyListener(cb.getKeyListeners()[0]);不会停止滚动机制的工作(在我看来,这似乎很奇怪) !)。

感谢任何帮助!

最佳答案

I would expect, that the default KeyListener, which is responsible for all that scrolling-Stuff gets executed first,

实际上,事件触发的顺序没有定义,您永远不应该假设特定的顺序进行编码。事实上,当前的默认实现调用首先添加的最后一个监听器。

Even calling cb.removeKeyListener(cb.getKeyListeners()[0]); does not stop the Scrolling mechanism from working (which, in my opinion, seems to be very weird!).

Swing 被设计为使用 Key Bindings 。滚动是通过映射到向下键的默认操作启用的。您可以通过查看Key Binding Defaults来查看所有默认映射。

calling e.consume() is the only way to stop the Scrolling mechanism!

您可以使用以下方法禁用向下箭头的默认键绑定(bind):

InputMap im = comboBox.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
im.put(KeyStroke.getKeyStroke("DOWN"), "none");

关于java - JComboBox 第二个 KeyListener 防止第一个被解雇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27947732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com