【问题标题】:How to transfer focus a custom component when traversal keys are disabled?禁用遍历键时如何转移自定义组件的焦点?
【发布时间】:2012-04-11 20:46:59
【问题描述】:

我创建了一个自定义JComboBox,其中包含一个实现KeyListener 的自定义弹出窗口。我希望在按下 TabEnter 时从 cmbBox 的弹出窗口中选择一个项目,因此我为组合框和弹出窗口设置了 setFocusTraversalKeysEnabled(false)

这种方法的问题是,现在我在容器中使用它时必须在组合框中添加另一个KeyListener,以便转移焦点。

我可以在我的自定义 JComponent 中触发转移焦点事件(假设)或类似的东西,它将转移其父组件中的焦点,这样我就不必在我使用它的任何地方添加关键侦听器。我使用了transferFocus(),但它没有转移焦点。

我还没有在Key Bindings上弄脏我的手,但是有没有一个键绑定来转移焦点?

谢谢

我正在尝试重新创建一个 sscce,但事实证明这很困难。请多多包涵。

【问题讨论】:

    标签: java swing focus jcombobox key-bindings


    【解决方案1】:

    Basic Listeners 生命周期即将添加需要的监听器,如果真的需要,则删除监听器,如果没有用处

    • 我会建议使用 KeyBindings,因为此侦听器是为 Swing JComponents 指定的,并且确保您可以(肯定与 KeyListener 相同)将此侦听器添加到具体的 JComponent 或其派生类

    • 您可以将 Listener 添加到 firePopupMenuWillBecomeVisible 上的派生弹出窗口

    • 您可以将 ItemListener 添加到派生的 JList 中

    • 可能方法不正确,但要保护所有 defects implemented to the KeyListener,只有焦点所有者才能从键盘获取事件,确保 KeyBindings os 的解决方法更加可设置和舒适

    通知please read this answer

    【讨论】:

    • 谢谢。项目符号 2 和 3 是我的代码的一部分,我正在尝试转向键绑定。诀窍是在组合框 keylistener 中,我必须将 transferFocus() 替换为 ((JComponent)e.getSource()).transferFocus()。在调试时,我发现源是组合框编辑器,而不是假定的组合框。但我不明白为什么焦点没有早点转移。
    • Focus 和 FocusSubsystem 是相当异步的,因为来自本机操作系统,在大多数情况下是不可能的(也许你的问题是多个侦听器向 EDT 触发事件)管理包装到 invokeLater() , 也不能把它当作普通事件来理解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多