web-dev-qa-db-ja.com

JFrameに焦点を合わせる方法は?

メインゲームを保持する1つのJFrameと、スコアを表示する別のJFrameを使用して、小さなゲームを作成しています。問題は、それらの作成が完了すると、スコアJFrameが常にフォーカスされてしまうことです。私はscoreDisplay.toFront()、scoreDisplay.requestFocus()、さらには次のように呼び出してみました。

display.setState(JFrame.ICONIZED);
display.setState(JFrame.NORMAL);

これを機能させる方法はありますか?よろしくお願いします、ジョン・ムラノ

10
John Murano

ゲームフレームと同じフレームにスコアを設定することを検討しましたか?

他の可能な(迅速で汚い)オプションは、それらを逆の順序で作成するか、少なくとも(スコアがゲームに依存する場合)逆の順序で表示することです。

score.setVisible( true );
game.setVisible( true );

私の推測では、現在は次のようになっています。

game.setVisible( true );
score.setVisible( true );
3
OscarRyz

requestFocus()メソッドを呼び出します。

オペレーティングシステムがフレームにフォーカスを持たせない理由はたくさんあるため、これが機能することは保証されていません。別のアプリケーションに、優先度の高い別のフレームが存在する可能性があります。 (私が正しく思い出せば)フレームがフォーカスを要求することを許可しないいくつかのLinuxデスクトップもあります。

成功の可能性を高めるために、フォーカスを要求する前にtoFront()メソッドを呼び出すこともお勧めします。

frame.setVisible(true);
frame.toFront();
frame.requestFocus();

特にフォーカスとレイヤリングでのフレーム処理はオペレーティングシステムに大きく依存するため、これは保証されないことに注意してください。したがって、フレームを表示に設定し、フレームを前面に移動して、フォーカスを要求します。 EDTをあきらめると、オペレーティングシステムがフレームにフォーカスを与える可能性があります。少なくとも、ウィンドウは上にある必要があります。

9
Erick Robertson

トグルalwaysOnTop

ここを参照してください:

http://forums.Sun.com/thread.jspa?threadID=5124278

APIのtoFrontについて読む http://Java.Sun.com/j2se/1.5.0/docs/api/Java/awt/Window.html#toFront

一部のプラットフォームでは、このVMがネイティブアプリケーションのウィンドウまたは他のVMのウィンドウの上にWindowsを配置することを許可しない場合があります。

たとえばWindowsOSでは、toFrontを使用すると、タスクバーのアイコンがちらつきますが、ウィンドウは後ろに残ります。

ウィンドウを前面に強制する唯一の考えは、setAlwaysOnTopです。

frame.setAlwaysOnTop(true); 
frame.setAlwaysOnTop(false);
9
ordnungswidrig

私がする方法は次のとおりです。

 frame.toFront();
 frame.setState(Frame.NORMAL); 

また、より詳細に制御したい場合は、requestFocuseを使用する必要があります。

ところで、ここに例があります: http://coding.derkeiler.com/Archive/Java/comp.lang.Java.gui/2006-06/msg00152.html

3
Pooria

JOptionPaneMessageDialogコードの上に次のコード行を追加するだけです... this.setAlwaysOnTop(false);

0
Paki