gpt4 book ai didi

java - 如何仅打开一次 JavaFX 窗口

转载 作者:行者123 更新时间:2023-12-03 08:24:34 27 4
gpt4 key购买 nike

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

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

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

最佳答案

您只需要跟踪舞台,并且仅在尚未显示的情况下打开一个新舞台。如果显示新窗口,您还可以选择禁用 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();
}
}

关于java - 如何仅打开一次 JavaFX 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66942987/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com