Как заставить Java 9 использовать изображения с более высоким разрешением на дисплее HiDPI?
Я скачал и установил последнюю версию Java 9 с ранним доступом и был рад обнаружить, что приложение Java Swing в Windows теперь отображает компоненты в правильном размере. Больше не нужно, чтобы мои клиенты с дисплеями 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 ответа
Изучив исходный код Java 9, я пришел к выводу, что хотя в Java API существует класс MultiResolutionImage, он еще не используется java.awt.Toolkit в Windows. Код для создания экземпляров Java 9 MultiResolutionImage присутствует в специфическом для OS X экземпляре java.awt.Toolkit.
Я предполагаю, что это все еще находится в списке задач Oracle как часть добавления поддержки HiDPI в Java 9.
В этом разделе OpenJDK описывается API для java.awt.image. java.awt.Graphics предназначена для получения прав на основе метрик DPI.
До тех пор, я думаю, вы могли бы проверить масштабный коэффициент DPI, а затем нарисовать изображение с разрешением этого масштаба DPI. Но это было бы неприятно.
Тем не менее, похоже, что на этой другой странице есть класс, который может различать изображения с несколькими разрешениями, вам просто нужно его импортировать.
Я все еще изучаю эту вторую ссылку, чтобы посмотреть, как я могу заставить ее работать, но она выглядит многообещающей.