2011-01-25 7 views
13

私は定期的にJFrameをポップアップするJavaアプリケーション(Swing GUI)を作成しています。JFrameを前面に置くことはできますが、フォーカスしないことは可能ですか?

ウィンドウを前面(foo.setAlwaysOnTop(true)でも良いでしょう)に持っていくことは可能ですか?はフォーカスなしですか?

入力中にキーボードを見るために時々画面から目を離す人もいますし、このウィンドウが常にキーボードのフォーカスをとらえたら、人々は本当に迷惑になるでしょう気づかないうちにポップアップするたびに、かなりの数のキーストロークが失われます。

キーボードを常時見ずに実際に入力することができても、ウィンドウをポップアップしてフォーカスを取得すると、ポップアップウィンドウ自体から不要な操作が発生する可能性があります(Tab + Enterたとえば、ユーザが誤って選択しなかったオプションを誤って選択した場合)。

ありがとうございます!

更新

ジョナスが示すように、foo.setFocusableWindowState(false);ウィンドウが(唯一のGnomeの上でテスト)レンダリングされた後に呼び出された場合に動作するようです。

これは動作しません:

foo.setFocusableWindowState(false); 
foo.setVisible(true); 
foo.setFocusableWindowState(true); 

しかし、このを行います。

foo.setFocusableWindowState(false); 
foo.setVisible(true); 
Thread.sleep(1000); 
foo.setFocusableWindowState(true); 

私は私がキャッチすることができ、イベントがありますかどうかを確認する必要があります/それに耳を傾け、私がすることができます適切な場合はfoo.setFocusableWindowStatue(true);を実行してください。

私は私の問題を解決すると考えます。

+1

フレームがレンダリングされたときに聴くイベントを見つけましたか? – lordoku

+0

ここで働いているイベントを聞いたことがありますか? – wrslatz

答えて

13

これは動作可能性があります

foo.setFocusableWindowState(false); 
+0

これは実際にはうまくいくようですが、 'setFocusableWindowState'を' true'に戻すときに、タイマーを設定するか、何かイベントを見つけなければなりません。 –

+0

@Johannあなたは 'JFrame'の代わりに' Window'を使うこともできます。私はあなたがフォーカスをコントロールする可能性がもっとあると思います。 – Jonas

0

提案:第一1トップに新しいJFrameののウィンドウを持っ

frameJustCreated.requestFocus(); 
this.requestFocus(); 

:フレームを作成し、GUIコンポーネントでは、2つの連続通話を置きます2番目は、ユーザーが上に入力しているウィンドウを保持します。

+0

大変申し訳ありません!私は私のプログラムが担当している唯一の窓だと言いました。 "その他"のウィンドウは、ユーザーが実行している他のプログラムです。 –

1

私は最近、同じ問題に遭遇した、と暫定ソリューションはされています:

JFrame frame = ...; 
frame.setExtendedState(JFrame.NORMAL); 
frame.setAlwaysOnTop(true); 
frame.requestFocus(); 
frame.setAlwaysOnTop(false); 
+0

JFrameが1つしかなく、バックグラウンドタスクが存在しない場合は、独自のスレッドを開始してください(このスレッドへのリンクを希望する場合) )、それはsetVisible(true/flase)なしで実行するのは難しい仕事ですが、このアクションは画面上に表示されます。答えはJDialogを使用して、それだけです(Windows OSを意味します)。副次的な問題なしに行うことができます – mKorbel

+1

私のアプリケーションでは複数のJFramesが動作しています。ユーザーが私と同じ問題を記述しているにもかかわらず、新しいスレッドを開始するのはなぜですか?解決策はまだ完了していませんか? JDialogに関しては、ウィンドウの意図された目的には必ずしも適切ではありません。これも私の場合です。 –

+0

はい、おそらく私はちらつきなしでこれを行いますが、このコードはこのスレッドよりも長く、本当に良い方法ではありません。フォーカスを2つ以上のJFrameに切り替え、1つのJFrameを別のものに持ってきて、Focus(JFrameまたはJDialogと同じ)ネイティブOSからは非同期であり、管理が難しいため、 – mKorbel

2

あなたはsetFocusableWindowState(true)を呼び出したい場合は、中

frame.setAutoRequestFocus(false); 
0

を呼び出すことができるのJava 1.7のとおり(つまり、1秒間待たないように)、プロパティを変更するWindowListener(WindowAdapterから派生)を追加することができます:

appFrame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowOpened(WindowEvent e) { 
      super.windowOpened(e); 
      e.getWindow().setFocusableWindowState(true); 
     } 
    }); 

    appFrame.setFocusableWindowState(false); 
    appFrame.setVisible(true); 
関連する問題