使用Comparator进行Java FX表列排序不起作用

Dan*_*iel 2 java sorting javafx comparator

在Java FX中,我想在已排序的TableView中显示此模型:

   public class ProfilZuordnungTableRowModel {
    private int id;
    private double kundenwert;
    private String kundenwertFormatted;
    private BooleanProperty selected; }
Run Code Online (Sandbox Code Playgroud)

我想将表列排序与"Kundenwert"列集成.显示的值应该是属性"kundenwertFormatted"(String),并且应该使用属性"kundenwert"(Double)进行排序.

所以我写了一个比较器:

class ProfilZuordnungTableRowModelComparator implements Comparator<ProfilZuordnungTableRowModel> {

    @Override
    public int compare(ProfilZuordnungTableRowModel t, ProfilZuordnungTableRowModel t1) {
         return t.getKundenwert() < t1.getKundenwert() ? -1 : t.getKundenwert() == t1.getKundenwert() ? 0 : 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这个比较器应该以下列方式使用:

    TableColumn kundenwertColumn = new TableColumn();
    kundenwertColumn.setText("Kundenwert");

    kundenwertColumn.setCellValueFactory(new PropertyValueFactory("kundenwertFormatted"));
    kundenwertColumn.setComparator(new ProfilZuordnungTableRowModelComparator());
Run Code Online (Sandbox Code Playgroud)

但是当尝试按"Kundenwert"列排序时,我得到以下异常:

java.lang.ClassCastException: java.lang.String cannot be cast to model.ProfilZuordnungTableRowModel
    at dialog.TableCellFactorySample$ProfilZuordnungTableRowModelComparator.compare(TableCellFactorySample.java:53)
Run Code Online (Sandbox Code Playgroud)

这指向这一行:

kundenwertColumn.setComparator(new ProfilZuordnungTableRowModelComparator());
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Kat*_*ona 5

您可以通过使用CellFactory列显示来解决您的问题Kundenwert.这样您就不需要kundenwertFormatted模型中的字段,因为格式化工厂将完成格式化:

public class KundenwertCellFactory implements Callback<TableColumn<ProfilZuordnungTableRowModel, Double>, TableCell<ProfilZuordnungTableRowModel, Double>> {

    public TableCell<ProfilZuordnungTableRowModel, Double> call(TableColumn<ProfilZuordnungTableRowModel, Double> param) {
        TableCell<ProfilZuordnungTableRowModel, Double> cell = new TableCell<ProfilZuordnungTableRowModel, Double>() {

            @Override
            public void updateItem(final Double item, boolean empty) {
                if (item != null) {
                    setText(item.toString()); // you can format your value here
                }
            }
        };
        return cell;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建比较器来比较kundenwert哪个是双倍的:

public class KundenwerComparator implements Comparator<Double> {

    public int compare(Double o1, Double o2) {
        return o1 < o2 ? -1 : o1 == o2 ? 0 : 1;

    }

}
Run Code Online (Sandbox Code Playgroud)

最后,您可以按如下方式设置列:

TableColumn<ProfilZuordnungTableRowModel, Double> kundenwertColumn = new TableColumn<ProfilZuordnungTableRowModel, Double>();
kundenwertColumn.setText("Kundenwert");

kundenwertColumn.setCellValueFactory(new PropertyValueFactory<ProfilZuordnungTableRowModel, Double>("kundenwert"));
kundenwertColumn.setComparator(new KundenwerComparator());
kundenwertColumn.setCellFactory(new KundenwertCellFactory());
Run Code Online (Sandbox Code Playgroud)

请注意,我使用类型参数,因为TableColumn(它的伴侣)是通用的.