gpt4 book ai didi

JavaFX 等待值设置

转载 作者:行者123 更新时间:2023-12-02 01:21:15 25 4
gpt4 key购买 nike

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

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() 这样的东西?

最佳答案

一种可能的方法是使用一个附加 Pane ,该 Pane 可以在显示“弹出窗口”时禁用。

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

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

这是这个概念的一个快速但无可否认的没有吸引力的例子:

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();

}
}
<小时/>

结果:

screencast

关于JavaFX 等待值设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57642337/

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