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


75

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


是您的应用程序,您控制源/对象吗?还是现在不可更改的旧版应用程序?
harrymc

3
这不是我的申请;无法控制来源。
杰夫E

坏消息是,您可能需要降低DPI才能运行该应用程序。以下是一些可能有用的黑客资源:修复Windows 10中的字体模糊,Windows 10中的DPI设置Windows 10 DPI模糊。为了以防万一,在尝试之前至少创建一个系统还原点备份。后备解决方案可能是返回Windows7。–
harrymc 2015年

5
@harrymc上面的两个方法有什么帮助?问题不是字体模糊或拒绝运行,而是一切都很。我想要实现“模糊”字体渲染,而且据我了解OP的问题,它们也是如此。将DPI缩放比例设置为100%将使整个系统变小。将显示分辨率设置为非自然分辨率会使所有内容看起来模糊。(好吧,对我来说,没有比1080p显示屏更模糊的了,但是仍然如此。)
millimoose 2015年

1
@harrymc尽管后者可能使该应用程序可用,但我确定您理解为什么回答“如何使X在2160p显示器上工作?”的原因。“使用较差的显示”有点遗漏了重点。
millimoose 2015年

Answers:


37

这里的问题似乎是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


您能详细说明一下#2吗?您确实在清单中修改了哪个设置?
Tomalak

在清单XML中,它是<asmv3:application> <asmv3:windowsSettings>下的<dpiAware>标志
CarlG 2016年

这才是重点。我已经看到了该标记,并将其设置为false,但是应用程序(JNLP / WebStart)都无法正确缩放。您能想到一种简单的方法来交叉检查它是否有效,例如,您知道的测试应用程序对此设置做出了响应?
Tomalak

Webstart特别挑剔,因为很难准确地确定最终使用哪个可执行文件安装了哪个可执行文件。作为交叉检查,我将尝试直接使用java.exe或javaw.exe启动您的应用程序,并跳过JWS以查看是否存在差异。
卡尔·格

4
这介于滑稽和滑稽之间。该框架错误地报告了其功能,并且删除了修复该错误的开关。唯一的解决方法?供最终用户购买第三者工具。人们想知道为什么Java的声誉如此差。
基本

68

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

  1. 查找java.exe您已安装。
  2. 右键单击-> Properties
  3. 转到Compatibility标签
  4. 校验 Override high DPI scaling behavior.
  5. 选择SystemScaling performed by:

5
最佳解决方案-我在运行.jnlp文件时遇到此问题,因此我不得不更改“ C:\ Program Files \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe”,但它的工作原理很像魅力。
Dror Harari

对我来说,这是JDK版本。通过右键单击并在Windows 10从任务管理器中打开的选项找到
布莱恩的Knoblauch

3
对于运行基于Java的Minecraft启动器的Windows 10,我必须更改系统上所有已安装的Java版本才能使其正常运行(java.exe和javaw.exe)。
cyberbit

5
我使用了侵入性较小的变体。我为命令创建了快捷方式,java -jar myJarFile.jar并对该快捷方式(Windows 10,Java 8)执行了步骤2至5。
朱利安·克朗格

1
对我来说,是javaw.exe
masterxilo

14

如果您偶然发现了这个问题,但实际上正在寻找一种可在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


这很好,尽管我希望我可以为JFrames缩放为1,为JOptionPanes获得系统缩放。
NateS

1
对我不起作用。
Atte Juvonen

@AtteJuvonen当它对您不起作用时,不只是告诉“我的车不起作用”,您为什么不发布一个新问题来描述您的尝试,预期结果是什么,实际结果是什么?结果,您使用了哪个命令行,以及收到的错误消息(如果有)?
Christian Hujer

@ChristianHujer我尝试使用该参数启动Java Swing应用程序(与您的答案相同的命令行,但jar的路径不同),并且该应用程序在不缩放的情况下启动。
Atte Juvonen

抱歉,如果我看起来很粗鲁,什么都没做的时候就感到沮丧。FWIW我确实对此发布了一个新问题,并且一旦网站允许我也将在其上发布悬赏。
Atte Juvonen

10

解决方案:在JRE 9上运行它。

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

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

然后,您需要在JRE 9上运行它,因为它确实支持此功能。


如果Java9修复了这个问题,我将非常兴奋。
music2myear

3
这无法指出您必须重新编译代码。只需在Java 9+上运行相同的Java 8应用程序就不会改变行为
Ramhound '17

在Java 9上运行HiDPI程序解决了很多问题。goo.gl/3zmL7b
Gernot Krost

3
@Ramhound您不必重新编译。我刚刚用Java 8的JDK8构建了一个jar,该jar在具有4K屏幕和200%缩放比例设置的W10系统上覆盖了全屏JPanel的paint()方法。使用Java 8的java.exe运行,给该方法的Graphics2D对象的缩放比例为1,而JPanel的getWidth / height为3840x2160。使用Java 9的java.exe运行,缩放比例为2,宽度/高度为1920x1080。
Dreamspace总裁

1
您将在Java 9中找到一个新方法:Screen.getPrimary()。getOutputScaleX(); 确实有效。(另一种选择是使用有效的JavaFX屏幕大小(Screen.getPrimary()。getVisualBounds()),然后将其除以Toolkit.getDefaultToolkit()。getScreenSize(),您会发现您可能会猜到在选择的DPI时:200%会导致大约2.0,但不幸的是125%仍会导致1.0缩放百分比。但是,即使使用Java9,我也发现:随着按钮的扩展,我的GUI都被完全破坏了,但是其中一些常数(用于缝隙,填充物等)。不是
。– wax_lyrical

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缩放设置。


2

您需要在regedit中设置PreferExternalManifest并为java.exe和javaw.exe创建自定义清单,如以下stackoverflow答案 https://stackoverflow.com/a/39372897所示


3
好消息,Fall Creators更新允许您通过右键单击项目,选择属性,然后选择“兼容性”选项卡来更改缩放行为。不再需要创建自定义的外部清单-很好。
理查德

0

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


0

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


-2

我尝试了大多数这些解决方案,但是对我有用的解决方案是在以下位置找到的文件上设置系统兼容模式:

C:\Program Files (x86)\Common Files\Oracle\Java\javapath

2
欢迎来到超级用户!请不要添加“谢谢”或“这对我有用”作为答案。在网站上花费一些时间,您将获得足够的特权来投票赞成您喜欢的答案,这是超级用户说谢谢的方式。
bertieb '18

这可能是对他人答案的评论。要修复,必须将兼容性设置应用到java.exe和/ javaw.exe或使用其他建议。该javapath文件夹包含指向系统上安装的最新Java可执行文件的链接。因此,应用设置Program Files就足够了。
Alexey Ivanov

-4

使用以下命令提示符运行时,我能够获得合理的dpi:

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

这并不能真正回答问题,也不会更改java.exe或的任何高DPI设置javaw.exe
Alexey Ivanov
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.