Статьи

JavaOne 2013 BOF2605 JavaFX, виджеты и приложения, о мой! Запуск рамок для платформ больших и малых

Образ

Многофункциональный виджет под названием KeyHole, отображающий карты и погоду.

Вступление

T его, вероятно , самое длинное название , которое я когда — либо создать для записи блог.

В свободное время я работал с Марком Хеклером ( Джунгли Java ), Хендриком Эбберсом ( GuiGarage ) и Герритом Грюнвальдом ( Гармонический код ) над идеей фреймворков для запуска приложений. Мы представим два подхода к запуску виджетов и приложений в среде рабочего стола и встроенного устройства (Raspberry Pi). Речь пойдет о сеансе BoF («Птицы пера») на  JavaOne 2013  ( BOF2605 ). Именно здесь сообщество Java / JavaFX будет очень весело демонстрировать, обсуждать и делиться идеями по таким темам, как:

  • Контейнеры приложений / панели инструментов
  • Виджеты / Приложения / Игры / Гаджеты
  • Рабочий процесс разработки виджетов / приложений
  • Жизненный цикл виджета / приложения
  • Развертывание / Магазины приложений

Чтобы увидеть предварительный просмотр реализации Хендриком Эбберсом контейнера приложения, похожего на Roku-AppleTV, проверьте его запись в блоге здесьhttp://www.guigarage.com/2013/08/boxfx-javaone-preview-1/  Приложение Контейнер называется  BoxFX .

Мы с Марком работаем над реализацией контейнера приложений для настольных компьютеров под названием  TrayFX . Чтобы увидеть предварительный просмотр TrayFX, посетите  интервью  с Марком Хеклером, организованное  Стивеном Чином . Еще один предварительный просмотр TrayFX в действии находится на моем канале YouTube  здесьhttp://www.youtube.com/watch?v=x_KLIzVSiu8  и  http://www.youtube.com/watch?v=WwzwsGxd-Jk

В этом блоге я буду обсуждать некоторые понятия высокого уровня , касающиеся  в  рамки eWidgetFX  и контейнер приложения  TrayFX . Поскольку многое нужно переварить, я хотел бы хотя бы (кратко) показать вам каждый слой в архитектуре.

Отказ от ответственности: BoxFX и TrayFX в настоящее время являются частными API. Оба подхода имеют сходство, однако являются самостоятельными проектами. Важно услышать от аудитории потенциальные варианты использования. В конечном итоге они станут проектами с открытым исходным кодом. Кроме того, приведя к разговору о JavaOne, некоторые диаграммы или API могут быть изменены в этой записи блога.

eWidgetFX

eWidgetFX  — это базовая библиотека (API), от которой будут зависеть виджеты и контейнеры приложений. Показанный ниже изображает слои:

Архитектура высокого уровня базовой структуры виджета

Базовый API виджетов, от которого зависят виджеты и контейнеры виджетов.

API предоставляют сервисы для загрузки виджетов, жизненных циклов виджетов и утилит для разработчика виджетов. Основная идея заключалась в том, чтобы предоставить кроссплатформенный API-интерфейс приложения для разработчиков контейнеров приложений и разработчиков виджетов. Фактически цель состояла в том, чтобы иметь кроссплатформенные виджеты и приложения, способные работать в любом контейнере приложений (на основе библиотеки eWidgetFX).

Контейнеры для приложений (TrayFX)

TrayFX — это экземпляр контейнера приложений, который зависит от базовой структуры виджета (eWidgetFX). Ниже показан средний уровень, который представляет собой разные контейнеры пользовательских приложений, основанные на ядре.

Архитектура высокого уровня, изображающая слой Контейнеры приложений.

Контейнеры приложений зависят от API eWidgetFX (ядро). Это позволяет разработчикам создавать свои собственные контейнеры приложений.

TrayFX — это экземпляр контейнера приложений, который зависит от базовой структуры виджета (eWidgetFX). Это означает, что вы можете разработать свой собственный виджет JavaFX и контейнер приложений по своему вкусу, если вам не нравится TrayFX.  :-) Например, вы можете создать его для планшетного устройства, которое может иметь разные метафоры пользовательского интерфейса и разные размеры экрана (недвижимость). Ниже показано, как TrayFX запускает виджет часов (на рабочем столе).

TrayFX запускает виджет часов.

Виджет часов запущен из TrayFX

Виджеты

Виджеты  или приложения — это либо автономные приложения, либо виджеты на основе eWidgetFX, которые можно запускать внутри контейнера приложения. Ниже показан слой виджетов:

