如何让Java 9在HiDPI显示器上使用更高分辨率的图像?

Ste*_*eod 6 java macos swing java-9 hidpi

我下载并安装了最新的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);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为必须有这样一堂课,但我找不到.

Ste*_*eod 2

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

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