【问题标题】:Bind model to a custom control using fxml使用 fxml 将模型绑定到自定义控件
【发布时间】:2021-03-19 17:01:21
【问题描述】:

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

父母

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;

父.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>

【问题讨论】:

    标签: javafx fxml


    【解决方案1】:
      @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;
    }
    

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

    【讨论】:

    • 是的,我希望它总是有当前时间。你是对的,我需要使用 JavaFX 属性。另外我需要使用一个控制器 它可以工作,但是有一个问题是我将 spring 与 javafx 一起使用,以及一个不允许与绑定一起使用的构建器表达式。我描述了这个问题here
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    相关资源
    最近更新 更多