我正在创建一个带有日期选择器和其他一些节点的弹出窗口。我希望这个日期选择器在弹出窗口打开时显示当前日期。
,我设置当前日期在弹出控制器构造函数,就像我在我的应用程序其他地方:
popup constructor
public TimeAndDateController(Stage stage, Task task) {
try {
this.taskReference = task;
this.popupStage = stage;
this.datePicker = new DatePicker();
datePicker.setValue(LocalDate.now());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
我希望当用户单击主应用程序窗口中的按钮时出现弹出窗口,因此我添加了所有必要的组件,并最终在弹出阶段调用showAndWait()
。
事件触发弹出窗口,在主应用程序的控制器
customTime.setOnAction(e -> Platform.runLater(() -> {
Task task = getSelectedTask();
try {
FXMLLoader loader = Utility.getFXMLLoader("fxml/timeAndDatePopup.fxml");
Stage popupStage = new Stage();
loader.setControllerFactory(c -> TimeAndDateControllerFactory(popupStage, task));
Scene scene = new Scene(loader.load());
popupStage.setScene(scene);
popupStage.showAndWait();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}));
现在弹出窗口按预期出现,没有任何错误,但是数据选择器(或我在那里的任何其他节点)没有值。
我不明白为什么会发生这种事。所有节点初始化,没有空指针或错误消息,FXML很好,然而我不能设置一个值或有任何控制节点。我今天花了几个小时在这个问题上,寻找答案,但一无所获。到目前为止,我已经试过了:
- 使用一个弹出类而不是一个阶段(如图所示)。
- 设置弹出窗口控制器内的弹出阶段,但这导致了另一个奇怪的,阻止我使用
stage.close()
关闭弹出窗口。 - 各种加载FXML和手动设置控制器的方法,例如
正如@ law和@James_D先生在评论中正确指出的那样,解决这个问题的方法是实现initializable
接口和initialize
方法,其中应该设置节点的所有属性。
这是因为,事实证明:
FXML加载器创建新的节点,如果它们有fx:id,它分配这些节点对应的引用。
新手的错误。
因此,在这种情况下,设置日期选择器值的正确方法如下:
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
datePicker.setValue(LocalDate.now()); // works!
}