Для вычисления размера дисплея, вы можете использовать (из 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 для примеров написания компонентных слушателей.
Если у вас нет окна с максимизированным верхним уровнем, вы также можете добиться такого же эффекта, создав скрытое окно с максимальным размером. Я не могу точно сказать, будет ли это работать, но стоит попробовать.
Благодарим за быстрый ответ. К сожалению, приведенный выше фрагмент продолжает отображать старый размер (1024x768) на Ubuntu 9.04. С уважением, Marton –
Это странно, поскольку по сути он использует те же API, что и принятый ответ. – mdma
Да, странно, что GraphicsConfiguration.getBounds() возвращает неправильное значение, а GraphicsDevice.getDisplayMode() возвращает хороший. С другой стороны, GraphicsDevice.getDisplayMode() кажется тяжелым, поэтому выполнение его через каждые пару секунд может быть не лучшей идеей. Возможно, мне придется выбирать собственный вызов. –