Java 对TableView列进行排序:一种绕过“";“未分类”;模式

Java 对TableView列进行排序:一种绕过“";“未分类”;模式,java,javafx-2,Java,Javafx 2,这里是我希望得到答案的另一个JavaFX问题。当前,在TableView中对列进行排序时,从第一次单击开始按升序排序,从第二次单击开始按降序排序,第三次单击则不执行任何操作,排序箭头消失。我知道第三种排序模式应该将列返回到以前未排序的状态。我知道最近由于流行的请求而增加了这种模式,但是有没有办法完全绕过它呢?也就是说,第一次按升序排序,第二次按降序排序,就是这样,第三次按升序排序?有没有一个简单的方法可以做到这一点 谢谢您是否尝试向列中添加ChangeListener column.sortTy

这里是我希望得到答案的另一个JavaFX问题。当前,在TableView中对列进行排序时,从第一次单击开始按升序排序,从第二次单击开始按降序排序,第三次单击则不执行任何操作,排序箭头消失。我知道第三种排序模式应该将列返回到以前未排序的状态。我知道最近由于流行的请求而增加了这种模式,但是有没有办法完全绕过它呢?也就是说,第一次按升序排序,第二次按降序排序,就是这样,第三次按升序排序?有没有一个简单的方法可以做到这一点


谢谢

您是否尝试向列中添加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);
            }
        }
    });
column.sortTypeProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(final observevalue您是否尝试向列中添加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);
            }
        }
    });
column.sortTypeProperty().addListener(新的ChangeListener()){
@凌驾

公共无效更改(最终可观察值自当前JFX API起,唯一的解决方案如下: 创建名为MyTableView的新类,该类扩展了TableView,现在您可以根据自己的方便覆盖其现有的sort()方法。第三次单击时,list 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>
        }
}
公共类MyTableView扩展了TableView{
private int countHeaderClick=-1;
@凌驾
公共无效排序(){
最终可观察列表>排序器=getSortOrder();
countHeaderClick++;
super.sort();
if(sortOrder.size()>0){
columnClicked=sortOrder.get(0).getId();//单击的列的名称
strSortTypeValue=sortOrder.get(0).getSortType().toString();//升序或降序
}否则{
}
}

希望能有所帮助。

对于当前的JFX API,唯一的解决方案如下: 创建名为MyTableView的新类,该类扩展了TableView,现在您可以根据自己的方便覆盖其现有的sort()方法。第三次单击时,list 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>
        }
}
公共类MyTableView扩展了TableView{
private int countHeaderClick=-1;
@凌驾
公共无效排序(){
最终可观察列表>排序器=getSortOrder();
countHeaderClick++;
super.sort();
if(sortOrder.size()>0){
columnClicked=sortOrder.get(0).getId();//单击的列的名称
strSortTypeValue=sortOrder.get(0).getSortType().toString();//升序或降序
}否则{
}
}

希望能有所帮助。

以下是解决此问题的快捷方法:

// 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);
      }
    }
  });
}
//全局变量
表视图表;
TableColumn currentSortColumn;
void initialize(){
//设置默认排序列
currentSortColumn=table.getColumns().get(0);
table.getSortOrder().setAll(currentSortColumn);
//排序更改后更新当前排序列
for(TableColumn列:table.getColumns()){
column.sortTypeProperty().addListener((可观察、旧值、新值)->{
currentSortColumn=列;
});
}
//如果表丢失比较器,请恢复排序顺序!
table.comparatorProperty().addListener((可观察、旧值、新值)->{
if(newValue==null){
table.getSortOrder().setAll(currentSortColumn);
if(currentSortColumn.getSortType().equals(TableColumn.SortType.ASCENDING)){
currentSortColumn.setSortType(TableColumn.SortType.DESCENDING);
}否则{
currentSortColumn.setSortType(TableColumn.SortType.ASCENDING);
}
}
});
}

这里有一个快速而肮脏的解决方案:

// 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);
      }
    }
  });
}
//全局变量
表视图表;
TableColumn currentSortColumn;
void initialize(){
//设置默认排序列
currentSortColumn=table.getColumns().get(0);
table.getSortOrder().setAll(currentSortColumn);
//排序更改后更新当前排序列
for(TableColumn列:table.getColumns()){
column.sortTypeProperty().addListener((可观察、旧值、新值)->{
currentSortColumn=列;
});
}
//如果表丢失比较器,请恢复排序顺序!
table.comparatorProperty().addListener((可观察、旧值、新值)->{
if(newValue==null){
table.getSortOrder().setAll(currentSortColumn);
if(currentSortColumn.getSortType().equals(TableColumn.SortType.ASCENDING)){
currentSortColumn.setSortType(TableColumn.SortType.DESCENDING);
}否则{
currentSortColumn.setSortType(TableColumn.SortType.ASCENDING);
}
}
});
}

TableView上的sortOrder属性负责保存显示为已排序的列。 记住这一点,以确保始终对列进行排序,可以观察此属性,并且无论何时发现它不包含该列(例如“第三次单击”),只要通过侦听器将其添加回即可:

TableColumn<?,?> aColumnThatMustAlwaysBeSorted = ...;

tableView.getSortOrder().addListener( (ListChangeListener<? super TableColumn<?,?>>)observable -> {
    if( !tableView.getSortOrder().contains(aColumnThatMustAlwaysBeSorted) ){
        aColumnThatMustAlwaysBeSorted.setSortType(SortType.ASCENDING);
        tableView.getSortOrder().add(aColumnThatMustAlwaysBeSorted);
    }
});

getSortOrder().add(aColumnThatMustAlwaysBeSorted);
TableColumn必须始终按顺序排序的列=。。。;
tableView.getSortOrder().addListener((ListChangeListener>)可观察->{
如果(!tableView.getSortOrder()包含(必须始终禁用的列)){
一个必须始终为ESORTED.setSortType(SortType.ASCENDING)的列;
tableView.getSortOrder().add(必须始终禁用的列);
}
});
getSortOrder().add(必须始终禁用的列);
shift单击多个列进行排序时的行为乍一看可能有点不寻常,因为单击另一列时,“始终排序”列将成为第二个排序索引,任何其他列都将在其后追加。如果用户希望它进一步向下