我试图在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应用程序?
Answers:
这里的问题似乎是Swing在默认情况下声称它是DPI感知的,因此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
false
,但是应用程序(JNLP / WebStart)都无法正确缩放。您能想到一种简单的方法来交叉检查它是否有效,例如,您知道的测试应用程序对此设置做出了响应?
刚刚在我的Windows 10计算机上找到了一个简单的解决方案:
java.exe
您已安装。Properties
Compatibility
标签Override high DPI scaling behavior.
System
的Scaling performed by:
java -jar myJarFile.jar
并对该快捷方式(Windows 10,Java 8)执行了步骤2至5。
javaw.exe
如果您偶然发现了这个问题,但实际上正在寻找一种可在Linux上运行的解决方案,则适合您。
如果可以在java
启动应用程序的二进制文件中添加参数,则可以使用该选项-D
传递sun.java2d.uiScale
属性值,以指定Java2D的缩放因子。这将扩展您的应用程序。比例因子值为双精度。确保将此选项传递给java
二进制文件本身,而不是传递给已启动的Java应用程序。
示例:使用UI缩放因子2.5启动NearInfinity.jar
java -Dsun.java2d.uiScale=2.5 -jar ~/jars/NearInfinity.jar
我发现本文对于在HiDPI系统上运行Linux总体上非常有用,并且某些事情在Windows上也可能适用:https ://wiki.archlinux.org/index.php/HiDPI
解决方案:在JRE 9上运行它。
这是因为Java运行时声明自己是“可感知DPI的”,但实际上并没有为AWT和Swing支持它。Java应用程序的大小和渲染是基于像素而不是适当缩放的,其中包括HiDPI显示。无论如何,这已经得到解决。请参阅《JEP 263:Windows和Linux上的HiDPI图形》 及其升级。
因此,增加字体大小是行不通的(因为这不会增加其余内容);jvm参数-Dsun.java2d.dpiaware=false
不起作用(因为它实际上不受支持);并且清单文件+注册表编辑(对于Windows)不起作用。
然后,您需要在JRE 9上运行它,因为它确实支持此功能。
要强制所有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缩放设置。
您需要在regedit中设置PreferExternalManifest并为java.exe和javaw.exe创建自定义清单,如以下stackoverflow答案 https://stackoverflow.com/a/39372897所示
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
试试Java 10。
我发现-Dsun.java2d.dpiaware = false在Java 9或10中不起作用。对于Java 8和9,我的swing应用程序很小,但是Java 10在Windows中的大小正确!
因此对于可以从bat文件运行的应用程序,例如:java -jar xxx.jar
我只是在bat文件中添加了JAVA_HOME = .... \ java_10和PATH =%JAVA_HOME%\ bin;%PATH%。
java -jar xxx.jar
我尝试了大多数这些解决方案,但是对我有用的解决方案是在以下位置找到的文件上设置系统兼容模式:
C:\Program Files (x86)\Common Files\Oracle\Java\javapath
java.exe
和/ javaw.exe
或使用其他建议。该javapath
文件夹包含指向系统上安装的最新Java可执行文件的链接。因此,应用设置Program Files
就足够了。
使用以下命令提示符运行时,我能够获得合理的dpi:
%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar
java.exe
或的任何高DPI设置javaw.exe
。