Проблемы фокуса с JDK7 и собственными компонентами

У нас есть приложение Swing, которое встраивает компонент IE ocx через JNIWrapper.

После перехода с jdk6 на jdk7 мы начинаем замечать проблемы с фокусировкой. Когда встроенный IE показывает веб-страницу с текстовыми полями (, например. на странице поиска Google ), после чего начинаются проблемы:

Браузер «ловит» фокус, поэтому вы можете начать печатать в текстовом поле поиска. Каждый введенный ключ попадает в IE ocx. Но свинг, кажется, игнорирует это изменение фокуса. Даже если я изменю фокус на текстовое поле качания (, а качание покажет мигающий курсор ввода ),все набранные ключи отправляются в IE ocx

Единственный способ «зафиксировать» фокус — деактивировать и активировать основной фрейм. после этого фокус кажется постоянным. Но если я снова нажму в текстовом поле поиска Google, фокус снова сломается.

Кажется, в 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");
}

6
задан Oleksandra Varavina 18 January 2016 в 18:26
поделиться