13

「ディスプレイ」JFrameが一方のモニターでフルスクリーンになり、「コントロール」JFrameがもう一方のモニターでフルスクリーンになり、ディスプレイに指示を送信する、デュアルモニターセットアップで実行することを目的としたアプリケーションを作成しています。ディスプレイのフルスクリーンを設定する2つの別々の方法を試しました。それぞれの成功はOSに依存しているようです。

display.setUndecorated(true);
display.setExtendedState(JFrame.MAXIMIZED_BOTH);

Windowsで動作しますが、JFrameはOSXおよびLinuxのドック/パネルの下に隠されます。

私の他の方法、利用

GraphicsDevice.setFullScreenWindow(display);

私が試した3つのOSすべてで動作しますが、Windowsでは、コントロールウィンドウを他のモニターにフォーカスすると、表示ウィンドウが非表示になり、

display.setAlwaysOnTop(true);

問題は解決しません。GraphicsDeviceOS XやLinuxの問題に対処する必要がないので、私はこの方法に少し偏っています。Windowsの問題が簡単な修正であることを望んでいます。それは...ですか?

4

2 に答える 2

10

これを試して...

複数画面の場合

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();


// Get size of each screen

for (int i=0; i<gs.length; i++) {
    DisplayMode dm = gs[i].getDisplayMode();
    int screenWidth = dm.getWidth();
    int screenHeight = dm.getHeight();
}

ウィンドウを一番上に配置するために使用public final void setAlwaysOnTop(boolean alwaysOnTop)します。ウィンドウが表示されている場合、これには windowtoFrontを移動し、それを一番上の位置に「貼り付ける」ことが含まれます。

于 2012-07-16T06:29:43.117 に答える
4

私は同じ問題に遭遇します。それを解決する私の方法show()は、jframe の関数をオーバーライドし、バッファ戦略を使用して show 関数から決して戻らないようにすることでした。したがって、次のようなものです。

 @override
 public void show(){
        super.show();
        //Create a double buffering strategy
        createBufferStrategy(2);
        BufferStrategy bs = getBufferStrategy();
        while(true){
              //draw our frame
              Graphics g = bs.getGraphics();
              paint(g);
              //dispose of our graphics
              g.dispose();
              //Show our frame
              bs.show();
              try{
                  //Don't use all our cpu-power
                  Thread.sleep(10);
              }catch(Exception e){
                  //Do something (this probably will never happen)
              }
        }
 }

(setVisible(boolean)の代わりに使用されたものは非推奨)の方が実際には良いでしょう。ウィンドウは常に最前面に表示されるとは限りません (別のウィンドウをその上にドラッグすることはできます) が、別のウィンドウにフォーカスを移しても自動的に非表示になるわけではありません。それがあなたが望む振る舞いだと思います。show()show

注:イベントキューを呼び出さないでください。showこれにより、イベントキューが役に立たなくなり、jframe がすべてのイベントを無視するようになります。関数showは新しいスレッドで呼び出す必要があり、その後もすべてのイベントが処理されます。

于 2012-12-04T23:00:45.133 に答える