JavaFX в Swing

В этом уроке, я хотел бы продемонстрировать как использовать элементы JavaFX в Swing для того чтобы придать приложению более красивый и приятный вид.

Сразу хочу попросить прощение за мое столь долгое отсутствие  перед читателями, а так же тем крутым чуваком (Александром Барчуком) который продолжал штамповать вам уроки-статьи, а так же записывать видео уроки) Я постараюсь теперь успевать предоставить вам полезный контент и сделать жизнь Александра чуть проще, а вашу более интересную)

Значит так, в конце урока мы получим простое графическое окно и будем разбираться с тем как вовсе делается это внедрение, а  дальше будем усложнять функционал, добавлять новых функций.

Создаем обычное JavaSE приложение.

Сразу я испугаю вас куском кода и потом начну объяснять что к чему тут)

package com.devcolibri;

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;

import javax.swing.*;

public class Form {

    private static void show() {
        JFrame frame = new JFrame("JavaFX in Swing");
        final JFXPanel panel = new JFXPanel();
        frame.add(panel);
        frame.setSize(200,200);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                initFX(panel);
            }
        });
    }

    private static Scene createScene(){
        Group root = new Group();
        Scene scene = new Scene(root, Color.YELLOW);
        Button button = new Button("Hello World!");
        button.setLayoutX(50);
        button.setLayoutY(50);
        root.getChildren().add(button);

        return scene;
    }

    private static void initFX(JFXPanel panel){
        Scene scene = createScene();
        panel.setScene(scene);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                show();
            }
        });
    }

}

Рассмотрим от главного к зависимому.

Шаг 1

У нас есть main метод который запускает наше приложение. Внутри него есть вызов метода show().

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        show();
    }
});

Метод invokeLater говорит, что нужно обновить GUI поток. Он будет выполняться асинхронно с AWT. Без него, правда, сейчас тоже будет работать, но давайте следовать красивом стилю.

Идем дальше.

Шаг 2

private static void show() {
    JFrame frame = new JFrame("JavaFX in Swing");
    final JFXPanel panel = new JFXPanel();
    frame.add(panel);
    frame.setSize(200,200);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            initFX(panel);
        }
    });
}

На этом участке я думаю вы много знаете и сами. Создаем Frame, даем размеры, заголовок, видимость и операцию по умолчанию при клике на крестик. Но у нас добавляется такой компонент как JFXPanel. Именно благодаря нему, мы можем добавлять компоненты с JavaFX на форму. Platform.runLater это также запуск в новом потоке метода, для осуществления запуска инициализации нашей панели методом initFX(panel). Этот метод будет выполняться перед другими Runnable. (Runnable работает с JavaFX).

Шаг 3

private static void initFX(JFXPanel panel){
    Scene scene = createScene();
    panel.setScene(scene);
}

Как вы помните, все элементы JavaFX должны находиться на сцене. Этот метод займется тем, чтобы поместить содержимое сцены на панель.

Шаг 4

private static Scene createScene(){
    Group root = new Group();
    Scene scene = new Scene(root, Color.YELLOW);
    Button button = new Button("Hello World!");
    button.setLayoutX(50);
    button.setLayoutY(50);
    root.getChildren().add(button);

    return scene;
}

Если вы не знакомы с JavaFX, то скажу что там интерфейс базируется на узлах, точках. root — это корневой узел к которому мы крепим сцену. Первый параметр это отец сцены, вторым я задал фон. Обратите внимание что Button с пространства имен JavaFX. setLayout — выставляет позицию кнопки. Последними действиями мы добавляем кнопку на сцену root.getChildren().add(button); и возвращаем нашу подготовленную сцену.

В итоге у Вас должно получиться вот такое приложение:

Screenshot - 09152013 - 10:42:35 PM

Как по мне, такая кнопка намного красивее чем то что есть в Swing. Тем более, используя стили, можно попробовать украсить ее больше. Надеюсь был полезен :-).

Урок создан: 15 сентября 2013 | Просмотров: 7647 | Автор: Олег Криль | Правила перепечатки


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

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

Ваш e-mail не будет опубликован.

Комментарии:

Комментариев пока нет, будьте первым.