基本上,我有一个弹出式显示,其中有一个文本字段,我希望用户输入一个名称(然后我最终获得名称并在以后使用它,但这无关紧要)。不幸的是,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()
,但我想知道是否也可以通过其他方式解决。
答案 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);
}
}