Problemas de enfoque con JDK7 y componentes nativos
Tenemos una aplicación swing que integra un componente IE ocx a través de JNIWrapper.
Después de cambiar de jdk6 a jdk7, comenzamos a notar problemas de enfoque. Cuando el IE incrustado muestra una página web con campos de texto (por ejemplo, la página de búsqueda de Google) que comienza el problema:
El navegador "capta" el foco, por lo que u puede comenzar a escribir en el campo de búsqueda de texto. Cada tecla tecleada va al IE ocx. Pero el swing parece ignorar este cambio de enfoque. Incluso si cambio el enfoque a un campo de texto de swing (y swing muestra el cursor de entrada parpadeante), todas las teclas escritas van al IE ocx
La única forma de "arreglar" el enfoque es desactivar y activar el marco principal. después de eso el enfoque parece ser consistente. Pero si vuelvo a hacer clic en el campo de texto de búsqueda de Google, el enfoque se rompe de nuevo.
Parece que hay un gran cambio para enfocar el manejo en jdk7. Desde elenlazar:
En la plataforma Windows, se ha implementado un concepto de "enfoque sintético". Significa que un componente de propietario de foco solo emula su estado enfocable, mientras que el enfoque nativo real se establece en un componente de "proxy de enfoque". Este componente recibe mensajes nativos de clave y método de entrada y los envía a un propietario de enfoque. Antes de JDK7, un componente proxy de enfoque era un componente secundario oculto dedicado dentro de un cuadro / cuadro de diálogo. En JDK7, un cuadro / diálogo sirve como un proxy de enfoque. Ahora, los proxies se centran no solo en los componentes de una ventana propia, sino también en todos los componentes secundarios. Una ventana simple nunca recibe el enfoque nativo y se basa en el proxy de enfoque de su propietario. Este mecanismo es transparente para un usuario, pero debe tenerse en cuenta al realizar la depuración.
¿Alguien tiene una idea para 'arreglar' el comportamiento?
EDITAR: Aquí un código para reproducir el problema conJxBrowser
<code> 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"); } </code>