2015-10-18 16:43:09 +0000 2015-10-18 16:43:09 +0000
81
81
Advertisement

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

Advertisement

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

Advertisement

答案 (10)

77
77
77
2017-05-10 18:10:25 +0000

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

1、找到你安装的java.exe。 2. 右键 -> Properties 3. 进入Compatibility选项卡 4. 检查 Override high DPI scaling behavior. 5. 为System选择Scaling performed by:

38
38
38
2015-12-01 18:31:58 +0000

这里的问题似乎是Swing在默认情况下声称它是DPI意识,所以windows不会缩放它。使用这个开关来关闭这个行为,windows将开始缩放你的swing应用程序。

-Dsun.java2d.dpiaware=false

[ EDIT: 不幸的是,这个标志在Java 8中似乎不再起作用了,我是在Java 6中测试的。看起来这是一个已知问题.] 。 [ EDIT 2:你可以修改Java 8的安装来正确工作,使用一个程序来修改EXE清单。我把java.exe和javaw.exe里面的manifests的设置从true改成了false,现在我的Swing程序在Windows 10高dpi下可以正确缩放。我用资源调谐器来这个。]

[编辑3]用Java 9就可以了。

15
Advertisement
15
15
2017-04-02 09:11:49 +0000

如果你偶然发现了这个问题,但实际上是在寻找一个能在Linux上工作的解决方案,这是给你的。

如果你可以在启动应用程序的java二进制中添加参数,你可以使用选项-Dsun.java2d.uiScale属性传递一个值,为Java2D指定一个缩放因子。这将使你的应用程序缩放。缩放因子的值是一个双倍。确保你把这个选项传递给java二进制本身,而不是启动的Java应用程序。

示例: 启动NearInfinity.jar,UI缩放因子为2.5

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

我发现这篇文章对于在HiDPI系统上运行Linux相当有用,有些东西在Windows上也可能适用。 https://wiki.archlinux.org/index.php/HiDPI

11
11
11
2017-08-01 00:05:58 +0000

解决办法:在JRE 9上运行。在JRE 9上运行

这是因为Java运行时宣称自己是 “DPI-aware",但并没有真正支持AWT和Swing。Java应用程序的大小和渲染基于像素,而不是正确的缩放,这包括HiDPI显示。无论如何,这个问题最近已经解决了。请看问题 JEP 263: HiDPI Graphics on Windows and Linux 升级

所以,增大字体大小不起作用(因为它并没有增大其余的东西);jvm参数-Dsun.java2d.dpiaware=false不起作用(因为它并不真正被支持);manifest文件+注册表编辑(对于Windows)就是不起作用。

那么,你需要在JRE 9上运行它,因为它真的支持这个功能。

4
Advertisement
4
4
2017-12-13 12:08:20 +0000

要强制所有的java可执行文件将 “properties 兼容性/dpi缩放模式 "设置为 "系统",在管理员shell(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文件的properties 兼容性对话框中手动更改dpi缩放设置了。

2
2
2
2017-01-08 17:29:02 +0000

你需要在regedit中设置PreferExternalManifest,并为java.exe和javaw.exe创建自定义的manifest,如下stackoverflow answe https://stackoverflow.com/a/39372897

0
Advertisement
0
0
2018-07-07 21:40:12 +0000

试试Java 10。

我发现-Dun.java2d.dpiaware=false在Java 9或10中不起作用。另外对于Java 8和9来说,我的swing应用很小,但Java 10在windows下大小合适!我的应用在windows下大小合适。

所以对于一个你可以从bat文件中运行的应用,比如:java -jar xxx.jar

我只是在bat文件中添加了JAVA/HOME…./java10和PATH=%JAVA/HOME%/bin;%PATH%。

java -jar xxx.jar

0
0
0
2018-02-04 04:21:52 +0000

Elderry的解决方案很好,但是如果你想在Windows上运行一个jar文件,而它又没有兼容选项怎么办?

进入C:\Program Files (x86)\Java\jre\bin,找到javaw.exe。右键,属性,兼容性选项卡,勾选 “覆盖高DPI缩放行为",然后选择 "系统"(注意,"系统增强型 "对我不起作用)。

现在,jar文件的窗口应该能正确地缩放,并有可读的文本。如果没有,可能意味着Windows没有像它应该的那样将jar类型的文件链接到javaw.eve。第三方的修复方法可以在下面找到。 https://johann.loefflmann.net/en/software/jarfix/index.html

-2
Advertisement
-2
-2
2018-11-30 15:06:18 +0000

我尝试了大部分的解决方案,但对我有效的是在以下位置的文件上设置系统兼容模式。

C:\Program Files (x86)\Common Files\Oracle\Java\javapath
-4
-4
-4
2016-08-03 22:14:50 +0000

当我使用命令提示符运行时,我能够得到合理的dpi,如。

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar
Advertisement