Я знаю, что могу позвонить Toolkit.getDefaultToolkit().getScreenResolution()
и получить DPI для экрана по умолчанию, но я не могу найти способ для жизни, чтобы получить ту же информацию для других мониторов, с которыми я подключился. Может ли кто-нибудь сказать мне, как получить Toolkit
для других мониторов или позвонить на устройства, чтобы получить DPI для этих мониторов?Как получить разрешение экрана (getScreenResolution) при использовании нескольких мониторов?
ответ
С этим связано несколько проблем. Начнем с теоретического момента.
ДОИ (фактически ИЦП) рассчитывается отдельно по ширине и высоте:
DPI х = ширина экрана/разрешение х
DPI у = высота экрана/разрешение y
Если DPI x = DPI y (что происходит, когда соотношение сторон экрана совпадает с разрешением), тогда у вас есть одно значение DPI, но это не применяется. Таким образом, вам нужно быть осторожным при использовании одного значения DPI.
Это приводит нас к второй проблеме - размер физического экрана обычно не доступен и даже не всегда известен. См. this question и this question для этого в Java.
Есть 2 варианта реализации инструментария, которые реализуют getScreenResolution()
: системы Unix используют XToolkit
(на основе оконной системы X11), а в системах Windows используется WToolkit
.
- Как вычислить только DPI х, что номер, который вы получите.
- Оба используют методы
native
, чтобы попытаться получить информацию от ОС, однако эта информация ненадежна. См. this question. Обычно получают значения по умолчанию, возвращаемые, который, кажется, 96. WToolkit
«s Javadoc определяет явно при получении DPI х:Возвращает количество пикселей на логический дюйм вдоль экрана ширина. В системе с несколькими мониторами дисплея это значение одинаково для всех мониторов.
Итак, идет план нескольких мониторов.
XToolkit
нет даже javadoc этот способ.
В заключение я не доверяю getScreenResolution()
на любом дисплее или в операционной системе. Безопасное решение - это разрешение (даже все возможные разрешения, частоты обновления, глубина цвета ...) и попросить пользователя ввести данные физического размера, если это необходимо. Помните, что у вас могут быть проекторы, которые могут изменять «размер экрана». В противном случае вам нужно будет напрямую взаимодействовать с драйвером, надеясь, что у него есть эта достоверная информация, которая не гарантируется.
Edit: Чтобы получить разрешение в пикселях ваших устройств используйте:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gds = ge.getScreenDevices();
for (GraphicsDevice gd : gds) {
DisplayMode dm = gd.getDisplayMode();
int h = dm.getHeight();
int w = dm.getWidth();
System.out.println(w + "x" + h);
// or
GraphicsConfiguration gc = gd.getDefaultConfiguration();
Rectangle rec = gc.getBounds();
System.out.println(rec.width + "x" + rec.height);
}
Но есть метод getScreenResolution для defaultToolkit. Не важно, какой из моих мониторов я подключаю к своему основному HDMI, я понимаю, что это актуально (я знаю, x, и y, не совпадают, так что актуально не точное) разрешение. Значит, для других мониторов есть либо нестандартный инструментарий, либо getResolution на каком-то другом объекте? –
@JoeBryant Toolkit не является объектом для каждого монитора (графического устройства, на самом деле), он привязан к системе окон. Конечно, есть 'getScreenResolution()' for * all * toolkits, потому что они наследуют метод из 'awt, Toolkit'. Не все они реализуют его, и даже если они ничего не делают, это гарантирует правильный результат. Я добавил обычный способ получить разрешение монитора в пикселях. Результат в DPI незначителен для программ, поскольку они не заботятся о физических размерах. Для чего тебе это? – user1803551
Опять же, PIXELS/INCH –
Пробыв некоторое время в отладке, я нашел свой ответ. На графическом устройстве есть поля для разрешения X и Y (xResolution, yResolution), которые дают мне то, что мне нужно).
'GraphicsDevice' не имеет этих полей. – user1803551
См. [Это] (http://stackoverflow.com/questions/15334392/java-toolkit-screen-resolution-descrepensies). – user1803551
Кроме того, о какой ОС вы говорите здесь? – user1803551
Я разрабатываю OS/X, но предпочитаю решение, которое будет работать как можно ближе к где угодно. Если бы мне пришлось перечислять приоритеты, OS/X, Linux, то другие. –