3

簡単に言えば、フルスクリーンで作業しているゲームを作ろうとしています。

使用しようとしている次のコードがあります。

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 を拡張するクラス内で作業していることです。フレーム型の変数はありますが、クラス内に Window 型はありません。

JPanel についての私の理解では、それは一種のウィンドウですが、「これ」を gs.setFullScreenWindow(Window win) に渡すことはできません...どうすればこれを行うことができますか?

JPanelを使用して、それを呼び出す簡単な方法、または同様の方法はありますか?

JPanel から Window 型のものを取得する方法はありますか?

-

編集: 次のメソッドは JFrame の状態を変更し、10 ミリ秒ごとに呼び出されます。

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.somethingOrOther()s) の後に、いくつかの冗長性または不要な呼び出しがある可能性があると予想しています。クリーンアップのアドバイスをいただければ幸いです...

また、ブロックエラーはそのようです。エラーを無視しています。エラーは一度だけ発生し、エラーの最初のインスタンスを無視するようにセットアップすると、これは正常に機能します...興味のある人は誰でも、そのブロックを削除できるかどうかを確認したい場合は、そこに追加情報を投稿できますが、私は心配していません…後で調べてみようかな。

4

4 に答える 4

2

この問題について何か進展はありましたか?予想される動作とコードが実際に行っていることで質問を更新できると助かりますか? すでに指摘したように、JFrame は Window のサブクラスであるため、JFrame があれば Window は必要ありません。

価値があるのは、フルスクリーンモードで動作する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 を JPanel に接続しますcontainer

// 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();

技術的に完璧とは言えませんが、私にとってはうまく機能します。疑似コードの例ではうまくいかない場合は、時間をかけてコンパイル可能な例をまとめることができます。

于 2009-11-13T16:17:27.383 に答える
0

JPanelはWindowのサブクラスではありません。JFrameです。

だからあなたは試すことができます:

JFrame yourFrame = new JFrame();
yourFrame.add(yourPanel);

appyYourFullScreenCodeFor( yourFrame );

それはうまくいくはずです。

于 2009-11-05T03:09:28.580 に答える
0

私はあなたが必要とするものを手に入れたと思います。

  1. フレームを装飾なしに設定して、タイトル バーなどを表示しないようにします。

  2. パネルをフレームに追加します。これにより、パネルのみが表示されているように見えます。

  3. フレームを最大化します。したがって、パネルだけがウィンドウなしで全画面表示になっているように見えるはずです。

    frame.setUndecorated(true); frame.add(パネル); // フレームを最大化します。

: 装飾されていない API は、フレームが表示できない場合にのみ呼び出すことができることに注意することが重要です。そのため、フレームが既に表示されている場合は、最初に setVisible(false) を実行する必要があります。

EDIT1 : パネルを含むウィンドウを取得することだけが必要な場合は、次のようにすることができます。

Window win = SwingUtilities.getAncestorOfClass(Window.class, myPanel);

ウィンドウインスタンスを取得したら、好きな場所に渡すことができます。

EDIT2:また、Frameクラスが拡張Window されるため、直接行うことができますgs.setFullScreen(frame)。そのフレーム用に新しいウィンドウを作成する必要はありません。

于 2009-11-05T04:25:22.667 に答える
-1

JPanel についての私の理解は、それが一種のウィンドウであるということです

どうしてそんなことを考えるのか?APIを読みましたか?JPanel は Window から拡張されていますか?

SwingUtilities クラスの使用を試すことができます。特定のコンポーネントの Window を返すメソッドがあります。

于 2009-11-05T02:59:01.610 に答える