Mở một cửa sổ (window) mới trong JavaFX

Xem thêm các chuyên mục:

1- Window trong JavaFX

Trong JavaFX để tạo ra một cửa sổ (window) bạn sử dụng lớp Stage (Sân khấu).
Có 3 loại thể thức (modelity) bạn có thể áp dụng cho Stage thông qua phương thức stage.initModality(Modelity).
  • Modelity.NONE
  • Modelity.WINDOW_MODAL
  • Modelity.APPLICATION_MODAL
Khi tạo mới một Stage, bạn có thể thiết lập cửa sổ cha cho nó (Còn gọi là cửa sổ sở hữu nó), thông qua phương thức stage.initOwner(parentStage).
No Modelity Mô tả
1 Modelity.NONE Khi bạn mở một cửa sổ mới với thể thức (modelity) này, cửa sổ mới sẽ độc lập với cửa sổ cha. Bạn có thể tương tác với cửa sổ cha, hoặc đóng cửa sổ cha mà không ảnh hưởng tới cửa sổ mới.
2 Modelity.WINDOW_MODAL Khi bạn mở một cửa sổ mới với thể thức (modelity) này, cửa sổ mới khóa cửa sổ cha. Bạn không thể tương tác với cửa sổ cha, cho tới khi cửa sổ này bị đóng lại.
3 Modelity.APPLICATION_MODAL Khi bạn mở một cửa sổ mới với thể thức (modelity) này, nó sẽ khóa mọi cửa sổ khác của ứng dụng. Bạn không thể tương tác với bất kỳ cửa sổ nào khác cho tới khi cửa sổ này bị đóng lại.

2- Ví dụ, Mở một Modeless Window

Ví dụ, khi bạn nhấn vào một Button trên cửa sổ 1, nó sẽ mở ra một cửa sổ thứ 2 với thể thức (modelity) mặc định ( 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);

				// Một cửa sổ mới (Stage)
				Stage newWindow = new Stage();
				newWindow.setTitle("Second Stage");
				newWindow.setScene(secondScene);

				// Sét đặt vị trí cho cửa sổ thứ 2.
				// Có vị trí tương đối đối với cửa sổ chính.
				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);
	}

}

3- Ví dụ, Mở một Modal Window

Ví dụ, khi bạn nhấn vào một Button trên cửa sổ 1, nó sẽ mở ra một cửa sổ mới với thể thức Modal Window ( Modelity.WINDOW_MODAL). Khi cửa sổ mới còn hiển thị bạn không thể tương tác với cửa sổ cha.
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);

				// Một cửa sổ mới (Stage)
				Stage newWindow = new Stage();
				newWindow.setTitle("Second Stage");
				newWindow.setScene(secondScene);

				// Chỉ định modality (thể thức) cho cửa sổ mới.
				newWindow.initModality(Modality.WINDOW_MODAL);

				// Chỉ định chủ sở hữu (cửa sổ cha) của cửa sổ mới.
				newWindow.initOwner(primaryStage);

				// Sét đặt vị trí cho cửa sổ thứ 2.
				// Có vị trí tương đối đối với cửa sổ chính.
				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);
	}

}

Xem thêm các chuyên mục: