JavaFX TextField不会更新文本

时间:2016-09-03 03:38:40

标签: java javafx textfield

基本上,我有一个弹出式显示,其中有一个文本字段,我希望用户输入一个名称(然后我最终获得名称并在以后使用它,但这无关紧要)。不幸的是,textfield中的文本没有更新(图形上,程序仍然可以通过tf.getText()输入,但我看不到文本更新。)

    Stage window = new Stage();
    window.initModality(Modality.APPLICATION_MODAL);
    window.setTitle("Naming");
    window.setMinWidth(300);
    window.setMinHeight(200);
    Label label = new Label();
    label.setText("Please type a name");
    Button submitButton = new Button("Submit");
    TextField tf = new TextField();
    tf.setText("Please enter a name");
    tf.setMaxWidth(200);
    submitButton.setOnAction(e ->{
        System.out.println(tf.getText());
        window.close();
    });
    VBox layout = new VBox(10);
    layout.getChildren().addAll(label, submitButton, tf);
    Scene scene = new Scene(layout);
    window.setScene(scene);
    window.showAndWait();

问题可以通过changind window.showAndWait();修复到window.show(),但我想知道是否也可以通过其他方式解决。

1 个答案:

答案 0 :(得分:0)

showAndwait()方法是一个阻塞调用(因为它等待),并且您正在从主事件循环执行此命令,阻止处理重新绘制窗口等事件。 show()允许继续,因此允许此处理。这里的事情是你不想在你所在的范围内等待,而是阻止启动对话框等待的原始事件循环。这可以通过使另一个场景(具有主事件循环的主场景)启动该对话框来完成。这是一个示例代码,展示了这一点:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            // Your snippet
            Stage window = new Stage();
            window.initModality(Modality.APPLICATION_MODAL);
            window.setTitle("Naming");
            window.setMinWidth(300);
            window.setMinHeight(200);
            Label label = new Label();
            label.setText("Please type a name");
            Button submitButton = new Button("Submit");
            TextField tf = new TextField();
            tf.setText("Please enter a name");
            tf.setMaxWidth(200);
            submitButton.setOnAction(e ->{
                System.out.println(tf.getText());
                window.close();
            });
            VBox layout = new VBox(10);
            layout.getChildren().addAll(label, submitButton, tf);
            Scene scene2 = new Scene(layout);
            window.setScene(scene2);

            // Root window
            VBox layout2 = new VBox();
            Scene scene = new Scene(layout2,400,400);
            Button openButton = new Button("Open");
            openButton.setOnAction(e -> {
                // Launch from action handling thread
                window.showAndWait();

                // Add any logic here like acquiring the entered data from 
                // the window and do interesting stuff with it
            });
            layout2.getChildren().add(openButton);
            primaryStage.setScene(scene);

            // Launch main window with non-blocking call
            primaryStage.show();


        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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