如何在高DPI显示器上高倍运行Java应用程序?
我试图在Windows 10的高DPI显示器上运行一个Java应用程序(JAR文件)。该应用程序使用Swing,因此不支持DPI。通常情况下,当我运行一个不识别DPI的应用程序时,Windows会为我缩放它,尽管很模糊。但由于某些原因,它没有缩放Java应用程序;我只是在角落里得到一个小小的窗口,上面有无法阅读的文字。我如何在Windows的高DPI(模糊)缩放下运行Java应用?
我试图在Windows 10的高DPI显示器上运行一个Java应用程序(JAR文件)。该应用程序使用Swing,因此不支持DPI。通常情况下,当我运行一个不识别DPI的应用程序时,Windows会为我缩放它,尽管很模糊。但由于某些原因,它没有缩放Java应用程序;我只是在角落里得到一个小小的窗口,上面有无法阅读的文字。我如何在Windows的高DPI(模糊)缩放下运行Java应用?
这里的问题似乎是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就可以了。
如果你偶然发现了这个问题,但实际上是在寻找一个能在Linux上工作的解决方案,这是给你的。
如果你可以在启动应用程序的java
二进制中添加参数,你可以使用选项-D
为sun.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
解决办法:在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上运行它,因为它真的支持这个功能。
要强制所有的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缩放设置了。
你需要在regedit中设置PreferExternalManifest,并为java.exe和javaw.exe创建自定义的manifest,如下stackoverflow answe https://stackoverflow.com/a/39372897 。
试试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
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
我尝试了大部分的解决方案,但对我有效的是在以下位置的文件上设置系统兼容模式。
C:\Program Files (x86)\Common Files\Oracle\Java\javapath
当我使用命令提示符运行时,我能够得到合理的dpi,如。
%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar