Upload
others
View
14
Download
0
Embed Size (px)
Citation preview
1
Новые возможности Desktop JavaИгорь НекрестьяновSun Microsystems
1
2
Java SE 6, Update 10
Consumer JREProject Hamburg
Java SE 6, Update X
Java SE 6, Update N
• Нетипичный update release• Большой шаг вперед в области desktop Java
3
План• UI
> Nimbus Look and Feel> Непрямоугольные прозрачные окна
• Апплеты и Webstart> Новый Java плагин> JNLP апплеты> Deployment Toolkit
• Время старта Java приложений> Java Kernel> Java Quick Starter
• Вопросы
4
Metal
5
Nimbus: новый LAF
6
Nimbus: обзор• Основан на
> Synth> Векторной графике
– Масштабируемые компоненты> “декораторах” (painters)
– Дает возможность переопределить любое поведение LAF• Кросплатформенный• Расширяемый и настраиваемый
> Брендинг: цветовые темы, скины, расширения• Не включен по умолчанию
7
Пример использования Nimbusfor (LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels() { if (“Nimbus”.equals(laf.getName())) { UIManager.setLookAndFeel(laf.getClassName()); }}
UIManager.setLookAndFeel( “com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel”);
Почему не просто:
• В Java 7 ...> Nimbus будет перенесен в javax.swing.plaf.nimbus> Пакеты java.* не могут изменяться в обновлениях
• Пользователь может использовать runtime без Nimbus
8
Масштабируемые компоненты
Пример использования:JButton btn = new JButton(“Click Me”);btn.putClientProperty("JComponent.sizeVariant","large");
9
Цветовые темы
Перед установкой LAF: UIManager.put("nimbusBase",new Color(...)); UIManager.put("nimbusBlueGrey", new Color(...)); UIManager.put("control", new Color(...));
10
Векторность• Все компоненты Nimbus - векторные• Отсутствие картинок
> Делает Nimbus пригодным для окружений с высоким dpi> Облегчает брендинг (например, цветовые схемы)
• Кеширование для повышения производительности> отрисованных кусочков, как картинок> медленее Metal LAF, быстрее Windows LAF
– разница не принципиальна• “Умное” масштабирование
> Разные части компоненты могут масштабироваться по разному
> Метод “9-квадратов”
11
Пример: масштабирование растрового изображения
12
Пример: масштабирование векторного изображения
13
Умное масштабирование: JComboBox
Углы не надо масштабировать с тем же коэффициентом, что и все остальное. Это влияет на восприятие формы фигуры!
14
Декораторы
• Отрисовка компонент делегируется декораторам> Простой интерфейс, без состояния
• Можно заменить любой декоратор для любого региона любого объекта в любом состоянии
• Пример: Button[Enabled].backgroundPainter> Декоратор, используемый JButton в состоянии enabled> Выставляется через UIDefaults
• Не надо расширять компоненту или использовать UIDelegate!
public interface Painter { public void paint(Graphics2D g, JComponent c, int width, int height);}
15
Cкины: это просто
16
Скин для JSpinner (1)UIDefaults sliderDefaults = new UIDefaults();sliderDefaults.put("Slider.thumbWidth", 20);sliderDefaults.put("Slider.thumbHeight", 20);sliderDefaults.put( "Slider:SliderThumb.backgroundPainter", thumbBackgroundPainter);
17
Скин для JSpinner (2)thumbBackgroundPainter = new Painter() { public void paint(Graphics2D g, JComponent c, int w, int h) { g.setRenderingHint( KEY_ANTIALIASING, VALUE_ANTIALIAS_ON); g.setStroke(new BasicStroke(2f)); g.setColor(Color.RED); g.fillOval(1, 1, w-3, h-3); g.setColor(Color.WHITE); g.drawOval(1, 1, w-3, h-3); }});
18
Скин для JSpinner (3)JSlider slider = new JSlider(0, 100, 50);slider.putClientProperty( "Nimbus.Overrides",sliderDefaults);slider.putClientProperty( "Nimbus.Overrides.InheritDefaults",false);
19
Прозрачные окна• Полупрозначность
> Применима к java.awt.Windows
• Разновидности> Единая для окна> Разная для разных пикселов
• Прозрачные и для событий!• Поддержка зависит от платформы
> AWTUtilities.isTranslucencySupported()• Примеры и подробности
http://java.sun.com/developer/technicalArticles/GUI/translucent_shaped_windows/
20
Непрямоугольные окна• Форма задается Shape
> void setWindowShape( Window window, Shape shape)
• Ограничения> Только для окон без
декораций> Не в полноэкранном режиме> (Пока) не public API
– com.sun.awt.AWTUtilities
• Примеры и подробностиhttp://java.sun.com/developer/technicalArticles/GUI/translucent_shaped_windows/
21
Демонстрация● Чтобы увидеть новые возмоности требуется установленный JRE 6 update 10!● http://javafx.com/releases/preview1/demos/SwirlingSquares/launch.jnlp● http://download.java.net/javadesktop/laffy/Laffy.jnlp● http://download.java.net/javadesktop/swingset3/SwingSet3.jnlp
22
План• UI
> Nimbus Look and Feel> Непрямоугольные прозрачные окна
• Апплеты и Webstart> Новый Java плагин> JNLP апплеты> Deployment Toolkit
• Время старта Java приложений > Java Kernel> Java Quick Starter
• Вопросы
23
Java plugin: проблемы• Работает в процессе броузера
> Падение JRE => падение броузера> Только одна версия JRE может работать в один момент
времени> Разработчик апплета не может выбрать версию JRE> Разработчик не имеет контроля над параметрами JVM> Броузер “висит” пока JRE стартует
24
Новый Java plugin: обзор
Только небольшой кусочек кода на стороне броузера
25
Новый Java plugin: детали• Апплеты выполняются вне процесса броузера
> Апплет не может вызвать падение броузера> Можно выбирать версию JRE> Можно передавать параметры VM> Может быть >1 процесса, в которых исполняются апплеты
• Работает в защищенном режиме IE на Vista• JNLP описания для апплетов
> Такой же как для Webstart> Доступ к JNLP сервисам> Возможность использовать “платформенные” библиотеки
• Улучшенное взаимодествие Java<=>Javascript• Требует Firefox 3 или IE 7
26
Пример апплета с JNLP
• jnlp_href связывает Веб страницу и JNLP• Фиксированные правила предпочтений для
дублирующейся информации> Параметры VM всегда из JNLP> width/height всегда из описания апплета
• Старая версия плагина игнорирует jnlp_href> Новый плагин игнорирует обычное описание, если есть jnlp_href> Решение для обеспечения обратной совместимости
<applet width=”500” height=”500”> <param name=”jnlp_href” value=”my_applet.jnlp”> <param name=”separate_jvm” value=”true” /></applet>
27
Новый Java plugin: советы• Избегайте рестартов VM
> VM, используемая для разбора JNLP может не подходить для запуска самого приложения
> Используйте параметры апплета для того, чтобы запустить подходящий VM<param name=”java_arguments”value=”-Xmx128m -Dsun.java2d.opengl=true”>
• Часть параметров VM может передавать только код, которому доверяют> Подписывайте JNLP и апплет
• Фоновая проверка обновлений> <update check=”background”>> Запуск, используя кешированную версию> Обновления будут использованы при следующем запуске
28
Демонстрация●Чтобы увидеть новые возмоности требуется установленный JRE 6 update 10!● http://download.java.net/javadesktop/plugin2/wwj/ Использование OpenGL для анимации, Javascript <-> Java взаимодействие ● http://download.java.net/javadesktop/plugin2/jake2/ Quake в апплете● http://java.sun.com/developer/technicalArticles/javase/6u10_applets/ Простые draggable апплеты● Видео от демо на JavaOne 2008 http://java.sun.com/javaone/sf/media_shell.jsp?id=sgs2 (после 58 минуты)
29
Draggable-апплеты• Апплет – это приложение, которое может работать как
внутри, так и вне броузера• Использование
> <param name=”draggable” value=”true”>> Alt + Left-click + Drag
• По умолчанию, апплет оборачивается в Frame или JFrame> Без декораций и прозрачный
• Апплет сохраняет возможность взаимодействия с броузером, пока открыта оригинальная страница
• Дополнительные возможности у апплета– appletDragStarted()– isAppletDragStarted(MouseEvent e);– setAppletCloseListener(ActionListener l);
• Экспериментальная функциональность
30
Deployment Toolkit• Типичные задачи на этапе развертывания
> Получить информацию о доступных версиях JRE> Установить JRE> Инициировать обновление JRE> Запуск апплетов и Webstart приложений
• Получить ответы непросто => многие апплеты не используют новые возможность> JDK 1.1 API, для совместимости со старыми JRE (MS VM)
• Deployment Toolkit - стандартный механизм, упрощающий процесс развертывания> JavaScript API: http://java.com/js/deployJava.js
31
Пример
<script src=“http://java.com/js/deployJava.js”></script><script> deployJava.runApplet({ codebase:'http://www.mycompany.com/java/', archive:'myapplet.jar', code:'Main.class', width:400, height:300}, null, “1.4”);</script>
• Проверяет, что установлен JRE 1.4 или новее, а потом запускает апплет
• Если подходящего JRE нет, инициирует его установку
32
Deployment Toolkit (2)• Ограничения чистого JavaScript решения
> Обнаруживает только самую свежую JRE> С точностью до основной версии (1.5, но не 1.5.0_11)> Установка JRE не совсем прозрачна
– В худшем случае redirect на страницу установки JRE– Зависит от платформы, броузера и того что уже
установлено• Решение: платформо-зависимые плагины
> ActiveX/Mozilla> Часть Java 6u10> Более точные результаты> Работает с множеством установленных версий JRE> API тот же самый
33
Дополнительные бонусы• Возможность использовать сжатие pack200 для
апплетов и JNLP без настройки на стороне сервера• Поддержка версий для JNLP без настройки на стороне
сервера
34
План• UI
> Nimbus Look and Feel> Непрямоугольные прозрачные окна
• Апплеты и Webstart> Новый Java плагин> JNLP апплеты> Deployment Toolkit
• Время старта Java приложений> Java Kernel> Java Quick Starter
• Вопросы
35
Медленный запуск Java приложений• Типичные проблемы
> Установка JRE занимает много времени> Запуск первого Java приложения после перегрузки
машины очень медленный> Если это запуск из броузера, то броузер “висит”
36
Размер JRE• Новые возможности => естественный рост JRE
Size in MB0
1
2
3
4
5
6
7
8
9
10
11
12
Java 1.1Java 1.2Java 1.3Java 1.4Java 5Java 6
37
Java Kernel• Далеко не весь JRE нужен всем приложениям
> SQL, RMI, CORBA, XSLT, ...> Для большинства программ нужно <50% JRE
• Модуляризация> Core: VM + минимальный набор библиотек> Установка по требованию> Установка в фоновом режиме> Итоговый результат идентичен полной установке JRE> Есть возможность указать список требуемых
компонент с помощью Deployment API– Ограниченная применимость
38
Эффект от Java Kernel
39
Время запуска JRE• Время запуска приложения
> Холодный запуск: JRE необходимо считать с диска> Теплый запуск: JRE в памяти (буфере ОС)
• Теплый запуск довольно быстр (0.1-0.2с)• Холодный старт = Чтение с диска + Теплый старт
> JRE большой> Диски медленные
• Оптимизация JRE не решает проблему принципиально
40
Решение: Java Quick Starter• Фоновый процесс, периодически читающий важные части
JRE> JRE остается в дисковом кеше> Запуск Java приложений значительно ускоряется
• Не то же самое, что и “запущенный JVM”> Не потребляет память по настоящему
– Если ОC требуется, то она освободит буфер– Если свободной памяти мало, то JQS автоматически остановится– На ноутбуках, работающих от батареи, JQS отключается
• Не универсальное решение> Но помогает в большинстве случаев
41
Демонстрация● Просто попробуйте установить Java Kernel сами (со страницы jre 6 update 10)
● Пока этот релиз не вышел используйтеhttps://jdk6.dev.java.net/6u10ea.html
42
И это еще не все!• Использование средств Windows для растеризации текста• Новый графический конвейер Java2D на основе Direct3D 9
> Аппаратное ускорение: градиенты, геометрические фигуры в AA, BufferedImageOps, alpha compositing, рисование трансформированных объектов и т.д.
• Улучшенный механизм установки обновлений и инсталятор • Новый security warning banner• Множество других улучшений и исправлений
Попробуйте самиhttps://jdk6.dev.java.net/6u10ea.html
43
?Вопросы
44
Новые возможности Desktop JavaИгорь НекрестьяновSun Microsystems
44