Как определить текущий дисплей с помощью Java? - PullRequest
12 голосов
/ 10 февраля 2010

У меня подключено 2 дисплея, поэтому я могу запустить свое приложение Java на основном или дополнительном дисплее.

Вопрос в следующем: Как узнать, какой дисплей содержит окно моего приложения, т.е. есть ли способ обнаружить текущий дисплей с помощью Java?

Ответы [ 4 ]

23 голосов
/ 10 февраля 2010

java.awt.Window является базовым классом всех окон верхнего уровня (Frame, JFrame, Dialog и т. Д.), И он содержит метод getGraphicsConfiguration(), который возвращает GraphicsConfiguration это окно использует. GraphicsConfiguration имеет метод getGraphicsDevice(), который возвращает GraphicsDevice , к которому принадлежит GraphicsConfiguration. Затем вы можете использовать класс GraphicsEnvironment , чтобы проверить это на всех устройствах GraphicsDevices в системе и увидеть, к какому из них принадлежит окно.

Window myWindow = ....
// ...
GraphicsConfiguration config = myWindow.getGraphicsConfiguration();
GraphicsDevice myScreen = config.getDevice();
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
// AFAIK - there are no guarantees that screen devices are in order... 
// but they have been on every system I've used.
GraphicsDevice[] allScreens = env.getScreenDevices();
int myScreenIndex = -1;
for (int i = 0; i < allScreens.length; i++) {
    if (allScreens[i].equals(myScreen))
    {
        myScreenIndex = i;
        break;
    }
}
System.out.println("window is on screen" + myScreenIndex);
5 голосов
/ 12 мая 2014

Метод, предложенный Нейтом, не работает, когда в систему только что добавлен другой монитор, и пользователь перемещает окно Java в этот монитор. С такой ситуацией часто сталкиваются мои пользователи, и для меня единственным способом было перезапустить java.exe, чтобы заставить его пересчитать мониторы.

Основная проблема - myWindow.getGraphicsConfiguration (). GetDevice () всегда возвращает оригинальное устройство, на котором был запущен Java-апплет или приложение. Можно ожидать, что он покажет текущий монитор, но мой собственный опыт (очень трудоемкий и разочаровывающий) заключается в том, что просто полагаться на myWindow.getGraphicsConfiguration (). GetDevice () не является надежным. Если у кого-то есть другой, более надежный подход, сообщите мне.

Выполнение сопоставления для экранов (с использованием вызова allScreen [i] .equals (myScreen)) затем возвращает исходный монитор, на котором был вызван апплет, а не новый монитор, на котором он мог быть перемещен.

3 голосов
/ 03 сентября 2016

Решение Нейта, похоже, работает в большинстве , но не во всех случаях, как мне пришлось испытать. В недоумении упоминает, что у него были проблемы с подключением мониторов, у меня были проблемы с командами клавиш «Win + Left» и «Win + Right». Мое решение проблемы выглядит следующим образом (возможно, решение имеет проблемы само по себе, но по крайней мере это работает для меня лучше, чем решение Нейта):

GraphicsDevice myDevice = myFrame.getGraphicsConfiguration().getDevice();
for(GraphicsDevice gd:GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()){
    if(frame.getLocation().getX() >= gd.getDefaultConfiguration().getBounds().getMinX() &&
        frame.getLocation().getX() < gd.getDefaultConfiguration().getBounds().getMaxX() &&
        frame.getLocation().getY() >= gd.getDefaultConfiguration().getBounds().getMinY() &&
        frame.getLocation().getY() < gd.getDefaultConfiguration().getBounds().getMaxY())
        myDevice=gd;
}
3 голосов
/ 10 февраля 2010

Да, вы можете сделать это с помощью классов Window, Frame и Graphics Configuration.

Подробнее здесь:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...