Как настроить DPI приложений Java Swing для Windows / Linux?

56

Если у вас есть монитор с DPI более 150 (например, Macbook Pro), вы также можете найти проблему: шрифт в приложении Java Swing слишком мал для монитора с высоким DPI и Я вообще не могу изменить размер шрифта (он игнорирует Windows DPI напрямую, только отображая самый оригинальный DPI → 96). Я ничего не могу сделать, кроме изменения разрешения экрана, которое могло бы абсолютно сделать все размытым на ЖК-дисплее.

Да, у меня есть ноутбук с высоким монитором DPI, 15,6 'с разрешением 1920x1080, некоторые приложения для Java-приложений выглядят очень маленькими на моем ноутбуке, например Matlab, Burpsuite и т.д. Я очень долго искал Интернет времени, но до сих пор не может найти метод для проблемы. Я знаю, что я могу изменить шрифты JRE с помощью JRE_HOME/lib/font/fontconfig.properties.src, но я не могу найти места для установки размера шрифта по умолчанию или DPI для шрифтов рабочего стола Java.

У проблемы нет решения? У вас есть высокий монитор DPI? Как вы работаете с такими приложениями? Разве Swing отказывается от высоких пользователей DPI?

  • 3
    Это может помочь вам
  • 0
    И расскажите нам о своих результатах , чтобы мы знали, как ревновать. :-)
Показать ещё 1 комментарий
Теги:
fonts
swing
dpi

4 ответа

33
Лучший ответ

В настоящее время я изучаю эту проблему в Windows. Вот что я нашел:

Большинство Swing Look и Feels не поддерживают высокий уровень DPI вообще, даже Nimbus, хотя он и должен быть масштабируемым. Я нашел несколько старых сообщений в блогах, в которых говорилось, что Nimbus может в конечном итоге предложить масштабирование по шкале DPI, но, по-видимому, этого не произошло.

Единственное исключение - System LAF, но его шрифт по умолчанию на ~ 10% меньше фактического размера шрифта системы во всех настройках DPI. Кроме того, система должна быть выбрана явно, как описано здесь: http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

Нет ни одного масштабирующего коэффициента, который вы могли бы установить в Swing. Конкретный LAF должен предоставить код для обработки масштабирования. Поэтому лучше всего вы можете выбрать System и надеяться на это достаточно хорошо.

Однако JavaFX делает правильно и автоматически масштабируется до 150% в моей системе. Если это вообще возможно, я предлагаю вам использовать JavaFX для создания графического интерфейса.

edit: Я сделал пару небольших тестовых программ и сделал скриншоты сравнения для различных графических интерфейсов GUI, Swing-тем и настроек DPI. Это может быть информативным для людей, читающих этот вопрос: http://kynosarges.org/GuiDpiScaling.html

3

В Linux, по моим экспериментам, не представляется возможным делать масштабирование с любым взглядом Swing. Однако это можно сделать с помощью взлома с участием VNC, vncdesk. Вот моя конфигурация для запуска gradle --gui под vncdesk:

.vncdesk/1/settings.ini:

[desktop]
width = 1050
height = 650

[window]
title = gradle
name = gradle in vncdesk
class = GradleInVncdesk
scale_factor = 2

.vncdesk/1/startup:

#!/bin/sh
cd "$INVOCATION_DIR"
matchbox-window-manager&
exec gradle --gui "$@"
  • 0
    Минимальный matchbox-window-manager идеален в этом случае.
2

Короткий ответ: вам нужно запустить его на JRE 9.

Длинный ответ:
Это связано с тем, что среда выполнения Java объявила себя "DPI-aware", но на самом деле не поддерживала ее для AWT и Swing. Приложения Java были рассчитаны и отображены на основе пикселей, а не были правильно масштабированы, включая дисплеи HiDPI. В любом случае, это было недавно решено. См. Вопрос JEP 263: графика HiDPI в Windows и Linux и обновление.

Итак, увеличение размера шрифта не работает (потому что оно не увеличивает остальные вещи); аргумент jvm -Dsun.java2d.dpiaware=false не работает (потому что он не поддерживается); и файл манифеста + реестр (для Windows) просто не работает.

Решение: вам нужно запустить его на JRE 9, потому что он действительно поддерживает эту функцию.

  • 0
    В Java8 мне помогло переключение параметра dpiAware в файл манифеста javaw.exe
  • 0
    Я на JRE 9, и это не работает.
2

Мне удалось решить эту задачу следующим образом: Ссылка.

Это по-немецки, но я переведу важный материал.

Создайте этот ключ реестра:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide]
"PreferExternalManifest"=dword:00000001

Создайте файл манифеста с этим контентом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">

<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*">
    </assemblyIdentity>
  </dependentAssembly>
</dependency>

<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b">
    </assemblyIdentity>
  </dependentAssembly>
</dependency>

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
    </requestedPrivileges>
  </security>
</trustInfo>

<asmv3:application>
  <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
    <ms_windowsSettings:dpiAware xmlns:ms_windowsSettings="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</ms_windowsSettings:dpiAware>
  </asmv3:windowsSettings>
</asmv3:application>

</assembly>

Скопируйте его в каталог bin, где находятся java.exe и javaw.exe, и назвали его java.exe.manifest и javaw.exe.manifest (у вас будет два файла с одним и тем же содержимым, но с разными именами).

НТН.

Бернд

  • 0
    К сожалению, это ничего не изменило для меня. Я использую 32-битную Java, но я не знаю, что у меня был выбор, если это имеет значение. РЕДАКТИРОВАТЬ: На самом деле, проблема может быть решена, по крайней мере, в моем случае, путем создания манифеста для отдельного приложения, которое является проблемой, а не java / javaw.exe. За javahacker.com/eclipse-on-a-high-dpi-display-in-windows
  • 1
    @AlexWhittemore Прочитав связанную статью, я должен сказать, что это именно то, что он советует - создать файл <Application>.exe.manifest для отключения масштабирования DPI. Отличается от того, что сказал Эферрари.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню