如何在Windows / Linux上设置Java Swing应用程序的DPI?


74

如果您有一个DPI超过150的显示器(例如Macbook Pro),您可能还会发现问题:Java Swing应用程序上的字体对于高DPI显示器来说太小了,我根本无法更改字体大小(直接忽略Windows DPI,仅显示非常原始的DPI-> 96。除了更改屏幕分辨率外,我无能为力,这绝对会使LCD上的所有内容变得模糊。

是的,我有一台具有高DPI监视器的笔记本电脑,分辨率为1920x1080,分辨率为15.6英寸,某些Java桌面应用在笔记本电脑上看起来很小,例如Matlab,Burpsuite等。我已经在互联网上搜索了很长时间了,但是仍然找不到解决问题的方法。我知道我可以通过更改JRE字体JRE_HOME/lib/font/fontconfig.properties.src,但是找不到任何位置来设置Java桌面字体的默认字体大小或DPI。

问题没有解决办法吗?您有高DPI监视器吗?您如何使用此类应用程序?Swing会放弃DPI高用户吗?


3
可能会对您有所帮助
Parth Soni 2013年

告诉我们您的结果,让我们知道自己有多嫉妒。:-)
垃圾神

题外话:如果正常的Windows程序无法很好地扩展,即使您在兼容性选项中使用“ no DPI scale”标志,则您可能正在运行该程序的64位版本。请尝试使用32位版本。
Mark Jeronimus

Answers:


38

我目前正在Windows上调查此问题。这是我发现的:

大多数Swing Look&Feel根本不支持高DPI,甚至Nimbus也不支持,即使它应该具有可扩展性。我发现一些老博客文章说,Nimbus最终可能会提供较高的DPI缩放比例,但显然这从未发生过。

一个例外是系统LAF,但在所有DPI设置下,其默认字体都比实际系统字体大小小10%。此外,必须按照此处所述明确选择系统:http : //docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

您也无法在Swing中设置单个缩放比例。特定的LAF必须提供代码来处理缩放。因此,您最好的选择是System,并希望它足够好。

但是,JavaFX可以正确地自动扩展到我的系统上的最大150%。如果有可能,我建议您使用JavaFX来构建GUI。

编辑:我做了几个小型测试程序,并比较了各种GUI框架,Swing主题和DPI设置的屏幕截图。这对于阅读此问题的人可能是有益的http : //kynosarges.org/GuiDpiScaling.html


11

简短的答案:您需要在JRE 9+上运行它。

长答案:
这是因为Java运行时声明自己为“ DPI感知”,但实际上并没有为AWT和Swing支持它。Java应用程序的大小和渲染是基于像素而不是适当缩放的,其中包括HiDPI显示。无论如何,这已经得到解决。请参阅《JEP 263:Windows和Linux上的HiDPI图形》 及其升级

因此,增加字体大小是行不通的(因为这不会增加其余内容);jvm参数-Dsun.java2d.dpiaware=false不起作用(因为它实际上不受支持);并且清单文件+注册表编辑(对于Windows)不起作用。

解决方案:您需要在JRE 9+上运行它,因为它确实支持此功能。


在Java8中,我通过切换清单文件javaw.exe中的dpiAware参数得到了帮助
MisterParser

喜@MisterParser,我在哪里可以找到javaw.exe的manifest文件
Pubudu马赫什Meththananda

4

这个答案解决了我的4K屏幕Ubuntu笔记本电脑上的问题。

在应用程序的配置文件中,我添加了-Dsun.java2d.uiScale=2.5Java参数,现在,在执行后,该应用程序可以很好地缩放并可以使用。


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 "$@"

matchbox-window-manager在这种情况下,最小值是完美的。
引用Eddie

2

我设法按照以下说明对其进行了解决:Link

它是德语,但我会翻译重要的内容。

创建此注册表项:

[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>

将其复制到其中包含java.exe和javaw.exe的bin目录中,并将其命名为java.exe.manifestjavaw.exe.manifest(您将拥有两个内容相同但名称不同的文件)。

HTH。

伯恩德


可悲的是,这似乎并没有改变我。我正在运行32位Java,并不是我知道我可以选择,如果有所作为的话。编辑:实际上,至少对于我而言,可以通过为有问题的单个应用程序创建清单而不是java / javaw.exe来解决问题。Per javahacker.com/eclipse-on-a-high-dpi-display-in-windows
Alex Whittemore

1
@AlexWhittemore阅读链接文章后,我不得不说,这正是它的建议-创建<Application>.exe.manifest文件以禁用DPI缩放。与eferrari所说的不同。
dim8

@ user8我从来没有跟进过,但是是的,链接完全没有说,很好;)
Alex Whittemore

看来此解决方案仅适用于Windows?
Michael Scheper

没有配置注册表项,是否有解决此问题的选项?
Pubudu马赫什Meththananda

0

看来在Linux(Gtk)上,您可以通过在启动应用之前使用以下方法扩展Apps DPI来解决此问题。

export GDK_SCALE=2

(您也可以降低显示器的分辨率,但这根本不是解决方案)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.