Лекция 10. GUI. JavaFX ####################################################################################### Основы =========================================================== Простое приложение `````````````````````````````````````````````````````````` Рассмотрим простое приложение JavaFX: .. code-block:: java import javafx.application.Application; import javafx.stage.Stage; public class HelloFXApp extends Application { @Override public void start(Stage stage) { stage.setTitle("Hello JavaFX Application"); stage.show(); } } Метод **main** может отсутствовать (наследуется через Application) Сцена `````````````````````````````````````````````````````````` .. code-block:: java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.Stage; public class HelloFXApp2 extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { Text msg = new Text("Hello JavaFX"); VBox root = new VBox(); root.getChildren().add(msg); Scene scene = new Scene(root, 300, 50); stage.setScene(scene); stage.setTitle("Hello JavaFX Application with a Scene"); stage.show(); } } launch `````````````````````````````````````````````````````````` Нормальный шаблон JavaFX-приложения содержит метод **main**: .. code-block:: java .. public static void main(String[] args) { Application.launch(args); } .. Вся его задача: передать управление основному классу приложения с заданными параметрами. Приложение =========================================================== ImprovedHello `````````````````````````````````````````````````````````` Рассмотрим более сложный пример приложения. Начало файла: подключение многочисленных классов: .. code-block:: java import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class ImprovedHello extends Application { public static void main(String[] args) { Application.launch(args); } Следующий блок: создание элементов управления .. code-block:: java @Override public void start(Stage stage) { Label nameLbl = new Label("Enter your name:"); TextField nameFld = new TextField(); Label msg = new Label(); // задается css для надписи msg.setStyle("-fx-text-fill: blue;"); Button sayHelloBtn = new Button("Say Hello"); Button exitBtn = new Button("Exit"); Задаем обработчики нажатий на клавиши (используются безымянные lambda-функции) .. code-block:: java sayHelloBtn.setOnAction(e -> { String name = nameFld.getText(); if (name.trim().length() > 0) { msg.setText("Hello " + name); } else { msg.setText("Hello there"); } }); exitBtn.setOnAction(e -> Platform.exit()); .. code-block:: java VBox root = new VBox(); root.setSpacing(5); root.getChildren().addAll(nameLbl, nameFld, msg, sayHelloBtn, exitBtn); Scene scene = new Scene(root, 350, 150); stage.setScene(scene); stage.setTitle("Improved Hello JavaFX Application"); stage.show(); } } .. image:: _static/10/improved-hello.png Стили =========================================================== Одним из важных перимуществ JavaFX является использование *каскадных таблиц стилей* **CSS** Рассмотрим пример приложения с кнопками, стиль которых задается в отдельном файле. .. code-block:: java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.HBox; import javafx.stage.Stage; public class ButtonStyleTest extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { Button yesBtn = new Button("Yes"); Button noBtn = new Button("No"); Button cancelBtn = new Button("Cancel"); HBox root = new HBox(); root.getChildren().addAll(yesBtn, noBtn, cancelBtn); Scene scene = new Scene(root); // Add a style sheet to the scene scene.getStylesheets().add("resources/css/buttonstyles.css"); stage.setScene(scene); stage.setTitle("Styling Buttons"); stage.show(); } } Содержимое файла **buttonstyles.css**: .. code-block:: none .button { -fx-background-color: blue; -fx-text-fill: white; } Можно задавать стили прямо в коде: .. code-block:: java Button yesBtn = new Button("Yes"); yesBtn.setStyle("-fx-text-fill: red; -fx-font-weight: bold;"); Диаграммы =========================================================== Рассмотрим пример использования диаграмм JavaFX: .. code-block:: java import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.chart.PieChart; public class PieChartUtil { public static ObservableList getChartData() { ObservableList data = FXCollections. observableArrayList(); data.add(new PieChart.Data("China", 1275)); data.add(new PieChart.Data("India", 1017)); data.add(new PieChart.Data("Brazil", 172)); data.add(new PieChart.Data("UK", 59)); data.add(new PieChart.Data("USA", 285)); return data; } } .. code-block:: java import javafx.application.Application; import javafx.collections.ObservableList; import javafx.geometry.Side; import javafx.scene.Scene; import javafx.scene.chart.PieChart; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class PieChartTest extends Application { public static void main(String[] args) { Application.launch(args); } ... .. code-block:: java @Override public void start(Stage stage) { PieChart chart = new PieChart(); chart.setTitle("Population in 2000"); chart.setLegendSide(Side.LEFT); ObservableList chartData = PieChartUtil.getChartData(); chart.setData(chartData); StackPane root = new StackPane(chart); Scene scene = new Scene(root); stage.setScene(scene); stage.setTitle("A Pie Chart"); stage.show(); } } .. image:: _static/10/pie.png Вопросы для самоконтроля =============================================