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