当前位置: 首页 > 知识库问答 >
问题:

JavaFX:等待值设置完毕

昌乐生
2023-03-14

我正在为以下问题而苦苦挣扎:我的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()这样的东西?

共有2个答案

赵君植
2023-03-14

下面是一个自定义对话框,在用户在 TextField 中输入数据之前,无法关闭或接受该对话框

    private void showInputTextDialog(){

            Label lblAmt = new Label("Enter Amount");
            Button btnOK = new Button("OK");
            TextField txtAmt = new TextField();

            AnchorPane customDialog = new AnchorPane();
            customDialog.setStyle("-fx-border-color:red;-fx-border-width:10px; -fx-background-color: lightblue;");
            customDialog.getChildren().addAll(lblAmt,btnOK,txtAmt);
            lblAmt.setLayoutX(30);
            lblAmt.setLayoutY(30);
            txtAmt.setLayoutX(164);
            txtAmt.setLayoutY(25);
            txtAmt.setMaxWidth(116);
            btnOK.setLayoutX(190);
            btnOK.setLayoutY(100);
            btnOK.setStyle("-fx-font-size: 18px;-fx-font-weight: bold;");
            lblAmt.setStyle("-fx-font-size: 18px;-fx-font-weight: bold;");
            txtAmt.setStyle("-fx-font-size: 18px;-fx-font-weight: bold;");

            Scene secondScene = new Scene(customDialog, 300, 180);

            EventHandler<ActionEvent> filter = event -> {
            if(txtAmt.getText().isEmpty()) {
    event.consume();
            }
            };

            // New window (Stage)
            Stage newWindow = new Stage();
            //newWindow.initStyle(StageStyle.UNDECORATED);
            newWindow.initModality(Modality.APPLICATION_MODAL);
            newWindow.setResizable(false);
            //newWindow.setTitle("Custom Dialog");
            newWindow.setScene(secondScene);
            btnOK.addEventHandler(ActionEvent.ACTION,filter);
            btnOK.setOnAction(evt -> {
            String str = txtAmt.getText();
            System.out.println("@@@@@@@@@@@@@@@@ str "+str);
            if(txtAmt.getText().trim().equals("")) {
                evt.consume();
                txtAmt.clear();
                txtAmt.requestFocus();
            }else{
                txAMT = Double.valueOf(str);
                newWindow.close();  
            }
            });

            newWindow.setOnCloseRequest(event -> {
                if(txtAmt.getText().isEmpty()) {
                event.consume();
            }
            });
            txtAmt.requestFocus();
            newWindow.showAndWait();
}
太叔凌龙
2023-03-14

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

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

当需要显示“弹出窗口”时,将其添加到您的< code>StackPane并禁用“内容”窗格。当弹出窗口关闭时,只需将其从您的< code>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();

    }
}

结果是:

 类似资料:
  • 我正在用JavaFX开发一个数据挖掘应用程序,它依赖于WebView(因此也依赖于WebEngine)。挖掘分两步进行:首先,用户使用UI导航到WebView中的一个网站,以配置可以在哪里搜索感兴趣的数据。其次,使用定期运行的后台任务,WebEngine加载相同的文档,并尝试从加载的文档中提取数据。 这种方法在大多数情况下都能很好地工作,但是最近我遇到了一些使用AJAX呈现内容的页面的麻烦。为了检

  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?

  • 我使用的是react native而不是expo,当尝试使用UseState设置值时,它不会立即设置,并且我无法获取值​​在另一个功能中。 如何让它等待设置,然后调用函数pressed()

  • 问题内容: 我有一个登录框架,我必须从另一个线程等待。成功登录后,框架将自行处置。我想弹出该应用程序的主框架。现在,我正在观看一个布尔值,以确定何时启动主机。正确的做法是什么?观看布尔值只是感觉并不优雅。 问题答案: 如果您有Java 5或更高版本,则可以使用CountDownLatch。例如,假设主框架最初处于控制状态,则让主框架创建一个倒数为1的,然后将此锁存器传递给登录框架。然后让主机等待锁

  • 我正在编写一个棋盘游戏,我需要检查玩家正在移动的敌人并提示进行攻击。但是,由于游戏是如何制作的,移动方法是在JavaFX应用程序线程上调用的,我希望能够提示用户是否要与敌人战斗。 我的对话框工作正常,使用等待和通知,在主线程上不工作,会导致程序崩溃,有人知道如何暂停这个线程的执行,直到用户单击其中一个按钮。 我为描述道歉,太晚了。 检查敌人的方法该方法检查敌人,如果用户选择是,则返回敌人。它运行在

  • 问题内容: 我通过将操作拆分为可用的确切内核数来并行化操作,然后通过启动相同数量的AsyncTask,对数据的不同部分执行相同的操作。 我正在使用以并行化它们的执行。 我想知道每个线程何时完成其工作,以便结合所有结果并执行进一步的操作。 我能怎么做? 问题答案: 您还可以简单地将共享库中的计数器递减作为的一部分。由于在同一线程(主线程)上运行,因此您不必担心同步。 更新1 共享对象可能看起来像这样