【问题标题】:How to open a JavaFX Window only once time如何只打开一次 JavaFX 窗口
【发布时间】:2021-06-30 17:20:42
【问题描述】:

我有一个 JavaFX 应用程序,我需要简单地避免用户在应用程序内多次打开同一个窗口。

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

作为示例...我有一个窗口可以提供付款选项,它不是模式,而是一个新阶段。当我单击按钮打开该窗口时,它已打开,无论是否有同一阶段的另一个实例正在运行,每次单击都会打开新窗口。我想避免这种情况。就像点击按钮时切换到已经打开的舞台窗口,或者如果该窗口已经打开,则直接错过点击。

【问题讨论】:

  • 跟踪它是否打开过一次(并禁用按钮直到再次关闭)

标签: java javafx window fxml stage


【解决方案1】:

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

您可以通过创建对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();
    }
}

【讨论】:

  • 我已经尝试过该解决方案,但是当我运行它时,我得到...按下按钮时什么都没有。
  • 您是否复制了我发布的所有代码?你用的是什么版本的JDK?
猜你喜欢
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
相关资源
最近更新 更多