JavaFX 8 TableView, как полностью обойти поведение сортировки столбцов по умолчанию и включить собственное

короткая версия; У меня есть база данных, в которой я предварительно отсортировал 30 ArrayList, соответствующих 15 столбцам. 15 отсортированы по возрастанию, 15 отсортированы по убыванию; lColumn1, lColumn2, lColumn3 ... rColumn1, rColumn2, rColumn3 (предыдущая буква «l» говорит мне, что это список, предшествующая буква «r» говорит мне, что это обратный список. Таким образом, «rColumn3» говорит мне, что этот ListArray имеет отсортированный столбец 3 в порядке убывания.

Когда я нажимаю на заголовок столбца, мне не нужны какие-либо методы сортировки по умолчанию, включая стрелки вверх/вниз. Все, что мне нужно, это @Override поведение по умолчанию, чтобы при нажатии на заголовок столбца

  1. Щелчок по заголовку столбца таблицы открывает доступ к моему методу, который определяет, какой
  2. ListArray для загрузки в таблицу, а затем
  3. загружает этот массив как ObservableList.

У меня есть рабочий код для частей 2 и 3 выше. Как сделать 1? - переопределить поведение сортировки по умолчанию, чтобы щелчок по столбцу таблицы обходил все поведение сортировки по умолчанию и получал доступ только к моему методу?

Подробнее для тех, кто не любит короткие версии:

У меня есть удаленная база данных, к которой я обращаюсь, которая имеет около 100 строк, которые загружаются в массив, который становится строками таблицы, причем каждая строка (строка) впоследствии разбивается на 15 столбцов. Перед редактированием каждая строка представляет собой строку, содержащую как числа, так и строки, которые при разбивке на ячейки многие ячейки содержат и то, и другое; 25°, или 87%, и т. д. Чтобы правильно отсортировать большую часть таблицы, мне нужно сначала удалить буквенные символы, а затем сравнить полученные числа, чтобы я мог отсортировать их как число, а не как строку. Для этого я создал 30 ArrayList, предварительно отсортированных и готовых к загрузке непосредственно в таблицу при необходимости.

Пытаясь обойти методы сортировки TableView по умолчанию, у меня есть следующее:

table  = new TableView<Person>() {
 @Override
 public void sort() {
  setColumns();
 }
};

И для каждого столбца:

firstCol.sortTypeProperty().addListener(new ChangeListener<TableColumn.SortType>() {
 @Override
 public void changed(ObservableValue<? extends TableColumn.SortType> observable, TableColumn.SortType oldValue, TableColumn.SortType newValue)
 {
  firstCol.setSortNode(null); // This line does nothing
  String result = "";
  if ( sc.getVal() == 0 ) { result = (sc.getDirection().equals("ASCENDING") ? "DESCENDING" : "ASCENDING"); }
  else { result = "ASCENDING"; }
  sc.setDirection(result);
  sc.setVal(0);
 }
});

Это загружает правильный предварительно отсортированный ListArray по желанию (обычно после полдюжины кликов или около того), но стрелки вверх/вниз все еще появляются (они не нужны и не нужны), он по-прежнему следует 3 параметрам переключения по умолчанию - вверх, вниз и вариант без стрелки «Я игнорирую ваш клик».

Как мне настроить это так, чтобы при нажатии на заголовок TableColumn щелчок распознавался, но я мог @Override все поведение сортировки по умолчанию и вместо этого получать доступ к своим собственным методам?


person VikingGlen    schedule 29.08.2015    source источник


Ответы (1)


Спасибо Джеймсу Д за то, что подтолкнул меня в правильном направлении.

Мне нужно было изменить заголовок столбца с текста на графику, что позволило мне установить прослушиватель щелчка мыши. Следующий код работает (только соответствующий код):

TableColumn<Person, String> firstCol  = new TableColumn<>( ); // Do not include a TableColumn name here or it will be duplicated on the table
Label firstHeader = new Label( "Name" ); // Put the TableColumn name here: = new Label( "Name") 
firstCol.setGraphic(firstHeader); 
firstCol.setSortable(false);
firstCol.setCellFactory(TextFieldTableCell.forTableColumn());
tractorHeader.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
{
 @Override
 public void handle(final MouseEvent e) 
 {
  System.out.println("Mouse Event Detected: " + e.toString());
  String result = "";
  if ( sc.getVal() == 0 ) { result = (sc.getDirection().equals("ASCENDING") ? "DESCENDING" : "ASCENDING"); }
  else { result = "ASCENDING"; }
  sc.setDirection(result);    // Store last sort direction request
  sc.setVal(0);               // Store last column number sorted
  setColumns();               // Method to set table ObservableList to the correct presorted ObservableList
 }
});
person VikingGlen    schedule 01.09.2015