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

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

public class ProfilZuordnungTableRowModel { private int id; private double kundenwert; private String kundenwertFormatted; private BooleanProperty selected; } 

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

所以我写了一个比较器:

 class ProfilZuordnungTableRowModelComparator implements Comparator { @Override public int compare(ProfilZuordnungTableRowModel t, ProfilZuordnungTableRowModel t1) { return t.getKundenwert() < t1.getKundenwert() ? -1 : t.getKundenwert() == t1.getKundenwert() ? 0 : 1; } } 

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

  TableColumn kundenwertColumn = new TableColumn(); kundenwertColumn.setText("Kundenwert"); kundenwertColumn.setCellValueFactory(new PropertyValueFactory("kundenwertFormatted")); kundenwertColumn.setComparator(new ProfilZuordnungTableRowModelComparator()); 

但是当尝试按“Kundenwert”列排序时,我得到以下exception:

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

这指向这一行:

 kundenwertColumn.setComparator(new ProfilZuordnungTableRowModelComparator()); 

有任何想法吗?

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

 public class KundenwertCellFactory implements Callback, TableCell> { public TableCell call(TableColumn param) { TableCell cell = new TableCell() { @Override public void updateItem(final Double item, boolean empty) { if (item != null) { setText(item.toString()); // you can format your value here } } }; return cell; } } 

然后,你可以创建你的比较器来比较kundenwert是double:

 public class KundenwerComparator implements Comparator { public int compare(Double o1, Double o2) { return o1 < o2 ? -1 : o1 == o2 ? 0 : 1; } } 

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

 TableColumn kundenwertColumn = new TableColumn(); kundenwertColumn.setText("Kundenwert"); kundenwertColumn.setCellValueFactory(new PropertyValueFactory("kundenwert")); kundenwertColumn.setComparator(new KundenwerComparator()); kundenwertColumn.setCellFactory(new KundenwertCellFactory()); 

请注意,我使用了类型参数,因为TableColumn (和它的同伴)是通用的。

kundenwertColumn的比较器应该实现一个Comparator for Strings。 它就像

 class KundenwertFormattedComparator implements Comparator { @Override public int compare(String t, String t1) { return getKundenwertFromFormatted(t) < getKundenwertFromFormatted(t1) ? -1 : getKundenwertFromFormatted(t) == getKundenwertFromFormatted(t1) ? 0 : 1; } }