重点关注JDK7和本机组件的问题

时间:2012-04-19 14:14:36

标签: java swing java-native-interface java-7 jxbrowser

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

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

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

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

似乎jdk7中的焦点处理有很大的变化。来自link

  

在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 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

尝试查看FocusListenerWindowFocusListener以实现Swing组件本身或JFrame的侦听器。每当调用focusLost(..)时,您可以使用窗口或组件上的requestFocus()强制重点返回。

答案 2 :(得分:0)

我终于找到了一个有效的解决方法。在找出造成这种情况的原因时,注意到点击另一个组件(即JLabel)并单击文本字段后工作正常。所以我使用AWT Robot类复制了这种行为。请参阅Replicating Mouse behavior in Code中的详细信息。

答案 3 :(得分:0)

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

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