2016-07-05 8 views
-1

Я знаю, что могу позвонить Toolkit.getDefaultToolkit().getScreenResolution() и получить DPI для экрана по умолчанию, но я не могу найти способ для жизни, чтобы получить ту же информацию для других мониторов, с которыми я подключился. Может ли кто-нибудь сказать мне, как получить Toolkit для других мониторов или позвонить на устройства, чтобы получить DPI для этих мониторов?Как получить разрешение экрана (getScreenResolution) при использовании нескольких мониторов?

+0

См. [Это] (http://stackoverflow.com/questions/15334392/java-toolkit-screen-resolution-descrepensies). – user1803551

+0

Кроме того, о какой ОС вы говорите здесь? – user1803551

+0

Я разрабатываю OS/X, но предпочитаю решение, которое будет работать как можно ближе к где угодно. Если бы мне пришлось перечислять приоритеты, OS/X, Linux, то другие. –

ответ

0

С этим связано несколько проблем. Начнем с теоретического момента.

ДОИ (фактически ИЦП) рассчитывается отдельно по ширине и высоте:

DPI х = ширина экрана/разрешение х
DPI у = высота экрана/разрешение y

Если DPI x = DPI y (что происходит, когда соотношение сторон экрана совпадает с разрешением), тогда у вас есть одно значение DPI, но это не применяется. Таким образом, вам нужно быть осторожным при использовании одного значения DPI.

Это приводит нас к второй проблеме - размер физического экрана обычно не доступен и даже не всегда известен. См. this question и this question для этого в Java.

Есть 2 варианта реализации инструментария, которые реализуют getScreenResolution(): системы Unix используют XToolkit (на основе оконной системы X11), а в системах Windows используется WToolkit.

  1. Как вычислить только DPI х, что номер, который вы получите.
  2. Оба используют методы native, чтобы попытаться получить информацию от ОС, однако эта информация ненадежна. См. this question. Обычно получают значения по умолчанию, возвращаемые, который, кажется, 96.
  3. 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); 
} 
+0

Но есть метод getScreenResolution для defaultToolkit. Не важно, какой из моих мониторов я подключаю к своему основному HDMI, я понимаю, что это актуально (я знаю, x, и y, не совпадают, так что актуально не точное) разрешение. Значит, для других мониторов есть либо нестандартный инструментарий, либо getResolution на каком-то другом объекте? –

+0

@JoeBryant Toolkit не является объектом для каждого монитора (графического устройства, на самом деле), он привязан к системе окон. Конечно, есть 'getScreenResolution()' for * all * toolkits, потому что они наследуют метод из 'awt, Toolkit'. Не все они реализуют его, и даже если они ничего не делают, это гарантирует правильный результат. Я добавил обычный способ получить разрешение монитора в пикселях. Результат в DPI незначителен для программ, поскольку они не заботятся о физических размерах. Для чего тебе это? – user1803551

+0

Опять же, PIXELS/INCH –

-1

Пробыв некоторое время в отладке, я нашел свой ответ. На графическом устройстве есть поля для разрешения X и Y (xResolution, yResolution), которые дают мне то, что мне нужно).

+0

'GraphicsDevice' не имеет этих полей. – user1803551

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

  • Нет связанных вопросов^_^