JavaFX使cellFactory变得通用

时间:2017-06-10 06:40:51

标签: java generics javafx

我试图编写一个方法,允许我为作为参数传递的特定列设置列工厂。在这个上下文中,我有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);
    }
}

1 个答案:

答案 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));
                }


            }
        });

}