Перейти к содержимому

Javafx webengine что это

  • автор:

Javafx webengine что это

Данный код прекрасно работает на javafx платформе, js функции запускались, а тут выдает ошибку:

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: com.sun.webkit.dom.JSObject cannot be cast to jdk.nashorn.api.scripting.JSObject

Указывает на строчку:

doc = (JSObject) webEngine.executeScript("window");

Почему executeScript возвращает другой объект?

Re: javafx +swing

От: Fuud
Дата: 16.08.14 13:35
Оценка:

N>Почему executeScript возвращает другой объект?

А именно:
Most JavaScript objects get wrapped as netscape.javascript.JSObject

Re: javafx +swing

От: Blazkowicz
Дата: 18.08.14 07:29
Оценка: 3 (1)

Здравствуйте, newuser, Вы писали:

N>Почему executeScript возвращает другой объект?
Разные версии JDK, разные реализации WebEngine. Почему бы не использовать netscape.javascript.JSObject, который декларирует документация?
Это же вы привязались к типу jdk.nashorn.api.scripting.JSObject, который живет в OpenJDK, но не в Oracle JDK.

Re[2]: javafx +swing

От: newuser
Дата: 18.08.14 12:16
Оценка:

Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, newuser, Вы писали:

N>>Почему executeScript возвращает другой объект?
B>Разные версии JDK, разные реализации WebEngine. Почему бы не использовать netscape.javascript.JSObject, который декларирует документация?
B>Это же вы привязались к типу jdk.nashorn.api.scripting.JSObject, который живет в OpenJDK, но не в Oracle JDK.
Действительно, поменял импорт и все заработало

JavaFX vs HTML + CSS + JavaScript

WebView позволяет выводить полноценные интерактивные html страницы в приложении.

Значит, если я правильно понимаю, можно сначала сделать локальный сайт приложения, а потом в Application stand-alone их выводить.

�� Подобається Сподобалось 0

До обраного В обраному 0

Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

19 коментарів

Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Не прошло и полгода. Вот оно, начало всего: paterns.xyz/gold
А вот тут ролик, как играть. www.youtube.com/watch?v=O1qWKKe12pk (30 сек)

Без HTML однако на javafx. Скоро встречайте GOLD
Он будет такой же, как вот это: paterns.xyz/gold
Но теперь исходники в java классах, а не как в js
Насколько же легче баги править и фичи дописывать.

Первая поделка на Javafx
Клеточный автомат 5минут
youtu.be/NuK-cKa4oxQ

Эта тема из той волновой функции, где я пишу на JavaFX.
Появилась идея закодить на JavaFX некоторые свои игрушки (которые сейчас на javascript).
Это во первых рефакторинг, а во вторых — смартфоны, андроид

Igor Lytvynenko Co-Founder в Artellence 01.02.2021 19:28

WebView в JavaFx — це ще той тормоз . just in case.

Igor Lytvynenko Co-Founder в Artellence 01.02.2021 20:06

Ну . javafx — це ж як раз і є UI фреймворк.
Всякі «Licence agreement» можна і у web view зверстати. А UI — засобами фреймворку. Зрештою, в javafx стандартна архітектура . нічого незвичного. Єдине що візуального редактора там не дуже . scene builder . трохи . з особливостями.

Dmitry Bugay Java Team Lead 01.02.2021 14:46

А зачем так делать?
Может, если ты пишешь на JavaFX, то и написать юай на нем?

Можно и так, но мне чего-то захотелось без fxml.

Dmitry Bugay Java Team Lead 01.02.2021 19:59

Воу воу воу!
Внезапно у JavaFX есть и Java API, можно и без fxml аж бигом

А нужно ли перемешивать? Я вот как-то перемешал авт и свинг до сих пор кошмары снятся.

Dmitry Bugay Java Team Lead 01.02.2021 20:07

