我正在努力解决以下问题:
我的javafx应用程序中有一个弹出窗口,应该阻塞该应用程序,直到用户进行一些输入为止。这不是一个单独的阶段,在这里我可以调用showAndWait()然后返回该阶段的输入。弹出窗口被实现为一个窗格,该窗格放置在其他组件上。现在我做这样的事情:

PopupPane pp = new PopupPane()
stackPane.add(new PopupPane()); //show pane
//... waiting until user terminates popup
return pp.getInput(); //returns input when user terminates popup


所以我希望pp.getInput()等待,直到用户在我的弹出窗口中按下OK / CANCEL / APPLY / ...按钮。在这种情况下,如何实现类似于showAndWait()的东西?

最佳答案

一种可行的方法是利用一个附加的窗格,该窗格在显示“弹出”窗口时可以被禁用。

例如,假设您的Scene的根布局窗格是StackPane。您可以将界面的所有其余部分包装在另一个Pane中,根据需要将其禁用或启用。

当需要显示“弹出窗口”时,将其添加到您的StackPane并禁用“内容”窗格。当弹出窗口关闭时,只需将其从StackPane中删除​​,然后重新启用“内容”窗格即可。

这是该概念的一个快速且公认的没有吸引力的示例:

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

public class SimulatedPopupExample extends Application {

    private static StackPane root;
    private static BorderPane content;

    public static void main(String[] args) {
        launch(args);
    }

    private static void showPopup() {

        // Disable the main layout pain
        content.setDisable(true);

        VBox popup = new VBox();
        popup.setPadding(new Insets(10));
        popup.setAlignment(Pos.CENTER);
        popup.setStyle("-fx-border-color: black; -fx-background-color: -fx-base;");
        popup.setMaxSize(200, 200);

        popup.getChildren().add(
                new Button("Close Popup") {{
                    setOnAction(event -> {
                        // Re-enable the pane
                        content.setDisable(false);

                        // Remove popup from root layout
                        root.getChildren().remove(popup);

                    });
                }}
        );

        // Add popup to root layout
        root.getChildren().add(popup);
    }

    @Override
    public void start(Stage primaryStage) {

        // Simple Interface
        root = new StackPane();
        content = new BorderPane(
                new Button("Show \"Popup\"") {{
                    setOnAction(e -> showPopup());
                }},
                new Button("Top Button"),
                new Button("Right Button"),
                new Button("Bottom Button"),
                new Button("Left Button")
        );

        root.getChildren().add(content);

        // Show the stage
        primaryStage.setScene(new Scene(root));
        primaryStage.setWidth(500);
        primaryStage.setHeight(400);
        primaryStage.setTitle("SimulatedPopupExample Sample");
        primaryStage.show();

    }
}




结果:

java - JavaFX等待设置值-LMLPHP

10-08 12:33