У нас есть приложение Swing, в которое встроен компонент IE ocx через JNIWrapper.
После перехода с jdk6 на jdk7 мы начинаем замечать проблемы с фокусировкой. Когда встроенный IE показывает веб-страницу с текстовыми полями (например, страницу поиска Google), начинаются проблемы:
Браузер «ловит» фокус, поэтому вы можете начать печатать в текстовом поле поиска. Каждый введенный ключ попадает в IE ocx. Но свинг, кажется, игнорирует это изменение фокуса. Даже если я сменю фокус на текстовое поле качания (и качание показывает мигающий курсор ввода), все набранные клавиши переходят в IE ocx
Единственный способ «зафиксировать» фокус — деактивировать и активировать основной кадр. после этого фокус кажется постоянным. Но если я снова нажму в текстовом поле поиска Google, фокус снова сломается.
Кажется, в jdk7 произошли большие изменения в обработке фокуса. По ссылке:
На платформе Windows реализована концепция «синтетического фокуса». Это означает, что компонент-владелец фокуса только эмулирует свое фокусируемое состояние, в то время как реальный собственный фокус устанавливается на компонент «прокси фокуса». Этот компонент получает собственные сообщения ключа и метода ввода и отправляет их владельцу фокуса. До JDK7 прокси-компонент фокуса был выделенным скрытым дочерним компонентом внутри фрейма/диалога. В JDK7 сам кадр/диалог служит прокси-сервером фокуса. Теперь он проксирует фокус не только для компонентов в собственном окне, но и для всех дочерних компонентов. Простое окно никогда не получает собственного фокуса и полагается на прокси фокуса своего владельца. Этот механизм прозрачен для пользователя, но его следует учитывать при отладке.
У кого-нибудь есть идея «исправить» поведение?
EDIT: вот код для воспроизведения проблемы с 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");
}