6

swing アプリの実行中に、画面のサイズを変更します (たとえば、1024x768 から 800x600 に)。

これについて通知を受けるために聞くことができるイベントはありますか?

または、数秒ごとに画面サイズを確認することもできますが、 Toolkit.getScreenSize() は古い値を教え続けます。変更後の実際の画面サイズ
を取得するにはどうすればよいですか?

環境: Linux (SuSE ES 11 および Ubuntu 9.04 でテスト済み)

私はあなたの助けに感謝します。
マートン

4

3 に答える 3

2

以下は私にとってはうまくいきましたが、私はMacを使っているので、Linuxでうまくいくとは言えません:

System.out.println(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getWidth() + "x" + GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getHeight());

//Ignore this block, it was simply to give me a chance to change my resolution
Scanner readUserInput=new Scanner(System.in);
System.out.println("Waiting on input, go change your resolution");
String myName=readUserInput.nextLine();

System.out.println(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getWidth() + "x" + GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getHeight());

出力(何とか実際には入力)は次のとおりです。

1440x900
Waiting on input, go change your resolution
blah
1280x960

複数のスクリーン デバイスを使用している場合は、明らかに注意が必要です。

于 2010-06-08T14:15:15.873 に答える
1

表示サイズを計算するには、( GraphicsConfiguration javadoc から取得)を使用できます。

  Rectangle virtualBounds = new Rectangle();
  GraphicsEnvironment ge = GraphicsEnvironment.
          getLocalGraphicsEnvironment();
  GraphicsDevice[] gs =
          ge.getScreenDevices();
  for (int j = 0; j < gs.length; j++) { 
      GraphicsDevice gd = gs[j];
      GraphicsConfiguration[] gc =
          gd.getConfigurations();
      for (int i=0; i < gc.length; i++) {
          virtualBounds =
              virtualBounds.union(gc[i].getBounds());
      }
  } 

widthその後、とheightの を照会できますvirtualBounds

これは、マルチモニター設定でも機能します。

私の知る限り、JDK がサポートする変更を検出する方法はありません。そのため、ポーリングを行うか、JNAとネイティブ コードを使用するしかありません。トップレベルのウィンドウが最大化されている場合、ディスプレイのサイズを変更すると、最大化されたウィンドウのサイズも変更されるため、そこでの変更もリッスンできます。コンポーネントリスナーの作成例については、このsun チュートリアルを参照してください。

最上位の最大化ウィンドウがない場合は、非表示の最大化ウィンドウを作成して同じ効果を得ることができる場合もあります。これがうまくいくかどうかはわかりませんが、試してみる価値はあります。

于 2010-06-08T14:08:08.747 に答える