2013-09-27 3 views
4

В Windows каждый экран имеет номер или идентификатор, которые я предполагаю относительно того, как я физически подключил свои кабели монитора. Ключ к моему вопросу заключается в том, что я могу перенастроить эти экраны, но они сохранят свою личность.Отобразить физическое расположение экрана в массиве GraphicsDevice с Swing

Запрос Java на GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices() даст мне массив GraphicsDevice.

Как я могу соотнести порядок экранов в массиве с нумерацией окон? Меня бы заинтересовало кросс-платформенное решение.

Например, моя конфигурация для Windows выглядит следующим образом enter image description here

но возвращаемый массив выглядит как этот

screens[0] = relates to screen 2 
screens[1] = relates to screen 3 
screens[2] = relates to screen 1 

NB код я получаю, я хотел бы использовать это вдоль линий этого

frame.setLocation(
    screens[i].getDefaultConfiguration().getBounds().x, frame.getY()); 

, где i должен быть физическим номером, а не позицией в массиве (или его отображением, если вы понимаете, что я имею в виду).

ответ

2

Можно сортировать экран устройства по их местоположению:

Arrays.sort(screens, new Comparator<GraphicsDevice>() { 
    public int compare(GraphicsDevice screen1, 
         GraphicsDevice screen2) { 
     Rectangle bounds1 = screen1.getDefaultConfiguration().getBounds(); 
     Rectangle bounds2 = screen2.getDefaultConfiguration().getBounds(); 
     int c = bounds1.y - bounds2.y; 
     if (c == 0) { 
      c = bounds1.x - bounds2.x; 
     } 
     return c; 
    } 
}); 
+0

благодарит за идею и за время, чтобы ее кодировать! :) – Toby

+1

Следует отметить, что если вы измените порядок массива, возвращающийся из GraphicsEnvironment.getLocalGraphicsEnvironment(). GetScreenDevices(), ваш основной экран также изменится (GraphicsEnvironment.getLocalGraphicsEnvironment(). GetDefaultScreenDevice()). Поэтому лучше сделать копию возвращаемого массива, чтобы не потерять основное устройство. – bmlkc

+0

Ничего себе. Это серьезная ошибка, и для меня это довольно неожиданно, поскольку Java обычно очень хорош в использовании [защитного копирования] (http://stackoverflow.com/questions/12000655/regarding-an-immutable-class-defensive-copying). Сравните с пресловутой ошибкой безопасности [Class.getSigners()] (https://www.cs.auckland.ac.nz/courses/compsci725s2c/archive/termpapers/725lun.pdf). – VGR

0

Ничто не гарантирует, что GraphicsDevice заказ возвращается в getScreenDevices() будет такой же, как вы видите его в настройках ОС. Кроме того, я не знаю, какой удобный способ получить системные экраны (и я сомневаюсь, что есть один, вам наверняка придется называть некоторые собственные API-интерфейсы ОС, чтобы получить точный порядок).

Вы можете использовать имеющуюся информацию о GraphicsDevice заказать их в приложении:

  • По умолчанию устройство - GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()

  • Устройства оценки - graphicsDevice.getDefaultConfiguration().getBounds()

Device ID может также сказать вы что-то - graphicsDevice.getIDstring() - хотя я не могу проверить прямо сейчас, зависит ли это по заказу системных экранов или нет.

+0

спасибо, получение экрана по умолчанию действительно помогает :) – Toby

Смежные вопросы