2016-04-19 1 views
1

Вот еще один вопрос JavaFX, на который я надеялся получить ответ. В настоящее время, когда вы сортируете столбец в TableView, вы получаете восходящий порядок от первого щелчка, опускаетесь со второго щелчка, а на третьем клике ничего не делает, и стрелка сортировки исчезает. Я понимаю, что третий режим сортировки должен вернуть столбец обратно в прежнее состояние без несогласованности. Я знаю, что этот режим был добавлен недавно из-за популярных запросов, но есть ли способ полностью обойти его? То есть, при первом щелчке мы сортируем в порядке возрастания, на втором клике мы сортируем по убыванию, и это все, третий клик будет снова возрастать? Есть простой способ сделать это?Сортировка столбцов TableView: способ обхода «несортированного» режима

Спасибо

+0

Я попытался найти решение, но я этого не сделал. Пожалуйста, сообщите нам, если вы нашли хак! – mrbela

ответ

-1

Вы пытались добавить ChangeListener в колонку?

column.sortTypeProperty().addListener(new ChangeListener<javafx.scene.control.TableColumn.SortType>() { 
     @Override 
     public void changed(final ObservableValue<? extends javafx.scene.control.TableColumn.SortType> observable, 
       final javafx.scene.control.TableColumn.SortType oldValue, final javafx.scene.control.TableColumn.SortType newValue) { 
      if (oldValue==javafx.scene.control.TableColumn.SortType.DESCENDING) { 
       column.sortTypeProperty().set(javafx.scene.control.TableColumn.SortType.ASCENDING); 
      } 
     } 
    }); 

EDIT: так как код выше не работает (см комментарий) Я предлагаю следующее:

Button columnHeader = new Button("column name"); 
columnHeader.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent arg0) { 
      if (column.getSortType()==SortType.DESCENDING) { 
       column.setSortType(SortType.ASCENDING); 
      } 
     } 
    }); 
column.setGraphic(columnHeader); 
+0

Это не работает, потому что слушатель не запускается, если пользователь нажимает заголовок на каждый третий раз. – mrbela

+1

Хорошо, тогда единственным решением, о котором я могу думать, является прослушивание каждого щелчка по столбцу. Это можно сохранить, установив графику заголовка столбца, например column.setGraphic (новая кнопка («columnName»)); и добавление ActionListener к этой кнопке. – Karl

+0

Вы можете отредактировать свой ответ с помощью этой информации, чтобы я мог вернуть его обратно в 0. Thx. – mrbela

0

В текущей JFX API, Единственное решение это выглядит следующим образом: Создайте новый класс под названием MyTableView, который расширяет TableView, и теперь вы можете переопределить существующий метод sort(), как вам удобно. При третьем щелчке, список sortOrder ничего не вернет, и его размер будет равен нулю. На этом этапе вы можете отслеживать счет, если это третий клик. Пожалуйста, приложите небольшой код.

public class MyTableView<S> extends TableView { 
    private int countHeaderClick = -1 ; 

    @Override 
    public void sort(){ 
     final ObservableList<? extends TableColumn<S,?>> sortOrder = getSortOrder(); 

     countHeaderClick++ ; 
     super.sort(); 
     if(sortOrder.size() > 0) { 
      columnClicked = sortOrder.get(0).getId(); // name of column clicked 

      strSortTypeValue = sortOrder.get(0).getSortType().toString(); // ascending or descending 

     }else{ 
      <what ever you want to perform> 
     } 
} 

Надеюсь, это поможет.

0

Вот быстрое и грязное решение этой проблемы:

// global variables 
TableView<Object> table; 
TableColumn currentSortColumn; 

void initialize() { 
    // set default sort column 
    currentSortColumn = table.getColumns().get(0); 
    table.getSortOrder().setAll(currentSortColumn); 

    // update current sort column after sorting changes 
    for (TableColumn column : table.getColumns()) { 
    column.sortTypeProperty().addListener((observable, oldValue, newValue) -> { 
     currentSortColumn = column; 
    }); 
    } 
    // if table loses comparator restore the sort order! 
    table.comparatorProperty().addListener((observable, oldValue, newValue) -> { 
    if (newValue == null) { 
     table.getSortOrder().setAll(currentSortColumn); 
     if (currentSortColumn.getSortType().equals(TableColumn.SortType.ASCENDING)) { 
     currentSortColumn.setSortType(TableColumn.SortType.DESCENDING); 
     } else { 
     currentSortColumn.setSortType(TableColumn.SortType.ASCENDING); 
     } 
    } 
    }); 
} 
0

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

Поведение при переключении нескольких столбцов для сортировки может показаться немного необычным сначала, так как при нажатии на другой столбец столбец «всегда отсортированный» станет вторым индексом сортировки и последующие столбцы будут добавлены после него. Если пользователь хочет, чтобы он был дальше вниз по индексу, тогда сдвиг, щелчок по столбцу «всегда отсортированный» снова заставит его быть добавленным в качестве последнего индекса сортировки.