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

时间:2016-10-09 08:44:20

标签: 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);
        });
    }
}

我认为必须有这样的课程,但我找不到它。

2 个答案:

答案 0 :(得分:1)

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

我的假设是,这仍然是Oracle的todo列表,作为向Java 9添加HiDPI支持的一部分。

答案 1 :(得分:0)

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

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

然而,看起来this other page有一个类可能能够区分多分辨率图像,您只需要导入它。

我还在调查第二个链接,看看我是如何让它工作的,但看起来很有希望。