2013-09-02 2 views
2

В Java FX Я хотел бы, чтобы отобразить эту модель в отсортированном TableView:Java FX столбец таблицы сортировки с компаратор не работает

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

Я хотел бы интегрировать столбец таблицы сортировки с колонкой " 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; 
    } 
} 

В моем понимании это компаратор должен использоваться следующим образом:

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()); 

Любые идеи?

+0

Почему вы «kundenwert» и «kundenwertFormatted»? Я думаю, что они избыточны, а форматирование должно выполняться пользовательским интерфейсом, а не моделью. – Katona

ответ

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

Затем вы можете создать компаратор для сравнения 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 (и это компаньонов) является общим.

2

Ваш компаратор для kundenwertColumn должен реализовать Компаратор для строк. Это идет как

class KundenwertFormattedComparator implements Comparator<String> { 
    @Override 
    public int compare(String t, String t1) { 
     return getKundenwertFromFormatted(t) < getKundenwertFromFormatted(t1) ? -1 : getKundenwertFromFormatted(t) == getKundenwertFromFormatted(t1) ? 0 : 1; 
    } 
} 
Смежные вопросы