【问题标题】:How to make Java 9 use higher-resolution images on HiDPI display?如何让 Java 9 在 HiDPI 显示器上使用更高分辨率的图像?
【发布时间】:2016-10-09 23:23:52
【问题描述】:

我下载并安装了最新的 Java 9 早期访问版本,并且很高兴地发现 Windows 上的 Java Swing 应用程序现在可以以正确的大小呈现组件。使用 HiDPI 显示器的客户不再需要以预期宽度和高度的一半使用我的应用。

但是我注意到,在我的 Swing 应用程序中,我自己的图标只是被缩放为宽度和高度的两倍,使它们看起来锯齿状。

我确实有一整套正常大小(例如 foobar.png)和双倍宽度/高度(例如 foobar@2x.png)的所有图标。我使用 Apple 命名约定。

如何让 Java 9 在可用时轻松查找和使用更高分辨率版本的图像,而无需为此手动编码?

代码示例总是让问题更清晰,那么 Java 9 是否有一个多分辨率图标类,我可以使用它来编译和运行以下代码?

import javax.swing.*;

public class ScratchSpace {

    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("I work in HiDPI!");

            // can I replace the following line with some magical new method that automatically loads the same icon at multiple resolutions
            // so that Swing chooses the correct one when rendering, depending on the current scale of the current display?
            Icon icon = new IconWithMultipleSizes("foobar.png");

            JLabel label = new JLabel("I'm a label with an icon.", icon, SwingConstants.LEFT);
            frame.setContentPane(label);

            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

我觉得应该有这么一个类,但是找不到。

【问题讨论】:

  • 到目前为止,我在 Java 9 中找到了一个名为 java.awt.image.MultiResolutionImage 的类,表明它可以满足我的需求。我仍在寻找有关如何使其工作的信息。
  • 我想你没有找到好的解决方案?

标签: java macos swing java-9 hidpi


【解决方案1】:

仔细阅读 Java 9 源代码后,我的结论是,尽管 Java API 中存在 MultiResolutionImage 类,但它还没有被 Windows 上的 java.awt.Toolkit 使用。用于创建 Java 9 MultiResolutionImage 实例的代码存在于 OS X 特定的 java.awt.Toolkit 实例中。

我的假设是,作为向 Java 9 添加 HiDPI 支持的一部分,这仍然在 Oracle 的待办事项列表中。

【讨论】:

  • BaseMultiResolutionImage 的当前文档似乎暗示它以某种方式查看正在绘制的图形对象的 DPI 并选择最小的可用图像,但它如何使用图形对象来做到这一点并不是对我来说还很清楚。
【解决方案2】:

在 OpenJDK 的 this 部分中描述了一个用于 java.awt.image 的 API。 java.awt.Graphics 旨在根据 DPI 指标检索权限。

在那之前,我想您可以检查 DPI 比例因子,然后以该 DPI 比例的分辨率绘制图像。但这会令人沮丧。

不过,this other page 似乎有一个类可以区分多分辨率图像,您只需导入它即可。

我仍在研究第二个链接以了解如何使其工作,但它看起来很有希望。

【讨论】:

  • “您可以检查 DPI 比例因子”...我在 Windows 上的 Java 9 中找不到执行此操作的方法...您知道方法吗?
  • “此其他页面有一个类”中的链接断开。为类命名以便可以搜索它会很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多