高分辨率(MS Surface)上的错误Swing UI缩放

Mac*_*lin 9 java scaling swing screen-resolution windows-8.1

我目前正在开发一个涉及Swing GUI的小型Java应用程序.在我的开发PC上,一切看起来都很好但是当我在MS Surface上运行它时,一些图标似乎对于组件而言太大(或者组件对于图标来说太小).

这就是我的意思:

扩展问题

谷歌的研究让我得出结论,这是由于Surface的高分辨率和Win8的缩放让一些项目显得更大.所以我将缩放重置为100%,它实际上修复了不良缩放.

不幸的是,这并没有真正解决我的问题.没有变焦,一切都太小了,所以我宁愿不要禁用它.但有没有聪明的方法来解决这个问题?我可以"缩放"我的程序或Java的图标吗?理想情况下,我甚至想要升级整个画面,因为一切都很小.

编辑:显然,我也试过调整实际的JFrame,但它对对话框的大小没有影响.我正在通过调用对话框

JOptionPane.showMessageDialog(frame, msg, "Information", JOptionPane.INFORMATION_MESSAGE);
Run Code Online (Sandbox Code Playgroud)

顺便说说.

小智 5

这是一个令人讨厌的、hacky 的快速修复解决方案,它将通过将 Swing 自己的图标大小调整到 80% 来停止令人讨厌的裁剪。

在 中main,添加以下内容:

String[] iconOpts = {"OptionPane.errorIcon", 
  "OptionPane.informationIcon", 
  "OptionPane.warningIcon", 
  "OptionPane.questionIcon"};
for (String key : iconOpts) {
  ImageIcon icon = (ImageIcon) UIManager.get(key);
  Image img = icon.getImage();
  BufferedImage bi = new BufferedImage(
          img.getWidth(null), img.getHeight(null), 
          BufferedImage.TYPE_INT_ARGB);
  java.awt.Graphics g = bi.createGraphics();
  g.drawImage(img, 0, 0, 
          (int) (img.getWidth(null) * 0.8), 
          (int) (img.getHeight(null) * 0.8), null);
  ImageIcon newIcon = new ImageIcon(bi);
  UIManager.put(key, newIcon);
}
Run Code Online (Sandbox Code Playgroud)

您可能需要首先检查这是否确实需要 - Windows 8/10 默认为 125%,但有些人会将其切换回 100%。我还没有找到一种优雅的方法来做到这一点,但是沿着这些思路的一些东西会给你一个想法:

java.awt.Font font = (java.awt.Font) UIManager.get("Label.font");
if (font.getSize() != 11) {
    //resize icons in here
}
Run Code Online (Sandbox Code Playgroud)