Лекция 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();
   }
}
_images/improved-hello.png

Стили

Одним из важных перимуществ 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();
   }
}
_images/pie.png

Вопросы для самоконтроля