2016-02-02 6 views
2

У меня проблема с размещением компонентов. Во-первых, я постараюсь дать (возможно, полезной) информации, а затем рассказать о главной проблеме:Локальное размещение компонентов SWING на Java с монитором 4K

Моя система: Windows 8.1 64bit, Java 1.8.0_60 32bit

То, что я пытаюсь сделать, это: После того, как я изучу разрешения экрана всех подключенных экранов, я помещаю некоторые компоненты поворота вокруг экрана. Это означает, что мне нужно знать разрешения экранов.

Я использую несколько мониторов.

  1. 3840 х 2160 (основной монитор)
  2. 1920 х 1080 (вторичный)

Я использую:

graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
devices = graphicsEnvironment.getScreenDevices(); 

И для главного устройства экрана:

devices[i].getDefaultConfiguration().getBounds() 

возвращает [0, 0, 2560, 1440]. Вместо правильных значений 3840 x 2160.

Интересная вещь;

devices[i].getDisplayMode().getWidth() and getHeight() 

возвращает правильные значения 3840 и 2160.

Примечание: Это различие не происходит ни в одном другом выборе разрешения экрана. Например, если я выбираю 1920 x 1080 для главного экрана, оба метода getDefaultConfiguration() getBounds() и getDisplayMode(). GetWidth() "возвращает правильные значения.

Теперь

Вы можете сказать, что я уже получаю правильные размеры. Итак, в чем дело?

Дело в том, что когда я пытаюсь позиционировать компоненты SWING, они помещаются в неправильные позиции. Например, элемент в [3750, 0, 10, 10] попадает внутрь второго монитора, в то время как он должен был находиться в правом верхнем углу первого экрана.

Другой пример: Как вы знаете, компонент с фиксированным размером будет казаться меньшим в более высоких разрешениях. Поскольку процент пикселя, связанный с экраном, становится меньше, сам компонент также выглядит меньше. Например; Когда я увеличиваю разрешение экрана с 1920x1080 до 2560x1440, мои компоненты становятся меньше. Но, когда я увеличиваю разрешение от 2560x1440 до 3840x2160; они остаются в одном размере.

Надеюсь, я был о проблеме.

Благодаря

+0

Возможно, вам интересно добавить версии OS, JVM ... и т. Д. На ваш вопрос. И [MVCE] (https://stackoverflow.com/help/mcve), чтобы поиграть. –

+1

Oracle не модифицирует Swing для работы на мониторах 4K. Похоже, вам нужно создать внешний вид 4K, дать L & F бесплатно и поддерживать его навсегда. –

+0

@TT. Windows 8.1 64bit, Java 1.8.0_60 32bit. Я не думаю, что MVCE необходим, поскольку даже шаблонный проект с простым jFrame покажет вам проблему, если у вас есть экран 4K. –

ответ

2

Я знаю Windows-8+ специфическая особенность, которая может проявляться таким образом: per-display DPI setting. Предполагается, что функция должна поддерживать физическое приложение окна одного размера, даже если перетаскивать их на дисплеи с разной плотностью.

Это достигается путем визуализации окна приложения в промежуточный буфер, который затем масштабируется DWM с учетом целевого экрана DPI.

Эта функция может быть отключена, используя следующий диалог:

Compatibility settings

Это должно быть сделано на файл, содержащий исполняемую программу, которая отображает любые кадры. В Java это несколько запутанно, поскольку это приложение для хостинга. Изменение этого параметра на java (w) .exe должно изменить поведение во всем мире.

Как правило, этот тип регулировки флага выполняется установщиком программного обеспечения. Можно положить банку java в exe с помощью тонкой обертки. Мне нравится launch4j больше всего для этой задачи. Оболочка exe и файл jar могут быть завернуты в сценарий установщика, который устанавливает флаг во время установки.

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

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