JNIWrapper を介して IE ocx コンポーネントを埋め込むスイング アプリケーションがあります。
jdk6 から jdk7 に切り替えた後、フォーカスの問題に気付き始めました。埋め込まれた IE がテキスト フィールドのある Web ページ (Google 検索ページなど) を表示すると、問題が発生します。
ブラウザがフォーカスを「キャッチ」するので、検索テキスト フィールドに入力を開始できます。入力されたすべてのキーは IE ocx に送られます。しかし、swing はこのフォーカスの変更を無視しているようです。フォーカスをスイング テキスト フィールドに変更しても (スイングで入力カーソルが点滅している場合)、入力したすべてのキーは IE ocx に移動します。
フォーカスを「修正」する唯一の方法は、メイン フレームを非アクティブにしてアクティブにすることです。その後、焦点は一貫しているようです。しかし、Google 検索のテキスト フィールドをもう一度クリックすると、フォーカスが再び壊れてしまいます。
jdk7ではフォーカスの扱いに大きな変更があるようです。リンクから:
Windows プラットフォームでは、「シンセティック フォーカス」の概念が実装されています。これは、実際のネイティブ フォーカスが「フォーカス プロキシ」コンポーネントに設定されているのに対し、フォーカス オーナー コンポーネントはフォーカス可能な状態のみをエミュレートすることを意味します。このコンポーネントは、キーと入力メソッドのネイティブ メッセージを受け取り、それらをフォーカス オーナーにディスパッチします。JDK7 より前は、フォーカス プロキシ コンポーネントは、フレーム/ダイアログ内の専用の非表示の子コンポーネントでした。JDK7 では、フレーム/ダイアログ自体がフォーカス プロキシとして機能します。現在は、所有されているウィンドウ内のコンポーネントだけでなく、すべての子コンポーネントに対してもフォーカスをプロキシします。単純なウィンドウはネイティブ フォーカスを受け取ることはなく、その所有者のフォーカス プロキシに依存します。このメカニズムはユーザーに対して透過的ですが、デバッグ時には考慮する必要があります。
誰でも動作を「修正」する考えがありますか?
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");
}