8

我下载并安装了最新的 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);
        });
    }
}

我想一定有这样的课,但我找不到。

4

2 回答 2

1

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

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

于 2016-10-09T09:40:52.483 回答
0

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

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

但是,看起来这个其他页面有一个类可以区分多分辨率图像,您只需要导入它。

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

于 2016-10-09T14:33:42.963 回答