java - 高分辨率(MS Surface)上的不良 Swing UI 缩放

标签 java swing windows-8.1 scaling screen-resolution

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

我的意思是:

scaling issue

谷歌研究让我得出结论,这是由于 Surface 的高分辨率和 Win8 的缩放功能让一些项目看起来更大一些。所以我将缩放比例重置为 100%,它实际上修复了糟糕的缩放比例。

不幸的是,这并不能真正解决我的问题。没有变焦,一切都太小了,所以我宁愿不禁用它。但是有什么聪明的方法可以解决这个问题吗?我可以只“取消缩放”我的程序或 Java 的图标吗?理想情况下,我什至想要放大整个框架,因为一切都相当小。

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

调用对话框
JOptionPane.showMessageDialog(frame, msg, "Information", JOptionPane.INFORMATION_MESSAGE);

顺便说一句。

最佳答案

这是一个讨厌的、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);
}

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

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

关于java - 高分辨率(MS Surface)上的不良 Swing UI 缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30774828/

相关文章:

java - 无法删除 Spring Hateoas 中的资源

java - 使用 Java Swing 时实现 Runnable

c# - Flyout.showAt() 基于内容的 ArgumentException

ruby-on-rails - Bundler::HTTPError 无法从 https://rubygems.org/获取规范

java - Scatter 和 Gather 在 MP J Express 中的工作原理

java - 使用camel的网络服务链

java - Java PHP 中的正则表达式类似于输出

java - 为许多对象初始化引用变量?

java - 有没有办法让 JButtons 换成新行,JOptionPane

css - Windows 8.1 IE Snap View 分屏响应式网页设计