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

时间:2009-07-09 06:51:52

标签: java swing testing accessibility dpi

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

我想这样做是因为我不想强迫用户重新启动Windows,因为很多Windows应用程序似乎都遇到了DPI设置非常高的问题(> 120)

PS:我知道Substance LaF允许在运行时缩放字体大小,但这样只调整控件的高度,而不是宽度。我希望我的GUI完全缩放,如果我设置系统的DPI设置会发生。

3 个答案:

答案 0 :(得分:5)

不知道是否可能。外观和感觉必须支持它,据我所知,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);
    }
}

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

答案 1 :(得分:1)

所以实际答案似乎是:不,你不能。这真是一个无赖,因为测试是一种痛苦。

答案 2 :(得分:1)

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

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

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

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