在Java FX中,我想在排序的TableView中显示此模型:
public class ProfilZuordnungTableRowModel {
private int id;
private double kundenwert;
private String kundenwertFormatted;
private BooleanProperty selected; }
我想将表列排序与列“ Kundenwert”集成在一起。
显示的值应该是属性“ kundenwertFormatted”(字符串),并且用于排序属性“ kundenwert”(双精度)。
所以我写了一个比较器:
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;
}
}
据我了解,该比较器应按以下方式使用:
TableColumn kundenwertColumn = new TableColumn();
kundenwertColumn.setText("Kundenwert");
kundenwertColumn.setCellValueFactory(new PropertyValueFactory("kundenwertFormatted"));
kundenwertColumn.setComparator(new ProfilZuordnungTableRowModelComparator());
但是,当尝试按“ Kundenwert”列进行排序时,出现以下异常:
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<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;
}
}
然后,您可以创建比较器来比较
kundenwert
,它是两倍:public class KundenwerComparator implements Comparator<Double> {
public int compare(Double o1, Double o2) {
return o1 < o2 ? -1 : o1 == o2 ? 0 : 1;
}
}
最后,您可以按以下方式设置您的列:
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());
请注意,由于
TableColumn
(及其同伴)是通用的,因此我使用了类型参数。