Поддержка Apple Retina Display в Java JDK 1.7 для AWT/Swing

Мне стало известно, что AWT/Swing под Java JDK 1.7 (с JDK 7u15) не поддерживает дисплеи Retina на Apple Macbook Pros. Например, Netbeans почти невыносимо использовать более нескольких минут на дисплее Retina и использовать JDK 1.7.

Это было несколько рассмотрено в вопросе StackExchange здесь и цитировалось одно конкретное сообщение:

Apple Java 6 JRE будет поддерживать HiDPI, однако в настоящее время он не поддерживается Oracle Java 7 JRE. Он также не работает в соответствии с последними версиями Java. Приложения Swing и JavaFX размыты на Retinia MacBook. Вот почему IntelliJ по-прежнему работает под Java 6.

Мой вопрос более конкретный, чем то, что задает OP из вышеуказанного потока.

Мой работодатель менее месяца использует Swing во всех своих приложениях. По нескольким причинам мы заинтересованы в переносе на Java 7 с Java 6. В течение последних нескольких дней другой разработчик (который находится в Windows) переместил нашу платформу на Java 7. Когда я запускаю сетчатку Macbook Pro, я заметил проблема, когда я вытащил последнюю стабильную ветвь нашего кода.

Я новичок в Java с менее чем годам опыта работы в сообществе, поэтому мой вопрос: будет ли сообщество Java довольно чутко реагировать на эту проблему, продвигаясь вперед или следует ожидать существенную задержку (от месяцев до года или более), прежде чем Swing в Java 7 совместим с дисплеями Apple Retina?

Ответ 1

Java 7u40 Early Access теперь поддерживает дисплеи HiDPI (Retina), как показано этим списком изменений. Таким образом, поддержка сетчатки теперь доступна:

  • Java 6
  • Java 7u40ea или выше
  • Java 8

Ответ 2

в прошлом месяце меня тоже интересовала одна и та же тема, и через некоторое время я узнал в сети, что никто не может точно ответить на вопрос.

В Oracle есть открытая ошибка: http://bugs.sun.com/view_bug.do?bug_id=8000629

В соответствии с этим он должен быть исправлен для Java 1.8. Но я боюсь, что я не уверен, что он также будет исправлен для Swing или только для JavaFX. Я где-то читал, что уже есть исправление для JavaFX (но не уверен, что официальный), что не решает проблему для Swing.

Чтобы ответить коротко, после нескольких дней поиска в Интернете, к сожалению, я не смог найти ответ...

С уважением, Любош

Ответ 3

Retina полностью поддерживается Oracle начиная с 1.7.0_40ea. Тем не менее, есть недостатки API для Retina. Например, поддержка HiDPIScaledImages не поддерживается, как в Apple JDK. Вы можете найти несколько полезных советов о поддержке Retina в Oracle JDK здесь http://bulenkov.com/2013/06/23/retina-support-in-oracle-jdk-1-7/

Ответ 4

Согласно длинной теме, которую я прочитал несколько месяцев назад (http://lists.apple.com/archives/java-dev/2012/Oct/msg00127.html), единственный способ получить Retina в Swing - установить Apple JDK, который, в свою очередь, просто использует "взломать", чтобы приложения совместимы с сетчаткой. В этой теме упоминается JavaFX как обходной путь (который, конечно же, не является обходным путем, когда у вас уже есть сложная часть программного обеспечения, написанная в Swing).

Я сам пытался написать простое приложение JavaFX с Java 7 после прочтения вышеприведенного потока, и он выглядел острее на Retina; то же самое с Ensamble (демонстрационное приложение JavaFX, доступное в App Store), которое также показалось намного лучше обычного приложения Swing (например, панели управления Java), но, возможно, это просто сила предложения.

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

Наш лучший выбор прямо сейчас (просто мнение, не имеет никаких секретных знаний) заключается в том, что кто-то из Oracle (или участник OpenJDK) купит сетчатку mac и исправит ее на Java 8. Я не думаю, что Apple исправит его, предоставив исправления Java 6, так как парень из Apple сказал, что они просто вернули код, связанный с возвратом в Quartz. Это дало желаемый результат, но сильно привязано к собственным внутренним элементам OS X, которые не являются открытыми.