Перемешивать что? Джаву и джаву?
Если вдруг ты не видел джаву фх, то джава фх это просто джава апи для окошек. И пишется он на обычной джаве. Разве что библиотеки с классами окошек и кнопочек нужно подключить

Ты меня пугаешь, утверждая что джава это приговор интерфейсу пользователя. С другой стороны, мое желание html+css+js стало еще более определенным.

Dmitry Bugay Java Team Lead 02.02.2021 01:03

0.о
Ты, видимо, вообще не понимаешь о чем я пишу.
Где ты увидел «приговор джаве как интерфейсу»?
Мне просто кажется что ты путаешь коней с людьми и не понимаешь что такое тот же JavaFX.

Коментар порушує правила спільноти і видалений модераторами.

Igor Lytvynenko Co-Founder в Artellence 01.02.2021 20:08

Fxml — то добре . але це не парадигма, це інструмент. Тому змішувати там більш ніж норм . а нагавнокодити можна і змішуючи і не змішуючи )

Первая ссылка очень хороша. Вот у меня тоже неплохая:
betacode.net/. ​/javafx-webview-webengine

Victor Musienkо Senior Engineer в Noibu.com 30.01.2021 17:07

Я тут вижу взаимодействие с файлами операционной системы. То есть, не использовать Reflection API а создавать и читать файлы сообщений или в статическом классе регистрировать события. Я попытался создавать файлы и обнаружил странное — файл в Windows 7 трудно удалить, но легко rewrite.

Підписатись на коментарі

Ваша пошта
Підписатись

Не пропустіть

10 січня — 13 березня, Online

10 січня, Online

15 січня — 25 березня, Online

Гарячі вакансії
  • Labelling Assessor в Manpower Ukraine , Київ
  • CRM Manager в Uklon , Київ
  • Менеджер з продажу (digital marketing, SEO, PPC) в Marketing Link, $750–1500 , за кордоном, віддалено
  • Junior/Mid Lead Generation Specialist в DevsData, $670–800 , віддалено
  • React / React Native Developer в Softwarium , Київ, за кордоном, віддалено
  • Customer Care Manager (English) в UPSTARS , віддалено
  • Senior BAS ERP Developer в iDeals , Київ, віддалено
  • Linux System Developer в Samsung R&D Institute Ukraine , Київ, віддалено

Всі вакансії

Javafx webengine что это

Класс WebEngine

Класс WebEngine обеспечивает обработку отображаемой узлом WebView Web-страницы, включая ее загрузку, создание DOM-модели загруженной Web-страницы и выполнения JavaScript-кода страницы.

