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()中的事件,也不可能将其捕获为普通事件