Класс javafx.scene.Scene представляет контейнер для всех графических элементов внутри объекта Stage в виде графа, который называется Scene Graph. Все узлы этого графа, то есть по сути все вложенные элементы должны представлять класс javafx.scene.Node. Но корневой узел этого графа должен представлять объект класса, который унаследован от javafx.scene.Parent. По сути Parent - это контейнер, который может содержать другие элементы.
Для установки корневого узла в Scene применяется один из конструкторов объекта Scene. Основные из них:
Scene(Parent root)
: создает Scene с корневым узлом root
Scene(Parent root, double width, double height)
: создает Scene с корневым узлом root, с шириной width и высотой height
Scene(Parent root, Paint fill)
: создает Scene с корневым узлом root и устанавливает фоновый цвет
Scene(Parent root, double width, double height, Paint fill)
: создает Scene с корневым узлом root, с шириной width и высотой height и устанавливает фоновый цвет
При этом все конструкторы принимают в качестве первого параметра корневой узел. То есть при создании объекта Scene нам та или иначе придется установить и корневой узел.
Для установки сцены у объекта Stage вызывается метод setScene()
, в который передается объект Scene. Например, создадим простейшую сцену:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.Group; public class Main extends Application{ public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Group root = new Group(); // корневой узел Scene scene = new Scene(root); // создание Scene stage.setScene(scene); // установка Scene для Stage stage.setTitle("Hello JavaFX"); stage.setWidth(300); stage.setHeight(150); stage.show(); } }
В данном случае в качестве корневого узла используется объект класса Group, который унаследован от класса Parent. Однако поскольку Group не содержит никаких элементов, то по сути мы увидим пустое окно.
Немного изменим код программы:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.Group; import javafx.scene.layout.FlowPane; import javafx.scene.control.Button; import javafx.scene.control.Label; public class Main extends Application{ public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Label label = new Label("Hello"); // текстовая метка Button button = new Button("Button"); // кнопка Group group = new Group(button); // вложенный узел Group FlowPane root = new FlowPane(label, group); // корневой узел Scene scene = new Scene(root, 300, 150); // создание Scene stage.setScene(scene); // установка Scene для Stage stage.setTitle("Hello JavaFX"); stage.show(); } }
Здесь в качестве корневого узла выступает класс FlowPane, который располагает вложенные элементы подряд и который, как и Group, унаследован от класса Parent. FlowPane содержит объект Label (текстовая метка) и объект Group. А объект Group, в свою очередь, содержит объект Button (кнопка).
Визуально это будет выглядеть следующим образом:
А сам Scene Graph в данном случае будет представлять следующую структуру:
С помощью Scene мы можем настроить фоновый цвет и размеры окна. Для этого мы можем использовать один из конструкторов:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.Group; public class Main extends Application{ public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Group root = new Group(); Scene scene = new Scene(root, 400, 150, Color.BLUE); //scene.setFill(Color.BLUE); альтернативная установка цвета stage.setScene(scene); stage.setTitle("Hello JavaFX"); stage.show(); } }
В данном случае вся сцена занимает 400 единиц в ширину и 150 единиц в длину и будет окрашена в синий цвет. Цвет представляет объект javafx.scene.paint.Color.
Также для установки цвета можно применять метод setFill(Paint value).