6

JNIWrapper を介して IE ocx コンポーネントを埋め込むスイング アプリケーションがあります。

jdk6 から jdk7 に切り替えた後、フォーカスの問題に気付き始めました。埋め込まれた IE がテキスト フィールドのある Web ページ (Google 検索ページなど) を表示すると、問題が発生します。

ブラウザがフォーカスを「キャッチ」するので、検索テキスト フィールドに入力を開始できます。入力されたすべてのキーは IE ocx に送られます。しかし、swing はこのフォーカスの変更を無視しているようです。フォーカスをスイング テキスト フィールドに変更しても (スイングで入力カーソルが点滅している場合)、入力したすべてのキーは IE ocx に移動します。

フォーカスを「修正」する唯一の方法は、メイン フレームを非アクティブにしてアクティブにすることです。その後、焦点は一貫しているようです。しかし、Google 検索のテキスト フィールドをもう一度クリックすると、フォーカスが再び壊れてしまいます。

jdk7ではフォーカスの扱いに大きな変更があるようです。リンクから:

Windows プラットフォームでは、「シンセティック フォーカス」の概念が実装されています。これは、実際のネイティブ フォーカスが「フォーカス プロキシ」コンポーネントに設定されているのに対し、フォーカス オーナー コンポーネントはフォーカス可能な状態のみをエミュレートすることを意味します。このコンポーネントは、キーと入力メソッドのネイティブ メッセージを受け取り、それらをフォーカス オーナーにディスパッチします。JDK7 より前は、フォーカス プロキシ コンポーネントは、フレーム/ダイアログ内の専用の非表示の子コンポーネントでした。JDK7 では、フレーム/ダイアログ自体がフォーカス プロキシとして機能します。現在は、所有されているウィンドウ内のコンポーネントだけでなく、すべての子コンポーネントに対してもフォーカスをプロキシします。単純なウィンドウはネイティブ フォーカスを受け取ることはなく、その所有者のフォーカス プロキシに依存します。このメカニズムはユーザーに対して透過的ですが、デバッグ時には考慮する必要があります。

誰でも動作を「修正」する考えがありますか?

EDITJxBrowserで問題を再現するためのコード

    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");
}
4

4 に答える 4

3

すべて-別のブラウザコンポーネント(DjProject Native Swing)でこの問題が発生しました。Java 1.6ではすべて正常に動作しますが、Java-7では、入力ボックスに入力できるという奇妙な問題が発生し始めましたが、タイプミスを修正するために逆方向に選択すると、マウスクリック後に入力できませんでした。回復するには、入力フィールドから選択してから、戻って編集を続行する必要がありました。

http://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-Desktop/html/awt.html#gdcqpを参照してください 。特に、シンセニックフォーカスとフォーカスプロキシに関するここの部分を参照してください。

とにかく長い話を短くするために-私たちの場合、マウスリスナーをJWebBrowser.getNativeComponent()に接続することで回避策を見つけることができました。次に、mousePressedでbrowser.requestFocus()を実行し、続いてbrowser.getNativeComponent()。requestFocusInWindow();を実行します。

これがこれに出くわす他の誰かに役立つことを願っています。

于 2012-12-18T18:54:59.497 に答える
0

Java 1.7 の最新の jdk を試してください。それは私のために働いた。以前は、テキスト フィールドに何も入力できませんでした。アップグレード後、私はその問題に直面しません。

http://bugs.sun.com/view_bug.do?bug_id=8018672

于 2013-12-26T04:43:34.067 に答える
0

FocusListenerWindowFocusListenerを調べて、Swing コンポーネント自体または JFrame のリスナーを実装してみてください。呼び出しが行われるたびに、ウィンドウまたはコンポーネントでfocusLost(..)使用requestFocus()して、フォーカスを強制的に戻すことができます。

于 2012-04-19T22:21:18.890 に答える