メインゲームを保持する1つのJFrameと、スコアを表示する別のJFrameを使用して、小さなゲームを作成しています。問題は、それらの作成が完了すると、スコアJFrameが常にフォーカスされてしまうことです。私はscoreDisplay.toFront()、scoreDisplay.requestFocus()、さらには次のように呼び出してみました。
display.setState(JFrame.ICONIZED);
display.setState(JFrame.NORMAL);
これを機能させる方法はありますか?よろしくお願いします、ジョン・ムラノ
ゲームフレームと同じフレームにスコアを設定することを検討しましたか?
他の可能な(迅速で汚い)オプションは、それらを逆の順序で作成するか、少なくとも(スコアがゲームに依存する場合)逆の順序で表示することです。
score.setVisible( true );
game.setVisible( true );
私の推測では、現在は次のようになっています。
game.setVisible( true );
score.setVisible( true );
requestFocus()
メソッドを呼び出します。
オペレーティングシステムがフレームにフォーカスを持たせない理由はたくさんあるため、これが機能することは保証されていません。別のアプリケーションに、優先度の高い別のフレームが存在する可能性があります。 (私が正しく思い出せば)フレームがフォーカスを要求することを許可しないいくつかのLinuxデスクトップもあります。
成功の可能性を高めるために、フォーカスを要求する前にtoFront()
メソッドを呼び出すこともお勧めします。
frame.setVisible(true);
frame.toFront();
frame.requestFocus();
特にフォーカスとレイヤリングでのフレーム処理はオペレーティングシステムに大きく依存するため、これは保証されないことに注意してください。したがって、フレームを表示に設定し、フレームを前面に移動して、フォーカスを要求します。 EDTをあきらめると、オペレーティングシステムがフレームにフォーカスを与える可能性があります。少なくとも、ウィンドウは上にある必要があります。
トグル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);
私がする方法は次のとおりです。
frame.toFront();
frame.setState(Frame.NORMAL);
また、より詳細に制御したい場合は、requestFocuseを使用する必要があります。
ところで、ここに例があります: http://coding.derkeiler.com/Archive/Java/comp.lang.Java.gui/2006-06/msg00152.html
JOptionPaneMessageDialogコードの上に次のコード行を追加するだけです... this.setAlwaysOnTop(false);