2016-04-03 43 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

相关问题