我正在努力解决以下问题:
我的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();
}
}
结果: