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



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



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



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

598   4  

4 ответов:

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

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

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

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

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

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

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

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

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

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

На Linux, это не представляется возможным сделать масштабирование с любым качели выглядеть и чувствовать себя, согласно моим экспериментам. Однако это можно сделать с помощью взлома с участием 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 "$@"

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

это на немецком языке, но я буду переводить важные вещи.

создайте этот раздел реестра:

[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 (у вас будет два файла с одинаковым содержанием, но разными имена.)

НТН.

Бернд

Comments

    Ничего не найдено.