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