В данном уроке я продолжу знакомство с интеграцией 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!");
– вывод сообщения о клике
ПОХОЖИЕ ПУБЛИКАЦИИ
- None Found
0 комментариев к статье "JavaFX в Swing. Обработка событий"