2010-06-08 2 views
6

В то время как мое приложение swing работает Я изменяю размер экрана (например, от 1024x768 до 800x600).Как сделать приложение swing осведомленным об изменении размера экрана?

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

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

Окружающая среда: Linux (проверено на SuSE ES 11 и Ubuntu 9.04)

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

ответ

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 

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

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 tutorial для примеров написания компонентных слушателей.

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

+0

Благодарим за быстрый ответ. К сожалению, приведенный выше фрагмент продолжает отображать старый размер (1024x768) на Ubuntu 9.04. С уважением, Marton –

+0

Это странно, поскольку по сути он использует те же API, что и принятый ответ. – mdma

+0

Да, странно, что GraphicsConfiguration.getBounds() возвращает неправильное значение, а GraphicsDevice.getDisplayMode() возвращает хороший. С другой стороны, GraphicsDevice.getDisplayMode() кажется тяжелым, поэтому выполнение его через каждые пару секунд может быть не лучшей идеей. Возможно, мне придется выбирать собственный вызов. –

-1

Размер экранаSize = Toolkit.getDefaultToolkit(). GetScreenSize();

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

+0

Это не отвечает на вопрос. – vektor