Высокоуровневая архитектура слоя виджетов

Виджеты — это мини-приложения, которые могут запускаться автономно или запускаться внутри контейнера виджетов, такого как TrayFX.

При создании виджетов вы можете реализовать интерфейс Widget или расширить класс адаптера DefaultWidget, переопределяя необязательные методы жизненного цикла для удобства разработчика. Ниже показана диаграмма классов высокого уровня:

Класс виджетов hello world, выходящий из класса виджетов eWidgetFX по умолчанию.

Диаграмма классов виджета с использованием базовой библиотеки eWidgetFX.

В JavaOne BoF ( BOF2605 ), так как фреймворк все еще очень альфа во время разговора, мы представим возможный рабочий процесс разработчика для создания, построения, развертывания и запуска виджетов. Ниже я хотел бы поделиться небольшим фрагментом кода, чтобы дать вам представление о том, как легко реализовать виджет на платформе eWidgetFX.

Обычно среды запуска приложений имеют жизненные циклы для контейнеров приложений для управления виджетами и приложениями. Разработчикам виджетов не нужно будет реализовывать ни Stage,  ни  Scene,  а в основном сосредотачиваться на том, что им лучше всего известно (их виджет JavaFX в качестве Node). API-интерфейсы платформы позволят вам взаимодействовать с родительскими контейнерами JavaFX, такими как Stage и Scene. Ниже показан интерфейс виджета eWidgetFX, в котором есть методы, которые необходимо реализовать разработчику виджетов. Для краткости просмотрите комментарии к методам, чтобы понять базовый жизненный цикл виджета.

package org.ewidgetfx.core;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
/**
* User: cdea
* Date: 4/7/13
*/
public interface Widget {
public static enum DECORATION {
STAGED_OS_TITLE_BAR,
STAGED_CLOSE,
STAGED_CONFIG_CLOSE,
STAGED_CONFIG,
STAGED_UNDECORATED,
NON_STAGED_CLOSE,
NON_STAGED_CONFIG_CLOSE,
NON_STAGED_CONFIG,
NON_STAGED_UNDECORATED
};
DECORATION getDecoration();
void setDecoration(DECORATION decoration);
String getName();
void setName(String name);
StringProperty nameProperty();
String getVersion();
void setVersion(String version);
StringProperty  versionProperty();
String getDescription();
void setDescription(String descr);
String getVendor();
void setVendor(String vendor);
String getVendorUrl();
void setVendorUrl(String vendorUrl);
String getVendorEmail();
void setVendorEmail(String vendorEmail);
LaunchInfo getLaunchInfo();
void setLaunchInfo(LaunchInfo launchInfo);
WidgetIcon getWidgetIcon();
void setWidgetIcon(WidgetIcon widgetIcon);
ObjectProperty widgetIconProperty();
Pane getAsNode();
Stage getParentStage();
void setParentStage(Stage stage);
WidgetState getWidgetState();
/**
* Returns a created WidgetIcon for the app container to use. Called 1st.
* @return WidgetIcon containing a raw node representing the icon. App containers can resize.
*/
WidgetIcon buildWidgetIcon();
/**
* Called after buildWidgetIcon() method to allow background processes to occur. Called 2nd.
* Typically to collect data to update WidgetIcon's Icon overlay. An example would be
* an email widget periodically checking email to update Icon overlay the number of emails received.
*/
void startBackground();
/**
* Initialize the widget. If the developer calls this method the framework will not call it. Called 3rd.
*/
void init();
/**
* Start is meant to be called when the user clicks the icon to launch widget. Called 4th.
* Typically to start animations or position on the desktop. This should not be confused with startBackground()
*/
void start();
/**
* Pause is typically used to pause animations. Or other developer defined resources.
*/
void pause();
/**
* Resume is typically used to resume a animations. Or other developer defined resources.
*/
void resume();
/**
* Stop is called when the widget is closed and not visible. Typically this is to stop animations, and minor cleanup.
* The framework will call stop and stopBackground() method when exiting the app container.
*/
void stop();
/**
* Stops any background processes. Called when widget is being closed by the framework when exiting app contain. Called last.
*
*/
void stopBackground();
}

Вывод

При разработке этого фреймворка мы продолжали придумывать больше возможностей и идей, однако, оставаясь совсем немного времени, мы все же смогли предоставить общие возможности, которые вы полюбили на своем устройстве. Надеюсь, это разожжет ваш аппетит, прежде чем вы посетите BoF на JavaOne.

Все добро пожаловать! Наслаждайтесь!

деревенщина