Откройте новое окно (window) в JavaFX
View more Tutorials:
В JavaFX чтобы создать окно (window) используйте класс Stage (Сцена).

Существует 3 вида модальости(modelity), которые вы можете применить для Stage через метод stage.initModality(Modelity).
- Modelity.NONE
- Modelity.WINDOW_MODAL
- Modelity.APPLICATION_MODAL
При создании нового Stage, вы можете настроить для него родительское окно (Так же называется окно, которое владеет им), через метод stage.initOwner(parentStage).
No | Модальность | Описание |
1 | Modelity.NONE | Когда вы открываете новое окно с этой модальностью (modelity), новое окно будет независимым по отношению к родительскому окну. Вы можете интерактировать с родительским окном, или закрыть его не влияя на новое окно. |
2 | Modelity.WINDOW_MODAL | Когда вы открываете новое окно с этой модальностью (modelity), новое окно блокирует родительское окно. Вы не можете интерактировать с родительским окном, до тех пор, пока это окно не закроется. |
3 | Modelity.APPLICATION_MODAL | Когда вы открываете новое окно с этой модальностью (modelity), оно блокирует все другие окна приложения. Вы не можете интерактировать ни с каким окном, до тех пор пока это окно не закроется. |
Например, когда вы нажимете на Button на окне 1, он откроет второе окно с модальностью (modelity) по умолчанию (Modeless Window / Modelity.NONE).

OpenNewModelessWindowExample.java
package org.o7planning.javafx.window; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class OpenNewModelessWindowExample extends Application { @Override public void start(final Stage primaryStage) { Button button = new Button(); button.setText("Open a New Window"); button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { Label secondLabel = new Label("I'm a Label on new Window"); StackPane secondaryLayout = new StackPane(); secondaryLayout.getChildren().add(secondLabel); Scene secondScene = new Scene(secondaryLayout, 230, 100); // New window (Stage) Stage newWindow = new Stage(); newWindow.setTitle("Second Stage"); newWindow.setScene(secondScene); // Set position of second window, related to primary window. newWindow.setX(primaryStage.getX() + 200); newWindow.setY(primaryStage.getY() + 100); newWindow.show(); } }); StackPane root = new StackPane(); root.getChildren().add(button); Scene scene = new Scene(root, 450, 250); primaryStage.setTitle("JavaFX Open a new Window (o7planning.org)"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
Например, когда вы нажимете на Button на окне 1, он откроет новое окно с модальностью Modal Window (Modelity.WINDOW_MODAL). Когда еще отображается новое окно, вы не можете интерактировать с родительским окном.

OpenNewModelWindowExample.java
package org.o7planning.javafx.window; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; import javafx.stage.Modality; import javafx.stage.Stage; public class OpenNewModelWindowExample extends Application { @Override public void start(final Stage primaryStage) { Button button = new Button(); button.setText("Open a New Window"); button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { Label secondLabel = new Label("I'm a Label on new Window"); StackPane secondaryLayout = new StackPane(); secondaryLayout.getChildren().add(secondLabel); Scene secondScene = new Scene(secondaryLayout, 230, 100); // New window (Stage) Stage newWindow = new Stage(); newWindow.setTitle("Second Stage"); newWindow.setScene(secondScene); // Specifies the modality for new window. newWindow.initModality(Modality.WINDOW_MODAL); // Specifies the owner Window (parent) for new window newWindow.initOwner(primaryStage); // Set position of second window, related to primary window. newWindow.setX(primaryStage.getX() + 200); newWindow.setY(primaryStage.getY() + 100); newWindow.show(); } }); StackPane root = new StackPane(); root.getChildren().add(button); Scene scene = new Scene(root, 450, 250); primaryStage.setTitle("JavaFX Open a new Window (o7planning.org)"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }