jpanels、jframes、およびwindows、ああ!
-
16-09-2019 - |
質問
簡単に言えば、私はフルスクリーンに取り組んでいるゲームを作ろうとしています。
使用しようとしている次のコードがあります。
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
if(!gs.isFullScreenSupported()) {
System.out.println("full-screen not supported");
}
Frame frame = new Frame(gs.getDefaultConfiguration());
Window win = new Window(frame);
try {
// Enter full-screen mode
gs.setFullScreenWindow(win);
win.validate();
}
これに問題は、JPanelを拡張するクラス内で作業していることです。タイプフレームの変数がありますが、クラス内にタイプウィンドウがありません。
JPanelの私の理解は、それがある種の窓であるということですが、「これ」をgs.setfullscreenwindow(ウィンドウの勝利)に渡すことはできません...これを行うにはどうすればよいですか?
JPanelを使用して、それを呼ぶ簡単な方法、または同様の方法はありますか?
jpanelからタイプのウィンドウを取得できる方法はありますか?
-
編集:次の方法では、JFrameの状態を変更し、10msごとに呼び出されます。
public void paintScreen()
{
Graphics g;
try{
g = this.getGraphics(); //get Panel's graphic context
if(g == null)
{
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setExtendedState(frame.getExtendedState()|JFrame.MAXIMIZED_BOTH);
frame.add(this);
frame.pack();
frame.setResizable(false);
frame.setTitle("Game Window");
frame.setVisible(true);
}
if((g != null) && (dbImage != null))
{
g.drawImage(dbImage, 0, 0, null);
}
Toolkit.getDefaultToolkit().sync(); //sync the display on some systems
g.dispose();
}
catch (Exception e)
{
if(blockError)
{
blockError = false;
}
else
{
System.out.println("Graphics context error: " + e);
}
}
}
if(g == null)ステートメント(すべてのframe.sometherother())の後に、いくつかの冗長性または不必要な呼び出しがあるかもしれないと予想しています。
また、ブロックエラーは見た目です。私はエラーを無視しています。エラーは一度しか発生しません。これは、エラーの最初のインスタンスを無視するようにセットアップするときに正常に機能します...興味のある人のために、そのブロックを削除できるかどうかを確認したい場合は、そこに追加情報を投稿できますが、私は心配していません。 ...後で調べるかもしれません。
解決
この問題について何か進歩を遂げましたか?予想される動作とコードが実際に何をしているのか、質問を更新できれば役立つかもしれません。すでに指摘されているように、JFrameはウィンドウのサブクラスです。したがって、JFrameがある場合は、ウィンドウは必要ありません。
それが価値があることについては、フルスクリーンモードで動作するJavaアプリがあります。画面はあなたのように頻繁に塗装されていませんが、定期的に塗り直されます。フルスクリーンを入力するために以下を行います。
// pseudo-code; not compilable
JPanel container = new JPanel();
container.setOpaque( true ); // make sure the container will be visible
JFrame frame = new JFrame();
frame.getContentPane().add(container); // add the container to the frame
frame. ... //other initialization stuff, like default close operation, maximize, etc
if ( fullScreenModeIsSupported )
frame.setUndecorated( true ); // remove window decorations from the frame
gs.setFullScreenWindow( frame );
frame.validate();
その後、画面を更新する必要があるときはいつでも、新しいjpanelをにプラグインするだけです container
jpanel:
// pseudo-code; not compilable
container.removeAll(); // clean out the container
container.add( jPanelWithNewDisplay ); // add the new display components to the container
container.validate(); // update and redisplay
container.repaint();
技術的に完璧だと主張することはできませんが、私にとってはうまくいきます。擬似コードの例がそれをカットしない場合、私はまとめやすい例をまとめるのに少し時間を費やすことができます。
他のヒント
私はあなたが必要とするものを手に入れたと思います。
装飾されていないフレームを設定すると、タイトルバーやものがないようにします。
パネルをフレームに追加してください。そうすれば、パネルのみが表示されているように見えます。
フレームを最大化します。したがって、今では、パネルだけがフル画面を撮影していないように見えるはずです。
frame.setundecorated(true); frame.add(パネル); //ここでフレームを最大化します。
ノート: :装飾されていないAPIは、フレームが表示されない場合にのみ呼び出される可能性があることに注意することが重要です。したがって、すでに表示されている場合は、最初にSetVisible(false)を実行する必要があります。
編集1: :あなたが望むのがあなたのパネルを含むウィンドウを取得することだけなら、あなたはこれを行うことができます:
Window win = SwingUtilities.getAncestorOfClass(Window.class, myPanel);
ウィンドウインスタンスを取得したら、好きな場所に渡すことができます。
編集2: :また Frame
クラスは拡張されます Window
だからあなたは直接することができます gs.setFullScreen(frame)
. 。そのフレームの新しいウィンドウを作成する必要はありません。
jpanelの私の理解は、それがある種の窓だということです
どうしてそんなことを考えるのか? APIを読みましたか? jpanelは窓から伸びていますか?
Swingutitiesクラスを使用してみてください。特定のコンポーネントのウィンドウを返すメソッドがあります。