Класс WebEngine имеет следующие свойства, конструкторы и методы:

  • Свойство document – документ org.w3c.dom.Document Web-страницы.
  • Свойство location – URL-адрес Web-страницы.
  • Свойство title – заголовок Web-страницы.
  • Свойство javaScriptEnabled – определяет возможность выполнения JavaScript-кода.
  • Свойство userStyleSheetLocation – URL-адрес CSS-стилей.
  • Свойство userDataDirectory — каталог для хранения локальных данных пользователя.
  • Свойство userAgent — значение HTTP-заголовка User-Agent.
  • Свойство onStatusChanged – обработчик javafx.event.EventHandler>, вызываемый, если JavaScript-код устанавливает свойство window.status.
  • Свойство onResized – обработчик javafx.event.EventHandler> вызываемый, если JavaScript-код изменяет размеры объекта window.
  • Свойство onVisibilityChanged – обработчик javafx.event.EventHandler> вызываемый, если JavaScript-код изменяет видимость объекта window.
  • Свойство createPopupHandler – обработчик javafx.util.Callback вызываемый, если JavaScript-код создает всплывающее окно. Класс javafx.scene.web.PopupFeatures описывает опции всплывающего окна, создаваемого методом window.open JavaScript-кода, с помощью следующих конструкторов и методов:
  • Конструктор public PopupFeatures(boolean menu, boolean status, boolean toolbar, boolean resizable), где menu – если true, тогда окно имеет панель меню, status – если true, тогда окно имеет панель статуса, toolbar – если true, тогда окно имеет панель инструментов, resizable – если true, тогда размеры окна могут изменяться.
  • Метод public boolean hasMenu() – возвращает true, если окно имеет панель меню.
  • Метод public boolean hasStatus() – возвращает true, если окно имеет панель статуса.
  • Метод public boolean hasToolbar() – возвращает true, если окно имеет панель инструментов.
  • Метод public boolean isResizable() – возвращает true, если размеры окна могут изменяться.
  • Свойство confirmHandler – обработчик javafx.util.Callback вызываемый, если JavaScript-код создает диалоговое окно подтверждения.
  • Свойство onAlert – обработчик javafx.event.EventHandler> вызываемый, если JavaScript-код вызывает функцию alert().
  • Свойство promptHandler – обработчик javafx.util.Callback вызываемый, если JavaScript-код создает диалоговое окно ввода. Класс javafx.scene.web.PromptData обеспечивает данные, передаваемые в JavaScript-функцию prompt(), с помощью следующих конструкторов и методов:
  • Конструктор public PromptData(java.lang.String message, java.lang.String defaultValue), где message – сообщение диалогового окна, defaultValue – значение ввода по умолчанию.
  • Метод public java.lang.String getMessage() – возвращает сообщение диалогового окна.
  • Метод public java.lang.String getDefaultValue() – возвращает значение ввода по умолчанию.
  • Свойство onError — обработчик ошибки.
  • Конструктор public WebEngine().
  • Конструктор public WebEngine(java.lang.String url), где url – URL-адрес для загрузки Web-страницы.
  • Метод public final Worker getLoadWorker() – возвращает объект javafx.concurrent.Worker, обеспечивающий выполнение задачи в фоновом потоке.
  • Метод public final org.w3c.dom.Document getDocument() – возвращает DOM-документ Web-страницы.
  • Метод public final ReadOnlyObjectProperty documentProperty() – возвращает JavaFX Beans свойство DOM-документа Web-страницы.
  • Метод public final java.lang.String getLocation() – возвращает URL-адрес Web-страницы.
  • Метод public final ReadOnlyStringProperty locationProperty() – возвращает JavaFX Beans свойство URL-адреса Web-страницы.
  • Метод public final java.lang.String getTitle() – возвращает заголовок Web-страницы.
  • Метод public final ReadOnlyStringProperty titleProperty() – возвращает JavaFX Beans свойство заголовка Web-страницы.
  • Метод public final void setJavaScriptEnabled(boolean value) – устанавливает возможность выполнения JavaScript-кода.
  • Метод public final boolean isJavaScriptEnabled() – проверяет возможность выполнения JavaScript-кода.
  • Метод public final BooleanProperty javaScriptEnabledProperty() – возвращает свойство выполнения JavaScript-кода.
  • Метод public final void setUserStyleSheetLocation(java.lang.String value) – определяет адрес CSS-стилей.
  • Метод public final java.lang.String getUserStyleSheetLocation() – возвращает адрес CSS-стилей.
  • Метод public final StringProperty userStyleSheetLocationProperty() – возвращает свойство адреса CSS-стилей.
  • Метод public final java.io.File getUserDataDirectory(), public final void setUserDataDirectory(java.io.File value), public final ObjectProperty userDataDirectoryProperty() — определяет каталог для хранения локальных данных пользователя.
  • Метод public final void setUserAgent(java.lang.String value), public final java.lang.String getUserAgent(), public final StringProperty userAgentProperty() — определяет значение HTTP-заголовка User-Agent.
  • Метод public final EventHandler> getOnAlert() – возвращает обработчик события создания JavaScript-кодом окна предупреждения (вызов JavaScript-функции alert()).
  • Метод public final void setOnAlert(EventHandler> handler) – устанавливает обработчик события создания JavaScript-кодом окна предупреждения.
  • Метод public final ObjectProperty> onAlertPropety() – возвращает JavaFX Beans свойство обработчика события создания JavaScript-кодом окна предупреждения.
  • Метод public final EventHandler> getOnStatusChanged() – возвращает обработчик события изменения JavaScript-кодом свойства window.status.
  • Метод public final void setOnStatusChanged(EventHandler> handler) – устанавливает обработчик события изменения JavaScript-кодом свойства window.status.
  • Метод public final ObjectProperty> onStatusChangedProperty() – возвращает JavaFX Beans свойство обработчика события изменения JavaScript-кодом свойства window.status.
  • Метод public final EventHandler> getOnResized() – возвращает обработчик события изменения JavaScript-кодом размеров объекта window.
  • Метод public final void setOnResized(EventHandler> handler) – устанавливает обработчик события изменения JavaScript-кодом размеров объекта window.
  • Метод public final ObjectProperty> onResizedProperty() – возвращает JavaFX Beans свойство обработчика события изменения JavaScript-кодом размеров объекта window.
  • Метод public final EventHandler> getOnVisibilityChanged() – возвращает обработчик события изменения JavaScript-кодом видимости объекта window.
  • Метод public final void setOnVisibilityChanged(EventHandler> handler) – устанавливает обработчик события изменения JavaScript-кодом видимости объекта window.
  • Метод public final ObjectProperty> onVisibilityChangedProperty() – возвращает JavaFX Beans свойство обработчика события изменения JavaScript-кодом видимости объекта window.
  • Метод public final Callback getCreatePopupHandler() – возвращает обработчик создания JavaScript-кодом всплывающего окна (вызов JavaScript-функции window.open()).
  • Метод public final void setCreatePopupHandler(Callback handler) – устанавливает обработчик создания JavaScript-кодом всплывающего окна.
  • Метод public final ObjectProperty createPopupHandlerProperty() – возвращает JavaFX Beans свойство обработчика создания JavaScript-кодом всплывающего окна.
  • Метод public final Callback getConfirmHandler() – возвращает обработчик создания JavaScript-кодом диалогового окна подтверждения (вызов JavaScript-функцииconfirm()).
  • Метод public final void setConfirmHandler(Callback handler) – устанавливает обработчик создания JavaScript-кодом диалогового окна подтверждения.
  • Метод public final ObjectProperty confirmHandlerProperty() – возвращает JavaFX Beans свойство обработчика создания JavaScript-кодом диалогового окна подтверждения.
  • Метод public final Callback getPromptHandler() – возвращает обработчик создания JavaScript-кодом диалогового окна ввода данных (вызов JavaScript-функцииprompt()).
  • Метод public final void setPromptHandler(Callback handler) – устанавливает обработчик создания JavaScript-кодом диалогового окна ввода данных.
  • Метод public final ObjectProperty promptHandlerProperty() – возвращает JavaFX Beans свойство обработчика создания JavaScript-кодом диалогового окна ввода данных.
  • Метод public final void setOnError(EventHandler handler), public final ObjectProperty onErrorProperty(), public final EventHandler getOnError() — определяет обработчик ошибки.
  • Метод public void load(java.lang.String url) – обеспечивает асинхронную загрузку Web-страницы.
  • Метод public void loadContent(java.lang.String content) – асинхронно загружает HTML-контент.
  • Метод public void loadContent(java.lang.String content, java.lang.String contentType) – асинхронно загружает HTML-контент.
  • Метод public void reload() – обновляет текущую страницу.
  • Метод public WebHistory getHistory() – возвращает объект javafx.scene.web.WebHistory, содержащий историю сессии.
  • Метод public java.lang.Object executeScript(java.lang.String script) – выполняет JavaScript-код Web-страницы.
  • Метод public void print(PrinterJob job) — печать страницы.

