我下载并安装了最新的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 API中存在MultiResolutionImage类,但它还没有被Windows上的Java .awt. toolkit使用。用于创建Java 9 multiresoltionimage实例的代码存在于特定于OS x的Java .awt. toolkit实例中。
我的假设是这仍然在Oracle的待办事项列表中,作为向Java 9添加HiDPI支持的一部分。
在本节中,OpenJDK描述了java.awt.image的API。graphics的目的是根据DPI指标检索权限。
在那之前,我想你可以检查DPI比例因子,然后用DPI比例的分辨率绘制图像。但那会令人沮丧。
然而,看起来这另一个页面有一个类,可能能够区分多分辨率图像,你只需要导入它。
我还在研究第二个链接,看看我怎么能让它工作,但它看起来很有希望。