6

我们有一个 Swing 应用程序,它通过 JNIWrapper 嵌入了一个 IE ocx 组件。

从 jdk6 切换到 jdk7 后,我们开始注意到焦点问题。当嵌入式 IE 显示带有文本字段的网页(例如 google 搜索页面)时,麻烦就开始了:

浏览器“抓住”焦点,因此您可以开始在搜索文本字段中输入内容。键入的每个键都会进入 IE ocx。但是swing似乎忽略了这个焦点变化。即使我将焦点更改为摇摆文本字段(并且摇摆显示闪烁的输入光标),所有键入的键都会转到 IE ocx

“修复”焦点的唯一方法是停用并激活主框架。之后,焦点似乎是一致的。但是如果我再次点击谷歌搜索文本字段,焦点又会被打破。

jdk7中的焦点处理似乎有很大的变化。从链接

在 Windows 平台上,实现了“综合焦点”的概念。这意味着焦点所有者组件仅模拟其可聚焦状态,而真正的本机焦点设置为“焦点代理”组件。该组件接收键和输入法本机消息并将它们分派给焦点所有者。在 JDK7 之前,焦点代理组件是框架/对话框内的专用隐藏子组件。在 JDK7 中,框架/对话框本身充当焦点代理。现在它代理的焦点不仅是拥有窗口中的组件,还包括所有子组件。一个简单的窗口从不接收本机焦点并依赖于其所有者的焦点代理。这种机制对用户来说是透明的,但在调试时应该考虑到这一点。

任何人都有“修复”行为的想法?

编辑:这里有一些代码可以重现JxBrowser的问题

    public static void main(String[] args) {
    Browser browser = BrowserFactory.createBrowser(BrowserType.IE);

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(browser.getComponent(), BorderLayout.CENTER);

    JPanel panel = new JPanel();
    frame.getContentPane().add(panel, BorderLayout.NORTH);

    textField = new JTextField();
    panel.add(textField);
    textField.setColumns(10);
    frame.setSize(700, 500);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    browser.navigate("http://www.google.com");
}
4

4 回答 4

3

全部 - 我们刚刚在另一个浏览器组件(DjProject Native Swing)中遇到了这个问题。在 Java 1.6 下一切正常,但在 Java-7 下,我们开始看到奇怪的问题,您可以在输入框中输入内容,但如果您向后选择以修复错字,则在单击鼠标后无法输入。要恢复,您必须从输入字段中选择,然后返回以继续编辑。

请参阅http://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-Desktop/html/awt.html#gdcqp 特别是这里关于合成焦点和焦点代理的部分。

无论如何,长话短说 - 在我们的例子中,我能够通过将鼠标侦听器附加到 JWebBrowser.getNativeComponent() 来找到解决方法。然后在 mousePressed 上执行 browser.requestFocus() 后跟 browser.getNativeComponent().requestFocusInWindow();

希望这可以帮助遇到此问题的其他人。

于 2012-12-18T18:54:59.497 回答
0

我终于找到了一个可行的解决方法。在找出造成这种情况的原因时,注意到单击另一个组件(即 JLabel)并单击返回文本字段工作正常。所以我使用 AWT Robot 类复制了这种行为。请参阅在代码中复制鼠标行为中的更多详细信息。

于 2013-05-30T18:01:35.680 回答
0

尝试查看FocusListenerWindowFocusListener以实现 Swing 组件本身或 JFrame 的侦听器。每当对其进行调用时focusLost(..),您都可以requestFocus()在 Window 或 Component 上使用来强制焦点返回。

于 2012-04-19T22:21:18.890 回答
0

试试 Java 1.7 的最新 jdk。它对我有用。早些时候,我无法在文本字段中输入任何内容。升级后,我没有遇到这个问题。

http://bugs.sun.com/view_bug.do?bug_id=8018672

于 2013-12-26T04:43:34.067 回答