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

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

但是我注意到,在我的Swing应用程序中,我的自定义图标只被缩放为双倍的宽度和高度,使它们看起来很模糊。

我有一个完整的所有图标集,包括正常尺寸(例如foobar.png)和双倍宽度/高度(例如foobar@2x.png)。我使用苹果的命名约定。

如何让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的类,它似乎可以实现我想要的功能。我仍在寻找有关如何使其正常工作的信息。 - Steve McLeod
你是否找到了一个好的解决方案? - Luke Usherwood
2个回答

2
在查看了Java 9的源代码后,我的结论是尽管Java API中存在MultiResolutionImage类,但在Windows上java.awt.Toolkit尚未使用它。创建Java 9 MultiResolutionImage实例的代码存在于OS X特定的java.awt.Toolkit实例中。我的假设是这仍在Oracle的待办事项清单中,作为向Java 9添加HiDPI支持的一部分。

BaseMultiResolutionImage的当前文档似乎暗示它会查看被绘制到其中的图形对象的DPI并选择最小可用的图像,但它如何使用图形对象来实现这一点对我来说还不清楚。 - Hakanai

1
在OpenJDK的this部分,描述了一个java.awt.image的API。java.awt.Graphics旨在根据DPI度量标准检索正确的图像。
在那之前,我想您可以检查DPI比例因子,然后使用该DPI比例的分辨率绘制图像。但那会令人沮丧。
然而,看起来this other page有一个类,可以区分多种分辨率的图像,您只需要导入它。
我仍在研究这个第二个链接,看看如何让它工作,但看起来很有前途。

你可以检查DPI缩放因子...我还没有找到在Windows上使用Java 9实现的方法...你知道吗? - Steve McLeod
“this other page has a class”中的链接已损坏。给该类命名将非常有用,以便进行搜索。 - Luke Usherwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接