Konzentrieren Sie sich auf Probleme mit JDK7 und nativen Komponenten

Wir haben eine Swing-Anwendung, die eine IE-ocx-Komponente über JNIWrapper einbettet.

Nach dem Wechsel von jdk6 zu jdk7 bemerken wir Fokusprobleme. Wenn der eingebettete IE eine Webseite mit Textfeldern anzeigt (z. B. die Google-Suchseite), beginnt der Fehler:

Der Browser "fängt" den Fokus, so dass Sie beginnen können, in das Suchtextfeld zu tippen. Jeder eingegebene Schlüssel geht an den IE ocx. Aber Swing scheint diesen Fokuswechsel zu ignorieren. Auch wenn ich den Fokus in ein Swing-Textfeld ändere (und Swing den blinkenden Eingabecursor anzeigt), werden alle eingegebenen Tasten an den IE-OCX gesendet

Die einzige Möglichkeit, den Fokus zu fixieren, besteht darin, den Hauptrahmen zu deaktivieren und zu aktivieren. danach scheint der Fokus konsequent zu sein. Aber wenn ich erneut in das Google-Suchtextfeld klicke, wird der Fokus wieder unterbrochen.

Es scheint, dass es in jdk7 eine große Änderung beim Fokus-Handling gibt. Von demVerknüpfung:

Auf der Windows-Plattform wurde ein Konzept des „synthetischen Fokus“ implementiert. Dies bedeutet, dass eine Fokuseignerkomponente nur ihren fokussierbaren Status emuliert, während der echte native Fokus auf eine „Fokus-Proxy“ -Komponente festgelegt ist. Diese Komponente empfängt native Nachrichten zu Schlüsseln und Eingabemethoden und sendet sie an einen Fokusbesitzer. Vor JDK7 war eine Fokus-Proxy-Komponente eine dedizierte versteckte untergeordnete Komponente in einem Frame / Dialogfeld. In JDK7 dient ein Frame / Dialog selbst als Fokus-Proxy. Jetzt konzentrieren sich die Proxies nicht nur auf Komponenten in einem eigenen Fenster, sondern auch auf alle untergeordneten Komponenten. Ein einfaches Fenster erhält niemals den nativen Fokus und verlässt sich auf den Fokus-Proxy seines Besitzers. Dieser Mechanismus ist für einen Benutzer transparent, sollte jedoch beim Debuggen berücksichtigt werden.

Hat jemand eine Idee, das Verhalten zu "korrigieren"?

BEARBEITEN: Hier ein Code, mit dem das Problem reproduziert werden kannJxBrowser

<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>

Antworten auf die Frage(4)

Ihre Antwort auf die Frage