пятница, 4 июня 2010 г.

JavaFX + Swing + Composer. Как встроить swing-контрол в форму JavaFX с использованием плагина Composer для NetBeans

JavaFX представляет собой достаточно новую и перспективную платформу создания визуальных интерфейсов с возможностью их использования как в web-приложения, так и в dektop. Палитра визуальных компонентов на данный момент в JavaFX весьма скудна и сами разработчики JavaFX рекомендуют использовать в качестве недостающих компоненты Swing. Встал вопрос: как добавить на форму JavaFX обычный компонент Swing. Для ускорения разработки визуальной части в NetBeans существует плагин Composer. Я использую этот плагин и отказываться от него мне не хотелось. Посмотрим что же в итоге получилось.

1. Как подготовить компонент Swing для размещения его на форме JavaFX.
//Создание нашего Swing контрола
var myB = new JButton();
//Сделаем наш контрол встраиваемым в приложение JavaFX с графической сценой
var myJavaFXB = SwingComponent.wrap(myB);
2. Как поместить наш подготовленный контрол в JavaFX сцену.
Класс сцены javafx.scene.Scene имеет поле content, который является списком всех контролов, лежащих в этой сцене. Наша задача поместить подготовленный нами Swing контрол в этот список.

3. Что делать если используем Composer.
Этот плагин помогает конструировать визуальную часть, при этом он генерирует часть кода, которая не доступна для редактирования из NetBeans. По моему, это очень замечательно, но требует изучения мысли разработчиков этого самого плагина. Найдем код, среди того что редактировать нельзя, который отвечает за класс нашей сцены с компонентом Swing. Выглядеть он может примерно так:
masterScene = javafx.scene.Scene {
            width: 640.0
            height: 480.0
            content: javafx.scene.layout.Panel {
                content: getDesignRootNodes ()
            }
};
Тут masterScene это моя визуальная сцена, куда требуется поместить контрол Swing. Прочитаем еще раз пункт 2 этой статьи. Мы имеем content, но не можем дописать эту часть кода прямо здесь, она не редактируемая.
Теперь откроем визуальный редактор Composer для редактирования нашей формы. В инспекторе объектов создаем метод, отрабатывающий по завершению создания нашей сцены. См. рис.
Теперь мы имеем метод, в который необходимо поместить логику добавления нашего подготовленного контрола в сцену. Примерно так.
 //нередактируемый код
masterScene = javafx.scene.Scene {
            width: 640.0
            height: 480.0
            content: javafx.scene.layout.Panel {
                content: getDesignRootNodes ()
            }
};
scenePost_CreationCode(); // <-- вызов нашего только что добавленного метода

... ... ...
// наш только что добавленный метод
function scenePost_CreationCode(): Void {
        // Предварительно установим некоторый значения и расположение на форме
        myB.setText("Нажми меня");
        myJavaFXB.height = 25;
        myJavaFXB.width = 75;
        myJavaFXB.layoutX = 10;
        myJavaFXB.layoutY =10;
        // Добавим наш подготовленный контрол в список сцены.
        insert myJavaFXB into getDesignScene().content;
}
Вот, собственно, и все.