0
我有一个tableview具有大约18列不同的数据类型,我可以定义一个定制的表格单元格,可以处理所有这些数据类型所以我可以将所有这些列的单元格工厂设置为此自定义表格单元格。我可以实现自定义表格单元格,它可以适用于tableview中的不同列类型Javafx
我有一个tableview具有大约18列不同的数据类型,我可以定义一个定制的表格单元格,可以处理所有这些数据类型所以我可以将所有这些列的单元格工厂设置为此自定义表格单元格。我可以实现自定义表格单元格,它可以适用于tableview中的不同列类型Javafx
如果你只显示文本,你可以做这样的事情:
public class SimpleTextCell<S,T> extends TableCell<S ,T> {
private final Function<T,String> textExtractor ;
public SimpleTextCell(Function<T, String> textExtractor) {
this.textExtractor = textExtractor ;
}
public SimpleTextCell() {
this(T::toString);
}
@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? null : textExtractor.apply(item));
}
}
(你可以根据你需要的updateItem(...)
方法添加更多的功能)。
现在你可以做这样的事情
TableColumn<Item, String> someStringColumn = new TableColumn<>();
someStringColumn.setCellFactory(tc -> new SimpleTextCell<>());
TableColumn<Item, Double> someDoubleColumn = new TableColumn<>();
someDoubleColumn.setCellFactory(tc ->
new SimpleTextCell<>(d -> String.format("%.3f", d.doubleValue())));
,或者如果它是足够使用的每一个默认行为,
TableColumn<Item, String> someStringColumn = new TableColumn<>();
TableColumn<Item, Double> someDoubleColumn = new TableColumn<>();
TableView<Item> table = new TableView<>();
table.getColumns().add(someStringColumn);
table.getColumns().add(someDoubleColumn);
table.getColumns().forEach(col -> col.setCellFactory(tc -> new SimpleTextCell<>()));
感谢名单@James_D,但我怎么能检测的类型第二个参数在运行时,我想为表视图中的所有列编写一个for循环,并为它们分配相同的TableCell,TableColumn- someStringColumn = new TableColumn <>(); (tc - > new SimpleTextCell
- ());如何检测我在updateItem方法内使用String DataType –
ManKeer
由于类型擦除,您无法在运行时动态检查表列的参数化类型。这里不太清楚你想在这里做什么:如果你想为不同的表列类型提供不同的行为,那么你根本就没有真正使用相同的表格单元实现。 (当然,您可以在'updateItem()'方法内执行'instanceof'测试,但这会非常难看。)由于您在创建列时可能知道表列类型,为什么不注册单元工厂然后? –
明白了你的意思,谢谢你的澄清。 – ManKeer