Класс WebErrorEvent расширяет класс javafx.event.Event и представляет событие ошибки веб-движка.

Класс WebErrorEvent имеет следующие поля, конструкторы и методы:

  • Поле public static final EventType ANY — супер тип события.
  • Поле public static final EventType USER_DATA_DIRECTORY_ALREADY_IN_USE — каталог пользовательских данных параллельно уже используется другим веб-движком.
  • Поле public static final EventType USER_DATA_DIRECTORY_IO_ERROR — ошибка чтения-записи каталога.
  • Поле public static final EventType USER_DATA_DIRECTORY_SECURITY_ERROR — ошибка прав доступа к каталогу.
  • Конструктор public WebErrorEvent(java.lang.Object source, EventType type, java.lang.String message, java.lang.Throwable exception).
  • Метод public java.lang.String getMessage(), public java.lang.Throwable getException() — возвращает информацию об ошибке.

JavaFX WebView (HTML/JS) — используем web практики для разработки desktop приложений

image

Базовым UI фреймворком для нашего приложения был выбрана JavaFX. JavaFX прекрасно показала себя. В этой же статье мы хотели сконцентрироваться на одном компоненте JavaFX — WebView.

При разработке нашего приложения — интерфейса COLT — мы использовали набирающий популярность среди девелоперов подход, когда часть компонентов UI реализуется на JavaScript/HTML.

