Java 如何使嵌套Swing面板中的按钮变深;键盘焦点;?

Java 如何使嵌套Swing面板中的按钮变深;键盘焦点;?,java,swing,events,focus,Java,Swing,Events,Focus,我有一个摆动框架,其中包含嵌入面板,包含其他面板等。 在内心深处,有一个按钮。我希望按钮获得焦点,以便按下“回车”键将生成actionPerformed事件 但是,如果我使用myButton.requestFocus()或myButton.requestFocusInWindow(),整个窗口都会获得焦点,但在键盘方面似乎什么也没有发生 我显然遗漏了一些关于焦点子系统的东西 更新2:我在ActionListener之外显式添加了一个KeyListener,现在它可以工作了。这真的很奇怪,因为我认

我有一个摆动框架,其中包含嵌入面板,包含其他面板等。 在内心深处,有一个按钮。我希望按钮获得焦点,以便按下“回车”键将生成actionPerformed事件

但是,如果我使用myButton.requestFocus()或myButton.requestFocusInWindow(),整个窗口都会获得焦点,但在键盘方面似乎什么也没有发生

我显然遗漏了一些关于焦点子系统的东西


更新2:我在ActionListener之外显式添加了一个KeyListener,现在它可以工作了。这真的很奇怪,因为我认为actionListener同时包含按键和鼠标动作。

听起来requestFocus()在某种程度上失败了。尝试测试看看是否有任何父JPanel或其他组件可以请求焦点,然后逐步找出问题所在。

有一种方法可以通过编程指定选项卡的功能(您知道何时按tab键并选择下一个小部件)

默认情况下,它遵循添加组件的方式

使用此自定义机制,您可以选择嵌套按钮作为第一个接收actionperformed事件的按钮


不幸的是,我不记得这个“机制”的名称是什么,但它类似于遍历或焦点遍历。首先,不要使用requestFocus()use。requestFocus有特定于平台的问题,而requestFocusInWindow更为一致

你的实际问题;组件(或其父组件之一)可能不可见,或已渲染为不可聚焦

我想让按钮聚焦,这样 按“回车”键将 生成actionPerformed事件

这是LAF的家属。Enter在窗口中工作,但在金属LAF中不工作。查看更多信息


requestFocusInWindow()方法仅当组件当前在框架上可见时才起作用。没有其他技巧,所以我们只是随机猜测你做错了什么。如果需要进一步的帮助,您需要发布一个演示问题的帖子。

要使enter键正常工作,您可能需要设置默认按钮,而不是键盘焦点:

button.getRootPane().setDefaultButton(button);
如果您确实想要键盘焦点,那么您的问题可能与调用requestFocus的时间有关。有时,如果在组件完全可见之前调用它,则可以忽略它。要修复您可以将requestFocus调用延迟到处理其他事件之后的问题,请执行以下操作:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        button.requestFocus();
    }
});

您可以获取框架的根窗格并更新inputMap和actionMap。请参阅下面的代码

InputMap=getRootPane().getInputMap(JComponent.WHEN_FOCUSED_组件的祖先_); map.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),“ok”)

ActionMap ActionMap=getRootPane().getActionMap()
actionMap.put(“确定”,entreaction)


此处enterAction是一个AbstractAction对象,当用户按Enter键时,将调用其actionPerformed()。

此按钮是否可见(例如,未被子选项卡或类似的东西隐藏)?您是否尝试过requestFocusInWindow()?是的,我尝试了两者。是的,按钮是可见的。它位于选项卡控件内,但选项卡可见。您考虑的是FocusTraversalPolicy: