Как заставить приложение Swing знать об изменении размера экрана? - PullRequest
6 голосов
/ 08 июня 2010

во время работы моего приложения Swing я изменяю размер экрана (например, с 1024x768 до 800x600).

Могу ли я прослушать какое-либо событие, чтобы получить уведомление об этом?

В качестве альтернативы я мог бы проверять размер экрана каждую пару секунд, но Toolkit.getScreenSize () продолжает сообщать мне старое значение.
Как я могу получить реальный размер экрана после изменения?

Среда: Linux (протестировано на SuSE ES 11 и Ubuntu 9.04)

Я ценю вашу помощь.
Мартон

Ответы [ 3 ]

2 голосов
/ 08 июня 2010

У меня сработало следующее, но я на 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

Очевидно, что если у вас несколько экранных устройств, вам придется проявлять большую осторожность.

1 голос
/ 08 июня 2010

Чтобы вычислить размер дисплея, вы можете использовать (взято из 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 для примеров написания компонентных слушателей.

Если у вас нет максимизированного окна верхнего уровня, вы также можете достичь того же эффекта, создав скрытое максимизированное окно. Я не могу точно сказать, сработает ли это, но стоит попробовать.

0 голосов
/ 16 февраля 2016

Размер screenSize = Toolkit.getDefaultToolkit (). GetScreenSize ();

f.setSize (screenSize.width, screenSize.height);

...