繁体   English   中英

如何只打开一次 JavaFX Window

[英]How to open a JavaFX Window only once time

我有一个 JavaFX 应用程序,我需要简单地避免用户在应用程序中多次打开相同的 window。

我试图找到一些解决方案,但没有任何适用。

作为一个样本......我有一个 window 给我付款选项,它不是一个模式,它是一个新阶段。 当我单击按钮打开 window 时,它已打开,无论是否有同一阶段的另一个实例在运行,只需单击一次即可打开新的 windows。 我想避免这种情况。 就像点击按钮时切换到已经打开的阶段 window 一样,或者如果 window 已经打开,则直接错过点击。

您只需要跟踪舞台,并且仅在尚未显示时打开一个新舞台。 如果新的 window 正在显示,您也可以选择禁用Button ,但我更喜欢将新的 window 简单地放回前面,以便用户知道它在那里。

您可以通过创建对Stage的引用然后检查它是null还是在按钮的事件处理程序中显示来做到这一点。

这是一个 MCVE 来演示:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    /**
     * Reference to the new Window that will allow only one instance at a time.
     */
    private Stage newWindowStage;

    public static void main(String[] args) {

        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        VBox root = new VBox(5);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(10));

        Button openWindow = new Button("Open Window");

        // **********************************************************************************************
        // Set the button to open the new Window Stage
        // **********************************************************************************************
        openWindow.setOnAction(event -> {

            // **********************************************************************************************
            // Check if the Stage is already showing.
            // **********************************************************************************************
            if (newWindowStage == null || !newWindowStage.isShowing()) {

                // **********************************************************************************************
                // The new window is not currently open, so create/show it
                // **********************************************************************************************
                newWindowStage = new Stage();
                newWindowStage.setWidth(300);
                newWindowStage.setHeight(300);
                newWindowStage.setScene(new Scene(
                        new VBox(
                                new Label("New Window!")
                        )
                ));
                newWindowStage.show();
            } else {
                // **********************************************************************************************
                // The window is already open, so bring it to the front of focus
                // **********************************************************************************************
                newWindowStage.toFront();
            }

        });

        root.getChildren().add(openWindow);

        primaryStage.setScene(new Scene(root));
        primaryStage.setWidth(200);
        primaryStage.setHeight(200);
        primaryStage.setTitle("Test Application");
        primaryStage.show();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM