2016-10-09 4 views
5

Я загрузил и установил последнюю версию раннего доступа Java 9, и был рад найти, что приложение Java Swing в Windows теперь отображает компоненты в правильном размере. Больше не нужно, чтобы мои клиенты с дисплеями HiDPI использовали мое приложение с половиной намеченной ширины и высоты.Как заставить Java 9 использовать изображения с более высоким разрешением на дисплее HiDPI?

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

У меня есть полный набор всех значков как с нормальным размером (например, foobar.png), так и с двойной шириной/высотой (например, [email protected]). Я использую соглашения об именах 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); 
     }); 
    } 
} 

Я думаю, что такой класс должен быть, но я не могу его найти.

+0

До сих пор я нашел класс в Java 9 под названием java.awt.image.MultiResolutionImage, который предполагает, что он делает то, что я хочу. Я все еще ищу информацию о том, как заставить его работать. –

ответ

1

После изучения исходного кода Java 9, мой вывод состоит в том, что, хотя класс класса MultiResolutionImage существует в Java API, он еще не используется java.awt.Toolkit в Windows. Код для создания экземпляров Java 9 MultiResolutionImage присутствует в конкретном экземпляре java.awt.Toolkit для OS X.

Мое предположение, что это до сих пор в списке TODO Oracle как часть добавления поддержки HiDPI на Java 9.

+3

См. Также [* JEP 251: изображения с несколькими разрешениями *] (http://openjdk.java.net/jeps/251). – trashgod

+0

Текущие документы для BaseMultiResolutionImage, по-видимому, подразумевают, что он каким-то образом смотрит на DPI графического объекта, в который он втягивается, и выбирает наименьшее полезное изображение, но то, как он использует графический объект для этого, пока не ясен. – Trejkaz

0

В this разделе OpenJDK описывает API для java.awt.Image. java.awt.Graphics предназначена для получения права на основе показателей DPI.

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

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

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

+0

«вы можете проверить коэффициент масштабирования DPI» ... Я не могу найти способ сделать это в Java 9 на Windows еще ... знаете ли вы способ? –

Смежные вопросы