Компонент на базе HTML/JS — это обычный Java класс, обычный JavaFX компонент с лайаутом — HBox или просто Pane, который содержит в себе экземпляр компонента Webview.

Как создать экземпляр webkit в JavaFX и подгрузить HTML

WebView webView = new WebView(); WebEngine engine = webView.getEngine(); engine.load(this.getClass().getResource("html/webview.html").toExternalForm())

Что мы получили использовав web технологии в нашем приложении.

Тонны готовых решений

jQuery, D3 покрывает почти все наши задачи. Нужно готовое решение — находим через гугл за 5 минут. Здорово что аналогами элементов интерфейса заполнен под завязку весь интернет. Причем все в открытом доступе. Можно подглядеть идею и взять ее реализацию.

Дешево

На Java такое же, что мы реализовали на JS/HTML написать было бы непросто.

Например, этот компонент для добавления путей. За основу мы взяли движок для Tag-ов и хорошенько его «допилили». Получилась очень умная и приятная штука. Умеет редактировать в режиме «тэгов», а по двойному клику еще позволяет просто работать с текстом. Работа с «клипбоардом».

image

До этого, в предыдущей версии интерфейса, у нас использовался уродливый list-view. Наш новый fileset прост, компактен, современен. Есть идеи как еще можно расширять его функциональность.

Второй пример — log-view.

image

Сначала мы хотели сделать компонент на основе ListView. Особых проблем со скинованием мы не получили, но все же компонент получился малопригодным для реального использования пользователями. Например, нельзя было выделить логи как текст, сразу несколько блоков, реализация компонента грозила вылиться в немалый объем кода. Компонент на HTML получился легким и расширяемым. Нужно отметить что JavaFX использует GPU для рендеринга DOM, поэтому компонент получился достаточно производительным. Компонент мы планируем расширить поиском по логам, фильтрами и т.д. Все это мы планируем реализовать средствами JavaScript/CSS.

Возможно мы просто не настолько хороши в Java-UI, но нам действительно было сложно писать на Java компоненты со сложной интерактивностью. Там где нужен готовый компонент, пример который можно «нагуглить» — да все легко и просто. Связать через «байндинг» данные и «вьюхи» — опять очень просто и привычно (наш предыдущий опыт — Adobe Flex). Но когда дело касается чего-то выходящего за рамки стандартных, описанных в документации кейсов — мы теряли слишком много времени на «ресерч».

