2016-04-03 82 views

回答

0

如果你只顯示文本,你可以做這樣的事情:

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<>())); 
+0

感謝名單@James_D,但我怎麼能檢測的類型第二個參數在運行時,我想爲表視圖中的所有列編寫一個for循環,併爲它們分配相同的TableCell,TableColumn someStringColumn = new TableColumn <>(); (tc - > new SimpleTextCell ());如何檢測我在updateItem方法內使用String DataType – ManKeer

+0

由於類型擦除,您無法在運行時動態檢查表列的參數化類型。這裏不太清楚你想在這裏做什麼:如果你想爲不同的表列類型提供不同的行爲,那麼你根本就沒有真正使用相同的表格單元實現。 (當然,您可以在'updateItem()'方法內執行'instanceof'測試,但這會非常難看。)由於您在創建列時可能知道表列類型,爲什麼不註冊單元工廠然後? –

+0

明白了你的意思,謝謝你的澄清。 – ManKeer

相關問題