我试图编写一个方法,允许我为作为参数传递的特定列设置列工厂。在这个上下文中,我有Orders,而且我有Food,这两个类在某个时候都显示在TableView中,并且都有一个我想格式化的列。
这是它的工作原理:
priceColumn.setCellFactory(col ->
new TableCell<Food, Double>() {
@Override
public void updateItem(Double price, boolean empty) {
super.updateItem(price, empty);
if (empty) {
setText(null);
} else {
setText(String.format("%.2f €", price));
}
}
}
);
这是我的格式化课程,其中我试图制作这个通用而不是复制粘贴每列的相同内容。问题在于它不会显示任何内容。
public static <T> void priceCellFormatting(TableColumn tableColumn){
System.out.println();
tableColumn.setCellFactory(col ->
new TableCell<T, Double>() {
protected void updateItem(double item, boolean empty) {
super.updateItem(item, empty);
if(empty){
setText(null);
}else {
setText(String.format("%.2f €", item));
}
}
});
}
我调用此方法,除了价格之外,每列都被填充:
private void fillTableListView() {
nameColumn.setCellValueFactory(new PropertyValueFactory<Order, String>("name"));
amountColumn.setCellValueFactory(new PropertyValueFactory<Order, Integer>("amount"));
priceColumn.setCellValueFactory(new PropertyValueFactory<Order, Double>("price"));
totalColumn.setCellValueFactory(new PropertyValueFactory<Order, Double>("total"));
Formatting.priceCellFormatting(priceColumn);
try {
orderTableView.setItems(OrderDAO.getOrder());
} catch (SQLException e) {
System.out.println("Exception at filling tablelistview: " + e);
}
}
答案 0 :(得分:3)
在您的代码中存在一个小错误,会产生巨大影响。你用过
protected void updateItem(double item, boolean empty)
而不是
protected void updateItem(Double item, boolean empty)
由于您使用原始类型double
而不是也用作类型参数的Double
类型,因此您不会覆盖updateItem
方法,而是创建一个新方法。从不使用此方法。而是使用默认的updateItem
方法。此实现不会修改单元格的文本。
提示: 在重写方法时始终使用@Override
注释。这允许编译器检查这样的错误。您还应该在priceCellFormatting
方法中添加方法参数的类型参数:
public static <T> void priceCellFormatting(TableColumn<T, Double> tableColumn){
System.out.println();
tableColumn.setCellFactory(col ->
new TableCell<T, Double>() {
@Override
protected void updateItem(Double item, boolean empty) {
super.updateItem(item, empty);
if(empty){
setText(null);
}else {
setText(String.format("%.2f €", item));
}
}
});
}