2012-09-23 2 views
4

My TableView заполняет данные из базы данных. Когда пользователь нажимает на заголовок столбца, он сортирует данные на основе этого. Эта функция недоступна. Тем не менее, у меня слишком много записей, чтобы заполнить их за раз. Скажем, у меня 1000 записей, а таблица показывает только 500. Когда я сортирую ее на основе столбца, она только замыкает 500 уже заполненных записей.Как переопределить поведение сортировки в TableView

Я хотел бы переопределить поведение сортировки, поэтому, когда пользователь нажимает на заголовок столбца, он перезагружает данные из базы данных и предоставляет необходимую информацию для предложения «order by» в запросе. Моя проблема в том, что я не знаю

  1. Как отключить существующее поведение сортировки. Я могу установить свойство сортировки столбца на false, но я боюсь, что заголовок не будет доступен для кликов.
  2. Как подключить слушателя для прослушивания события щелчка заголовка столбца. Верно ли метод tableView.getSortOrder(). AddListener()?

ответ

1

У меня есть уродливое решение, которое решает только половину проблемы. Я могу прикрепить прослушиватель к событию щелчка заголовка столбца, но не могу удалить поведение сортировки по умолчанию TableView.

private void initTable() { 
    ... 
    ... 
    //listen to sorting type (ASC/DESC) change 
    SortTypeChangeListener sortTypeChangeListener = new SortTypeChangeListener(); 
    clmName.sortTypeProperty().addListener(sortTypeChangeListener); 
    clmGender.sortTypeProperty().addListener(sortTypeChangeListener); 
    reload(); 

    //listen to sortorder change 
    tblMember.getSortOrder().addListener(new ListChangeListener<TableColumn<VOMember, ?>>() { 
     @Override 
     public void onChanged(Change<? extends TableColumn<VOMember, ?>> change) { 
      reload(); 
     } 
    }); 
} 

private void reload() { 
    /** 
    * Get sorted columns and sorting versus (ASC/DESC) 
    */ 
    List<String> lstSortedColumn = new ArrayList<String>(); 
    List<String> lstSortedType = new ArrayList<String>(); 
    for (TableColumn<VOMember, ?> tc : tblMember.getSortOrder()) { 
     PropertyValueFactory valFactory = (PropertyValueFactory) tc.getCellValueFactory(); 
     valFactory.getProperty(); 
     lstSortedColumn.add(valFactory.getProperty()); 
     lstSortedType.add(tc.getSortType().name()); 
    } 

/** 
    * Retrieve data from database. Pass the sorting information 
    */   
    List<VOMember> lstMember = controller.retrieve(lstSortedColumn, lstSortedType); 
    ObservableList<VOMember> data = FXCollections.observableList(lstMember); 
    tblMember.setItems(data); 
} 

class SortTypeChangeListener implements InvalidationListener { 

    @Override 
    public void invalidated(Observable o) { 
     /** 
     * If the column is not in sortOrder list, just ignore. 
     * It avoids intermittent duplicate reload() calling 
     */ 
     TableColumn col = (TableColumn) ((SimpleObjectProperty) o).getBean(); 
     if (!tblMember.getSortOrder().contains(col)) { 
      return; 
     } 

     reload(); 
    } 
} 

Хотелось бы услышать ваше мнение/комментарий по этому вопросу.

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