使用 fxml 将模型绑定到自定义控件

Bind model to a custom control using fxml

我必须自定义控件,parent 和 child。并且想要使用 fxml 将模型的一部分分配给 child,这不是 parent 中可用的简单字符串。可能吗?

Parent

public class ParentControl extends VBox {

  public LocalDate getDate() {
    return LocalDate.now();
  }
  
  public ParentControl() {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(
        "/parent.fxml"));
    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);
....

自定义控件

public class CustomControl extends VBox {

  @Getter
  @Setter
  LocalDate date;

parent.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import com.example.javafx.CustomControl?>
<?import javafx.scene.layout.VBox?>
<fx:root type="javafx.scene.layout.VBox" xmlns:fx="http://javafx.com/fxml">
    <CustomControl date="${date}"/>
</fx:root>
  @Getter
  @Setter
  LocalDate date;

我猜你在那里使用 Lombok? Lombok 目前不支持 JavaFX(有一个开放的功能请求),一旦支持,我猜它会使用不同的注释。

对于 属性 绑定,您需要一个 JavaFX 属性:

private final ObjectProperty<LocalDate> date= new SimpleObjectProperty<>(this, "date", null);

[...]

public final LocalDate getDate() {
    return dateProperty().get();
}

public final void setDate(LocalDate date) {
    dateProperty().set(date);
}

public ObjectProperty<LocalDate> dateProperty() {
    return date;
}

您需要更改为 ObservableValue 的 ParentControl 的日期 属性。问题是 LocalDate.now 的预期行为是什么?你希望 CustomControl.date 总是有当前时间吗?还是初始化的时间?