2015-04-13 3 views
1

Почему мой TableColumn.setSortable() показывает сортировку в заголовке таблицы, когда я дважды нажимаю на нее, но на самом деле это вообще не делает? Я бы предположил, что он, естественно, знает, как сортировать номера? Должен ли я устанавливать явный компаратор даже для типов с естественным поведением?Обработчики кликов JavaFX TableView не работают?

public class PenaltyDashboardManager { 

    private final TableView<Penalty> penaltyTable = new TableView<Penalty>(); 

    /* ... */ 

    private void initializeTable() { 

     penaltyTable.setItems(Penalty.getPenaltyManager().getPenalties()); 
     penaltyTable.setEditable(true); 

     TableColumn<Penalty,Number> penaltyId = new TableColumn<>("ID"); 
     penaltyId.setCellValueFactory(c -> c.getValue().getPenaltyIdProperty()); 
     penaltyId.setEditable(true); 
     penaltyId.setSortable(true);  
     /* ... */ 

     penaltyTable.getColumns.add(penaltyId); 
    } 

} 

ОБНОВЛЕНИЕ

Очень странно. Я попытался создать простой пример, чтобы показать, что сортировка не работает. Но этот простой столбец целых чисел сортируется просто отлично:/

public final class TableSortTest extends Application { 

    private static final ObservableList<NumericCombo> values = FXCollections.observableList(
      IntStream.range(1, 100).mapToObj(i -> new NumericCombo()).collect(Collectors.toList())); 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Collections.shuffle(values); 

     TableView<NumericCombo> tableView = new TableView<>(); 
     tableView.setItems(values); 

     TableColumn<NumericCombo,Number> combo1 = new TableColumn<>("COMBO 1"); 
     combo1.setCellValueFactory(c -> new ReadOnlyObjectWrapper<>(c.getValue().combo1)); 

     TableColumn<NumericCombo,Number> combo2 = new TableColumn<>("COMBO 2"); 
     combo2.setCellValueFactory(c -> c.getValue().combo2); 

     TableColumn<NumericCombo,Number> combo3 = new TableColumn<>("COMBO 3"); 
     combo3.setCellValueFactory(c -> c.getValue().combo3); 

     tableView.getColumns().addAll(combo1,combo2,combo3); 

     Group root = new Group(tableView); 

     Scene scene = new Scene(root); 

     primaryStage.setScene(scene); 

     primaryStage.show(); 

    } 

    private static final class NumericCombo { 
     private static final Random rand = new Random(); 

     private final int combo1; 
     private final IntegerProperty combo2; 
     private final IntegerProperty combo3; 

     private NumericCombo() { 
      combo1 = rand.nextInt((10000 - 0) + 1); 
      combo2 = new SimpleIntegerProperty(rand.nextInt((10000 - 0) + 1)); 
      combo3 = new SimpleIntegerProperty(rand.nextInt((10000 - 0) + 1)); 
     } 
    } 
} 
+0

Вы уверены, что когда вы нажимаете на заголовок столбца для 'ID', он не сортируется? – ItachiUchiha

+0

Положительные. Возможно ли быть проблемой JRE1.0.0_25? – tmn

+0

Он должен работать для естественных типов данных сортировки –

ответ

1

Я нашел проблему! Я использовал собственную реализацию ObservableList, называемую ObservableImmutableList. Он обертывает интерфейс ObservableList вокруг Guava ImmutableList. Поскольку ImmutableList не модифицируется, его нельзя сортировать ... даже в TableView.

Это переход к другому вопросу, который я пытаюсь выяснить. Как отсортировать мой ObservableImmutableList? So I posted another question.

Смежные вопросы