【发布时间】:2012-07-03 07:22:51
【问题描述】:
我正在使用 Swing 程序并且遇到了一些麻烦。该程序有两个窗口(都是 JFrames)。主窗口很好,应该与这个问题无关。
我遇到问题的窗口包含一个带有 JPanel 的 JScrollPane,并且有一个 JMenuBar。 JPanel 上有一堆 JTextComponents(一些 JTextFields,一些 JTextAreas)。
我想做的是让一个附加到 JMenuItem 的 ActionListener 找到具有焦点的 JTextComponent。
我在focused component reference 和How to find out which object currently has focus 看到过之前的帖子。我的问题是调用特定窗口的getFocusOwner() 方法只会返回JFrame 的JRootPane,这完全没有帮助。根据它们的isFocusable() 方法,所讨论的 JScrollPane 和 JPanel 都是可聚焦的。即使我在单击菜单项之前实际将文本输入到其中一个 JTextComponents 中,也会发生这种情况。当我打开菜单和所有内容时,光标仍然在文本字段中闪烁。对于它的价值,getMostRecentFocusOwner() 也只是返回 JRootPane。
【问题讨论】:
-
不知道你的代码有什么问题,getFocusOwner() 和 getMostRecentFocusOwner() 方法都应该返回相同的组件,没错,JMenuItem 使用来自 ButtonModel 的事件,来自 ActiionListener 的事件正确地返回焦点到Container,为了获得更好的帮助,请尽快发布 SSCCE 证明您对 JMenu(Xxx) 和 ActionListener 的问题,JMenu 和 JMenuItems 也有自己的 Listeners
-
您确定需要此信息吗?通常有不止一种方法可以解决一个整体问题。
-
我想我已经得到了你想要的工作,请看我修改后的帖子
-
“程序有两个窗口(都是JFrames)。”见The Use of Multiple JFrames, Good/Bad Practice?
-
这是一个有趣的观点,也许 JDialog 可以很好地满足我的目的。然而,这个应用程序的特殊设计方式,基本上是抽象的和易于扩展的,由经验丰富的程序员但不一定使用 Java 或 Swing 的人设计,我相信证明这种选择是正确的。 (例如,我可以预见从其他纯命令行会话启动其中一个子窗口的能力。)