Лекция 10. GUI. JavaFX¶
Основы¶
Простое приложение¶
Рассмотрим простое приложение JavaFX:
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)
Сцена¶
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:
..
public static void main(String[] args) {
Application.launch(args);
}
..
Вся его задача: передать управление основному классу приложения с заданными параметрами.
Приложение¶
ImprovedHello¶
Рассмотрим более сложный пример приложения.
Начало файла: подключение многочисленных классов:
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);
}
Следующий блок: создание элементов управления
@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-функции)
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());
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();
}
}

Стили¶
Одним из важных перимуществ JavaFX является
использование каскадных таблиц стилей CSS
Рассмотрим пример приложения с кнопками, стиль которых задается в отдельном файле.
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:
.button {
-fx-background-color: blue;
-fx-text-fill: white;
}
Можно задавать стили прямо в коде:
Button yesBtn = new Button("Yes");
yesBtn.setStyle("-fx-text-fill: red; -fx-font-weight: bold;");
Диаграммы¶
Рассмотрим пример использования диаграмм JavaFX:
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.chart.PieChart;
public class PieChartUtil {
public static ObservableList<PieChart.Data> getChartData() {
ObservableList<PieChart.Data> 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;
}
}
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);
}
...
@Override
public void start(Stage stage) {
PieChart chart = new PieChart();
chart.setTitle("Population in 2000");
chart.setLegendSide(Side.LEFT);
ObservableList<PieChart.Data> 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();
}
}
