Если у вас есть монитор с 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?
В настоящее время я изучаю эту проблему в 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
В 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 "$@"
matchbox-window-manager
идеален в этом случае.
Короткий ответ: вам нужно запустить его на JRE 9.
Длинный ответ:
Это связано с тем, что среда выполнения Java объявила себя "DPI-aware", но на самом деле не поддерживала ее для AWT и Swing. Приложения Java были рассчитаны и отображены на основе пикселей, а не были правильно масштабированы, включая дисплеи HiDPI.
В любом случае, это было недавно решено.
См. Вопрос JEP 263: графика HiDPI в Windows и Linux
и обновление.
Итак, увеличение размера шрифта не работает (потому что оно не увеличивает остальные вещи); аргумент jvm -Dsun.java2d.dpiaware=false
не работает (потому что он не поддерживается); и файл манифеста + реестр (для Windows) просто не работает.
Решение: вам нужно запустить его на JRE 9, потому что он действительно поддерживает эту функцию.
Мне удалось решить эту задачу следующим образом: Ссылка.
Это по-немецки, но я переведу важный материал.
Создайте этот ключ реестра:
[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
(у вас будет два файла с одним и тем же содержимым, но с разными именами).
НТН.
Бернд
<Application>.exe.manifest
для отключения масштабирования DPI. Отличается от того, что сказал Эферрари.