A sorting da coluna da tabela Java FX com o Comparador não funciona

No Java FX, gostaria de exibir este modelo em um TableView ordenado:

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

Eu gostaria de integrar uma coluna de tabela de sorting com a coluna “Kundenwert”. O valor exibido deve ser o atributo “kundenwertFormatted” (String) e para classificar o atributo “kundenwert” (Double) deve ser usado.

Então eu escrevi um comparador:

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

No meu entender, esse comparador deve ser usado da seguinte maneira:

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

Mas ao tentar classificar pela coluna “Kundenwert” recebo a seguinte exceção:

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

que aponta para esta linha:

 kundenwertColumn.setComparator(new ProfilZuordnungTableRowModelComparator()); 

Alguma ideia?

Seu problema pode ser resolvido usando uma CellFactory para a coluna que exibe o Kundenwert . Dessa forma, você não precisa do campo kundenwertFormatted em seu modelo, pois a formatação será feita pela fábrica de células:

 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; } } 

Então, você pode criar seu comparador para comparar o kundenwert que é duplo:

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

Finalmente, você pode configurar sua coluna da seguinte maneira:

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

Observe que usei argumentos de tipo, pois TableColumn (e seus complementos) é genérico.

Seu comparador para kundenwertColumn deve implementar um Comparator for Strings. Vai como

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