【问题标题】:Can I set the DPI resolution of my Java Swing application without changing the systems' DPI setting?我可以在不更改系统的 DPI 设置的情况下设置我的 Java Swing 应用程序的 DPI 分辨率吗?
【发布时间】:2010-11-09 06:55:09
【问题描述】:

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

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

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

【问题讨论】:

  • +1,只是想问同样的问题。 :)

标签: java swing testing accessibility dpi


【解决方案1】:

不知道这是否可能。外观必须支持它,据我所知,Windows 外观不支持。这是您可能会考虑的一个技巧:遍历外观中定义的所有字体并将它们重新定义为稍大一些。这是执行此操作的代码 sn-p:

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);
    }
}

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

【讨论】:

  • 如果你的UIManager 有不是Strings 的键,那么这将抛出一个ClassCastException。
  • 添加 toString 为我解决了这个问题 String key = (String) i.next().toString();
【解决方案2】:

所以实际的答案似乎是:不,你不能。这真的很糟糕,因为测试起来很痛苦。

【讨论】:

    【解决方案3】:

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

    这是因为 Java 运行时声明自己是“DPI 感知的”,但对于 AWT 和 Swing 并不真正支持它。 Java 应用程序的大小和渲染基于像素而不是适当缩放,这包括 HiDPI 显示。 无论如何,最近已经解决了这个问题。 查看问题JEP 263: HiDPI Graphics on Windows and Linux 和upgrade。

    所以,增加字体大小不起作用(因为它不会增加其余的东西); jvm 参数-Dsun.java2d.dpiaware=false 不起作用(因为它并没有真正得到支持);并且清单文件 + 注册表编辑(对于 Windows)不起作用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 2011-05-24
      • 1970-01-01
      相关资源
      最近更新 更多