Как заставить 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. Но это было бы неприятно.

Тем не менее, похоже, что на этой другой странице есть класс, который может различать изображения с несколькими разрешениями, вам просто нужно его импортировать.

Я все еще изучаю эту вторую ссылку, чтобы посмотреть, как я могу заставить ее работать, но она выглядит многообещающей.

Другие вопросы по тегам