使用超级 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>>
的方法。
我有几个 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>>
的方法。