具有简单 xml 模型的 JavaFX TableView

JavaFX TableView with simple xml model

对于配置,我使用简单的 xml。我也将此模型用于 TableView。我的问题是使用布尔值。 TableView 需要 BooleanProperty,但显然 xml 无法访问此对象。我如何在不编写大代码的情况下将其结合起来?

型号

@Root(name="scriptdata")
@Order(elements={"title", "active"})
public class ScriptData {
    @Element (required=true)
    private String title;
    @Element (required=false)
    private BooleanProperty active;

    /**
     *
     * @param title
     * @param active
     */
     public ScriptData() {
        this.active = new SimpleBooleanProperty(active);
     }


    public boolean isActive() {
        return active.getValue();
    }

    public void setActive(boolean active) {
        this.active.set(active);
    }

细胞工厂

modulActiveColumn.setCellValueFactory(new PropertyValueFactory<>("active"));
modulActiveColumn.setCellFactory(CheckBoxTableCell.forTableColumn(modulActiveColumn));
modulActiveColumn.setOnEditCommit((EventHandler<CellEditEvent>) t -> {
    ((ScriptData) t.getTableView().getItems().get(
      t.getTablePosition().getRow())
      ).setActive((boolean) t.getNewValue());
}

My problem is using of boolean. TableView needs BooleanProperty

你错了。事实上,TableView 永远无法访问存储在其项的 active 字段中的 BooleanProperty 对象。

PropertyValueFactory 使用反射

  1. 通过调用构造函数参数与 "Property" 连接的方法来访问 属性 对象。 (在您的情况下,此方法将被称为 activeProperty())。
  2. 如果以上方法不起作用,它会将 getter 为 属性 返回的值包装在 ObservableValue 中。 (在这种情况下 getter 的名称是 getActive()isActive)。

在您的情况下,cellValueFactory 执行类似于以下工厂的操作

modulActiveColumn.setCellValueFactory(cellData -> new SimpleBooleanProperty(cellData.getValue().isActive()));

使用 boolean 字段存储数据与您的情况完全相同。这种方法的缺点是 属性 的编程更新不会触发 TableView 的更新,需要手动处理编辑。

@Root(name="scriptdata")
@Order(elements={"title", "active"})
public class ScriptData {
    @Element (required=true)
    private String title;
    @Element (required=false)
    private boolean active;

    /**
     *
     * @param title
     * @param active
     */
    public ScriptData() {
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }
}