如何在高 DPI 显示器上升级运行 Java 应用程序?

如何在高 DPI 显示器上升级运行 Java 应用程序?

我正在尝试在 Windows 10 的高 DPI 显示器上运行 Java 应用程序(JAR 文件)。该应用程序使用 Swing,因此不支持 DPI。通常,当我运行不支持 DPI 的应用程序时,Windows 会为我缩放它,尽管会很模糊。但出于某种原因,它不会缩放 Java 应用程序;我只会在角落看到一个很小的窗口,里面有无法阅读的文本。如何在 Windows 的高 DPI(模糊)缩放下运行 Java 应用程序?

答案1

这里的问题似乎是 Swing 默认声称它是 DPI 感知的,因此 Windows 不会缩放它。使用此开关关闭此行为,Windows 将开始缩放您的 Swing 应用程序:

-Dsun.java2d.dpiaware=false

[编辑:不幸的是,这个标志似乎在 Java 8 中不再起作用,我在 Java 6 中测试了它。看起来这是一个已知问题

[编辑 2:您可以使用程序修改 EXE 清单,以修改 Java 8 安装以使其正常工作。我在 java.exe 和 javaw.exe 内的清单中将设置从 true 更改为 false,现在我的 Swing 程序可以在 Windows 10 高 dpi 中正确缩放。我使用了资源调谐器对此。

[编辑 3] 只需使用 Java 9

答案2

刚刚在我的 Windows 10 机器上找到了一个简单的解决方案:

  1. 发现java.exe你已安装。
  2. 右击 ->Properties
  3. 转到Compatibility标签
  4. 查看 Override high DPI scaling behavior.
  5. 选择SystemScaling performed by:

答案3

如果您偶然发现了这个问题但实际上正在寻找适用于 Linux 的解决方案,那么这适合您。

如果您可以java向启动应用程序的二进制文件添加参数,则可以使用选项-D为属性传递一个值,sun.java2d.uiScale以指定 Java2D 的缩放因子。这将缩放您的应用程序。缩放因子值是双精度值。请确保将此选项传递给java二进制文件本身,而不是已启动的 Java 应用程序。

示例:以 2.5 的 UI 缩放系数启动 NearInfinity.jar

java -Dsun.java2d.uiScale=2.5 -jar ~/jars/NearInfinity.jar

或者,您可以设置GDK_SCALE环境变量。例如:

GDK_SCALE=2 java -jar ~/jars/NearInfinity.jar

我发现这篇 ArchLinux Wiki 文章通常对于在 HiDPI 系统上运行 Linux 非常有用,并且某些功能可能在 Windows 上也能运行。

答案4

要强制所有 java 可执行文件的“属性 > 兼容性 > dpi 缩放模式”设置为“系统”,请在管理员 powershell(win-x,a)中运行:

$javaexes = (Get-ChildItem -path "$env:ProgramFiles\Java","${env:ProgramFiles(x86)}\java" -filter java?.exe -recurse  | Where-Object {$_.Name -match "java(|w).exe"} ).fullname

$javaexes | foreach {REG ADD "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"  /V $_ /T REG_SZ /D "~ DPIUNAWARE" /F}

撤销:

$javaexes | foreach {REG delete "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"  /V $_ /f}

您可以使用 HKLM 代替 HKCU,但这样您就无法再在 java*.exe 文件的属性 > 兼容性对话框中手动更改 dpi 缩放设置。

相关内容