Мы выработали для себя следующую схему — пытаемся сделать через JavaFX-компоненты, и если «упираемся в стену», или излишне усложняется реализация, то пишем на HTML. Такой подход значительно ускорил нашу разработку.

Кросс-платфоменность

Движок Webview в JavaFX — это webkit. Работает одинаково на любой платформе. Мы практически не тратили время на кросс-платфоменность.

Java-JavaScript Bridge

Связка Java-JavaScript, мост между ними позволяет делать вызовы методов Java-классов из HTML, а так же вызывать код JavaScript из Java. Простой пример код на Java:

private void clear()

А этот код JavaScript который принимает данные и вызывает методы ArrayList java —

function test(list)< console.log("list.size() - " + list.size();//3 console.log("list.get(0) - " + list;//1 >

Пример конечно же не совсем реальный, синтетика, но видно, что методы вызываются, и данные принимаются.

Вы можете при загрузке html, добавить ссылку на приложение прямо в объект Window.

JSObject windowObject = (JSObject) webView.engine.executeScript("window"); windowObject.setMember("app", this);

И вызывать методы Java из кода JavaScript —

app.addData($("my-input").val());

Более правильным (более безопасным) подходом является создание в Java окружении специального объекта, который ограничивает доступ, и позволяет из JavaScript вызывать в приложении только «разрешенные» методы.

windowObject.setMember("app", new JSBridge() < public myMethod()< MyApp.this.myMethod(); >>);

Еще один пример связки через JS «alert». Нам нужно было отловить «load» html — полную инициализацию приложения. Все другие методы оказались не так надежны. Что мы сделали.

Как обычно в JavaScript через jquery:

$(function()< alert("command:ready"); >); 

В Java добавили обработчик «onAlert» для webview.engine и теперь мы точно знаем что HTML загружен и инициализирован.

engine.onAlert = new EventHandler>() < @Override void handle(WebEventevent) < if("command:ready".equals(event.getData()))< //TODO: initialize >> >

Переиспользование кода

Код который мы написали для нашего приложения для компьютеров мы планируем переиспользовать для мобильной разработки. На мобильном приложении (objective-c/java) мы так же создадим компонент на на основе Webview большая часть функциональности будет уже готовой.

C какими сложностями мы столкнулись при работе с HTML/JS в JavaFX?

Первое. Жизненный цикл загрузки документа. Вызывать методы в JS можно только после полной загрузки страницы, в документации предлагается путь — отслеживать в Java событие смены состояния страницы. Такой подход оказался достаточно глючным. Как упоминал ранее — связка события «load» на стороне html и перехват «alert» на стороне Java, решили эту проблему.

Вторая проблема, которая попила у нас кровь — это глюки с вызовами одновременно нескольких JavaScript функций в разных компонентах с webview. Причем такой баг вылез достаточно недавно и очень похоже на оптимизацию, которую добавили в движок webkit в JavaFX. В любом случае, можно получить ошибку о бесконечной рекурсии в JavaScript буквально на пустом месте. Такая проблема решается достаточно легко — оборачиваем вызов JavaScript из Java c помощью Platform.runLater().

Третья проблема. Дебаг и логгинг.
На первом этапе работы, когда идет прототипирование и вы работаете только с HTML/JS можно тестировать просто в браузере. На этапе интеграции с Java ваш код просто перестает работать без правильного окружения. И вы все чаще и чаще начинаете собирать Java приложение для того чтобы потестировать функционал на JavaScript. А билд Java приложения и его запуск это долгие секунды ожидания. Какие приемы в работе мы использовали, чтобы такую долгую загрузки избежать и не терять время?

Простой и очевидный пусть — добавить «релоад» страницы по комбинации клавиш. Подправил HTML/CSS/JS — нажал F5 — содержимое WebView перегрузилось:

$(document).keydown(function (e) < if(e.keyCode == 116 /*F5*/)< location.reload(); >>);

Но кроме быстрого «рефреша» нам понадобится просмотр логов.
Достаточно простым решением было добавить FireBug Lite —

И конечно же, как только наше приложение «задышало» и заработал livecoding для HTML/JS мы стали использовать COLT для разработки COLT. На данный момент функционал нашего же приложения покрывает большинство кейсов — FireBug Lite нам уже не нужен. Лог, живое обновление, удаленное тестирование, ливкодинг. Ливкодинг на наш взгляд может заменить дебаг, но пользователи просят, и «настоящий дебаг с брейпойнтами» мы тоже прикрутим.

Как подключить? Просто добавляем в html документ следующий код

var url ; if (location.href != url)

Где url — адрес по которому COLT запускает трансформированную страницу. Узнать его просто. Создаем проект COLT, указываем ссылку на нашу страницу — «Main Document» и запускаем сессию — жмем «зеленую молнию».

image

Страница будет открыта в браузере. Копируем пусть к странице и вставляем в наш JS код. Окно браузера закрываем. Теперь запускаем JavaFX приложение. Пробуем изменить содержимое страницы, JavaScript и прямо в JavaFX приложении будет работать livecoding.

В новой версии, в настройках, в блоке «Advanced», мы добавили специальное текстовое поле с данным снипетом. Без старта проекта вы сможете скопировать данный код прямо из настроек COLT.

image

Логи будут появляться в окне COLT. Чтобы в следующий раз кольт открывал не браузер, а запускал ваше приложение, можно выбрать запуск не браузера, а запуск с консоли. В нашем проекте, мы просто скопировали текст из output нашей run-configuration IDEA и добавили этот вызов в COLT console luncher.

image

image

Теперь при нажатии на «зеленую бровь» будет запущено окно Java приложения.

В целом подход с редиректом внутри HTML на live-страницу универсален. Он, например, прекрасно работает и на PhoneGap. Приложение запускается на мобильное устройстве (главное чтобы устройство было в той же локальной сети) и обновления доставляются без необходимости рестарта. Нужно запомнить порядок действий — и можно применять везде, где есть WebView.

Хорошей практикой стало добавлять функцию-обработчик события изменения кода.

//@code-update function live()

Аннотацию @code-update перехватывают наши AST трансформации и добавляют листенер на событие обновления кода.

Типичный кейс работы с таким обработчиком — это вызывать функции в коде (то есть то что мы обычно пишем в консоль FireBug). Можно поменять значение или вызвать функцию, когда приложение уже запущено. Добавил код, сохранил — код выполнился.
Плюс удобно «трейсить», выводить данные, значение которых нужно узнать в «рантайм», без остановки кода — вы можете просто вывести их на консоль.

Groovy

Так же несколько выходящим за рамки темы статьи, вывод, который мы сделали при реализации нашего проекта и которым бы хотели поделиться, это то что писать UI лучше на языке более лаконичным чем Java. Мы воспользовались для этого Groovy и очень довольны. Количество кода сократилось раз в десять, а работа с XML и файловой системой упростилась так же на порядок. AST трансформации для создания Bindable свойств, наши трансформации позволили подмешивать сервисы в контроллеры, генерировать Bindable обертки для простых данных. И так далее. Что называется must have. Про использование Groovy для JavaFX мы пишем отдельную статью.

Планы

Подход, который мы использовали в разработке нашего настольного приложения, мы начали применять и для мобильной разработки. Мы используем PhoneGap+COLT и кейс практически ничем не отличается от JavaFX+HTML+COLT.

Выбрали PhoneGap, а не другую платформу так как уже было накоплено много готового в desktop проекте и переписывать заново на другую платформу нам показалось нецелесообразным. Если наше приложение потребует отказаться от PhoneGap, мы перепишем часть приложения на «натив», но весь функционал, который написан на HTML/JS мы не потеряем. Они просто будут по другому запускаться.

  • Блог компании CodeOrchestra
  • JavaScript
  • Java

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *