Problemy z ostrością w JDK7 i komponentach natywnych

Mamy aplikację swing, która osadza komponent IE ocx za pośrednictwem JNIWrapper.

Po zmianie z jdk6 na jdk7 zaczynamy zauważać problemy z ogniskowaniem. Gdy wbudowany Internet Explorer wyświetla stronę internetową z polami tekstowymi (np. Stroną wyszukiwania google), zaczyna się problem:

Przeglądarka „przechwytuje” fokus, więc możesz rozpocząć wpisywanie w polu tekstowym wyszukiwania. Każdy wpisany klawisz przechodzi do IE ocx. Ale swing wydaje się ignorować zmianę ostrości. Nawet jeśli zmienię fokus na pole tekstowe huśtawka (i swing pokazuje migający kursor wejściowy), wszystkie wpisane klawisze przechodzą do IE ocx

Jedynym sposobem „naprawy” jest skupienie się na deacitvate i aktywacji głównej ramki. po tym fokus wydaje się być spójny. Ale jeśli ponownie kliknę w polu tekstowym wyszukiwania Google, fokus zostanie ponownie przerwany.

Wygląda na to, że w jdk7 istnieje duża zmiana w obsłudze fokusa. Odpołączyć:

Na platformie Windows wdrożono koncepcję „syntetycznego fokusa”. Oznacza to, że komponent właściciela fokusa emuluje tylko jego stan skupienia, podczas gdy rzeczywisty fokus natywny jest ustawiony na komponent „proxy proxy”. Ten komponent odbiera wiadomości rodzime metody klucza i metody wprowadzania danych i wysyła je do właściciela fokusa. Przed JDK7 komponent proxy proxy był dedykowanym ukrytym komponentem podrzędnym wewnątrz ramki / okna dialogowego. W JDK7 sama ramka / okno dialogowe służy jako proxy fokus. Teraz serwery proxy koncentrują się nie tylko na komponentach w posiadanym oknie, ale także na wszystkich komponentach potomnych. Proste okno nigdy nie otrzymuje natywnego fokusa i opiera się na fokusie proxy swojego właściciela. Ten mechanizm jest przejrzysty dla użytkownika, ale powinien być brany pod uwagę podczas debugowania.

Każdy ma pomysł, aby „naprawić” zachowanie?

EDYTOWAĆ: Oto kod do odtworzenia problemuJxBrowser

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

questionAnswers(4)

yourAnswerToTheQuestion