我能否在不改变系统DPI设置的情况下设置我的Java Swing应用程序的DPI分辨率?

14

我有一个使用Substance LookAndFeel 的 Java 应用程序,目标平台是 Windows,我想要增加应用程序的 DPI 设置,但不更改系统设置。

我希望这样做是因为我不想强制用户重新启动 Windows,而且许多 Windows 应用程序似乎在非常高的 DPI 设置(> 120)下存在问题。

附注:我知道 Substance LaF 允许在运行时缩放字体大小,但这种方式只会缩放我的控件的高度,而不是宽度。我希望我的 GUI 能够完全按比例缩放,就像设置系统的 DPI 设置一样。


2
+1,我也正想问同样的问题。 :) - Epaga
3个回答

7

不确定是否可能。外观和感觉必须支持它,据我所知,Windows外观和感觉不支持。这里有一个你可以考虑的技巧:遍历你的外观和感觉中定义的所有字体,并重新定义它们为稍微更大的字体。下面是一个实现这个技巧的代码片段:

for (Iterator i = UIManager.getLookAndFeelDefaults().keySet().iterator(); i.hasNext();) {
    String key = (String) i.next();
    if(key.endsWith(".font")) {
        Font font = UIManager.getFont(key);
        Font biggerFont = font.deriveFont(2.0f*font.getSize2D());
        // change ui default to bigger font
        UIManager.put(key,biggerFont);
    }
}

我想你可以进一步重新定义比例尺的边界,但这会很快变得非常复杂。


2
如果您的 UIManager 具有不是 Strings 的键,则会抛出 ClassCastException - uckelman
1
为了解决我的问题,我添加了toString到结尾。字符串键=(字符串)i.next().toString(); - Joseph Selvaraj

2

是的,你可以这样做,但需要在 JRE 9 上运行。

这是因为Java运行时声明自己是“DPI感知”,但实际上并不支持AWT和Swing。 Java应用程序基于像素大小调整大小和呈现,而不是正确进行缩放,包括HiDPI显示屏幕。 不管怎样,最近已经解决了这个问题。 请参见问题 JEP 263:在Windows和Linux上使用HiDPI Graphics 以及升级

因此,增加字体大小不起作用(因为它不会增加其他内容); jvm参数-Dsun.java2d.dpiaware=false不起作用(因为它实际上没有得到支持);而清单文件+注册表编辑(针对Windows)则无效。

解决方案:您需要在 JRE 9 上运行它,因为它确实支持此功能。


2

实际上的答案似乎是:不行。这真是令人失望,因为测试很麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接