使用超级 class 字段填充 Tableview

Populate Tableview with super class fields

我有几个 class 都继承自一个 super class,需要填充与其 class 相关的多个 TableView

超级 class 是抽象的,一些 getter 和 setter 是最终的,但仍然包含填充单元格所需的数据。

为每一列写一个新的回调 class 是可行的,但我正在寻找一种方法来实现它。

示例代码

class SuperClass
{
  protected String name;
  protected double value;
  public final void setName(String name)
  {
    this.name = name;
  }
  public final void getName()
  {
    return this.name;
  }
  public final void setValue(double value)
  {
    this.value = value;
  }
  public double getValue()
  {
    return this.value;
  }
}
class SubClass1 extends SuperClass
{
  private int id;
  public void setId(int id)
  {
    this.id = id;
  }
  public int getId()
  {
    return this.id;
  }
}
class SubClass2 extends SuperClass
{
  private String location;
  public void setLocation(String location)
  {
    this.location = location;
  }
}
class SubClass3 extends SuperClass
{
  private ObservableMap<SuperClass> map;
  public ObservableMap<SuperClass> map()
  {
    return this.map;
  }
}

表格视图

TableColumn<SubClass1, Integer> tc1_id;
TableColumn<SubClass1, String> tc1_name;
TableColumn<SubClass1, Double> tc1_value;
TableColumn<SubClass2, String> tc2_loc;
TableColumn<SubClass2, String> tc2_name;
TableColumn<SubClass2, Double> tc2_value;
TableColumn<SubClass3, String> tc3_name;
TableColumn<SubClass3, Double> tc3_value;

这是我要做什么的参考... Accessing Subclass properties in a JavaFX TableView ObservableArrayList

但仅仅使用示例代码,我基本上重写了 2 个方法,每个方法 3 次...实际程序中的内容比实际程序中的要多一些。 (再多一点)

我认为您只是在问如何减少必须编写的代码量。解决方案与任何此类问题相同:编写一个执行重复部分的方法,并用变化的部分对其进行参数化。因此,在这种情况下,您只需要编写一个通用实用程序方法来生成您的 table 列,获取列的标题和生成单元格值工厂所需的 属性 的函数。

例如你可以做类似

的事情
private <S,T> TableColumn<S,T> createColumn(String title, Function<S, Property<T>> prop) {
    TableColumn<S,T> column = new TableColumn<>(title);
    column.setCellValueFactory(cellData -> prop.apply(cellData.getValue()));
    return column ;
}

然后如果您的模型 类 使用 JavaFX 属性,您只需要

TableColumn<SubClass1, Number> tc1Id = createColumn("Id", SubClass1::idProperty);

等等

如果您不使用 JavaFX 属性(这是推荐的方法),您仍然可以这样做

TableColumn<SubClass2, String> tc2Loc = 
    createColumn("Location", item -> new SimpleStringProperty(item.getLocation()));

或者只是创建一个接受 Function<S,T> 而不是 Function<S,Property<T>> 的方法。