Java 当遍历键被禁用时,如何将焦点转移到自定义组件?
我已经创建了一个自定义的Java 当遍历键被禁用时,如何将焦点转移到自定义组件?,java,swing,focus,jcombobox,key-bindings,Java,Swing,Focus,Jcombobox,Key Bindings,我已经创建了一个自定义的JComboBox,它带有一个自定义弹出窗口,实现了keylister。我希望在按下选项卡或输入时从cmbBox的弹出窗口中选择一个项目,因此我为组合框和弹出窗口设置了setFocusTraversalKeysEnabled(false) 这种方法的问题是,当我在容器中使用组合框时,现在我必须在组合框中添加另一个keylister,以便转移焦点 我可以在自定义JComponent中触发一个转移焦点事件(假设)或类似事件,它将转移其父组件中的焦点,这样我就不必在使用它的任何
JComboBox
,它带有一个自定义弹出窗口,实现了keylister
。我希望在按下选项卡
或输入
时从cmbBox的弹出窗口中选择一个项目,因此我为组合框和弹出窗口设置了setFocusTraversalKeysEnabled(false)
这种方法的问题是,当我在容器中使用组合框时,现在我必须在组合框中添加另一个keylister
,以便转移焦点
我可以在自定义JComponent中触发一个转移焦点事件(假设)或类似事件,它将转移其父组件中的焦点,这样我就不必在使用它的任何地方添加关键侦听器。我使用了transferFocus()
,但它没有转移焦点
我还没有弄脏我的手,但是否有一个键绑定来转移焦点
谢谢
我正在尝试重新创建一个sscce,但事实证明很难。请注意。基本侦听器生命周期即将添加所需的侦听器(如果确实需要),并删除无用的侦听器
- 我建议使用键绑定,因为此侦听器是为Swing JComponents指定的,并且您可以(确保与KeyListener相同)将此侦听器添加到具体的JComponent或其派生项中
- 您可以将侦听器添加到firePopupMenuWillBecomeVisible上的派生弹出窗口
- 您可以将ItemListener添加到派生JList
- 也许这不是正确的方法,但要保护所有人,只有焦点所有者才能从键盘获取事件,确保键绑定操作系统的解决方法更加可设置和舒适
注意谢谢。项目符号2和3是我代码的一部分,我正在尝试转换到键绑定。诀窍是在组合框键侦听器中,我必须将
transferFocus()
替换为((JComponent)e.getSource()).transferFocus()
。调试时,我发现源代码是combobox编辑器,而不是假定的combobox。但我不明白为什么焦点没有提前转移。焦点和FocusSubsystem是非常异步的,因为它们来自本机操作系统,在大多数情况下都不可能(可能是您的问题,多个侦听器向EDT触发事件)管理封装到invokeLater()中的事件,也不可能将其捕获为普通事件