如何解决如何只打开一次 JavaFX 窗口
我有一个 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();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。