JavaFX в Swing. Обработка событий

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

Данный урок опирается на предыдущем JavaFX в Swing. Особой сложности в организации нету. Главное это использование данного потока для данного компонента.

Реакция FX на события Swing

Первая модификация, это вынос FX Button как атрибут класса.

public class Form {
    private static Button button;

Дальше в методе show() мы добавим несколько компонентов от Swing(JButton).

private static void show() {
    JFrame frame = new JFrame("JavaFX in Swing");
    final JFXPanel panel = new JFXPanel();
    JPanel jPanel = new JPanel();
    JButton moveLeft = new JButton("Move <<");
    JButton moveRight = new JButton("Move >>");
    jPanel.add(moveLeft);
    jPanel.add(moveRight);
    jPanel.add(panel);
    frame.add(jPanel);
    frame.setSize(200,200);
    frame.setVisible(true);
       frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

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

    moveRight.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    double positionX = button.getLayoutX() + 2;
                    button.setLayoutX(positionX);
                }
            });
        }
    });

    moveLeft.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    double positionX = button.getLayoutX() - 2;
                    button.setLayoutX(positionX);
                }
            });
        }
    });
}

JPanel jPanel = new JPanel(); — создаем панель Swing на которой будем все размещать.

JButton moveLeft = newJButton("Move <<"); — создаем кнопку
jPanel.add(moveLeft); — размещаем на панели

jPanel.add(panel); — добавляем панель с FX компонентами

moveLeft.addActionListenernewActionListener(){..} — добавляем обработчик событий к кнопке.

Platform.runLater(newRunnable() {..} - изменения компонентов Java FX должны осуществляться в JavaFX User thread (потоке). Внутри этого метода, описываем их поведение.

Реакция Swing на события FX

Также, при событии(клике, наведении, ресайз и т.д) на компонентах FX можем влиять на компоненты Swing.

private static Scene createScene(){
    Group root = new Group();
    Scene scene = new Scene(root, 150, 120, Color.YELLOW);
    button = new Button("Hello World!");
    button.setLayoutX(50);
    button.setLayoutY(50);
    button.setOnAction(new EventHandler<javafx.event.ActionEvent>() {
        @Override
        public void handle(javafx.event.ActionEvent actionEvent) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JOptionPane.showMessageDialog(null,"Clicked!");
                }
            });
        }
    });
    root.getChildren().add(button);

    return scene;
}

button.setOnAction(new EventHandler() {..} — перехвачиваем событие клика.

SwingUtilities.invokeLater(new Runnable() {..} — изменения для Swing так же должны происходить в его потоке. Точнее в EDT(Event Dispatcher Thread)
JOptionPane.showMessageDialog(null,"Clicked!"); — вывод сообщения о клике

Безымянный

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


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

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

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

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

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