JavaFX 无法设置任何节点对象的值或"更改状态"



我正在创建一个带有日期选择器和其他一些节点的弹出窗口。我希望这个日期选择器在弹出窗口打开时显示当前日期。

,我设置当前日期在弹出控制器构造函数,就像我在我的应用程序其他地方:

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!
}

相关内容

  • 没有找到相关文章

最新更新