如何在JavaFX2表视图中禁用列重新排序?

如何在JavaFX2表视图中禁用列重新排序?,java,user-interface,tableview,javafx-2,Java,User Interface,Tableview,Javafx 2,JavaFX2的特性 “用户在运行时对列重新排序”。 我想为我的应用程序中的一个特定表禁用此功能 看看API文档,没有明显的API钩子。 但是,还有列-属性。根据文件,它代表 属于此TableView的TableColumns。当用户重新排列TableView列时,此列表将更新以反映当前的视觉顺序 希望我至少能够在更改发生后重置更改,我尝试添加一个侦听器以在更改发生后重置更改 import javafx.application.Application; import javafx.collect

JavaFX2的特性 “用户在运行时对列重新排序”。 我想为我的应用程序中的一个特定表禁用此功能

看看API文档,没有明显的API钩子。 但是,还有
-属性。根据文件,它代表

属于此TableView的TableColumns。当用户重新排列TableView列时,此列表将更新以反映当前的视觉顺序

希望我至少能够在更改发生后重置更改,我尝试添加一个侦听器以在更改发生后重置更改

import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

public class TableTest extends Application {

  public static void main(String[] args) {
    launch(args);
  }


  @Override
  public void start(Stage stage) {
    TableView tableView = new TableView();
    tableView.getColumns().setAll(new TableColumn(), new TableColumn());
    tableView.getColumns().addListener(new ListChangeListener() {
        @Override
        public void onChanged(Change change) {
            if (change.wasPermutated()){
               change.reset();
            }
        }
    });
    stage.setScene(new Scene(tableView));
    stage.show();
  }
}
但是,当我请求
wasportated
时,侦听器会以
非法状态异常
中止
是否有办法防止重新排序,或者至少通过编程方式将其还原?

请参见下面的SSCCE,该SSCCE显示侦听器被调用,但在移动列时,该标志被设置为添加的
。请注意,在使用更改之前,您需要调用
next()
,否则将得到
IllegalStateException
。有关简单的规范示例,请参见

import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

public class TableTest extends Application {

  public static void main(String[] args) {
      launch(args);
  }

  @Override
  public void start(Stage stage) {
    final TableView tableView = new TableView();
    final TableColumn[] columns = {new TableColumn("1"), new TableColumn("2")};
    tableView.getColumns().setAll(columns);
    tableView.getColumns().addListener(new ListChangeListener() {
        public boolean suspended;

        @Override
        public void onChanged(Change change) {
            change.next();
            if (change.wasReplaced() && !suspended) {
                this.suspended = true;
                tableView.getColumns().setAll(columns);
                this.suspended = false;
            }
        }
    });
    stage.setScene(new Scene(tableView));
    stage.show();
  }
}

我刚刚尝试了这个方法,当移动列时,
onChanged
方法确实会被调用。然而,我在
change.wasportated()
上得到了一个非法状态异常。在这种情况下,我的代码可能太复杂了。我将设置一个最小的示例,并从那里继续。刚刚对我的答案进行了编辑,它可以正常工作。您需要先调用
change.next()
,然后再检查其状态+移动列似乎会将标志设置为added,而不是permutated…此外,重置似乎并没有执行您认为它正在执行的操作-请参阅此处的javadoc:感谢您的评论,我现在有了一个工作示例。我的代码比你的更简洁,我觉得它更好地回答了这个问题,但我想把解决方案归功于你。如果我编辑您的答案以显示我的代码并将其标记为已接受,可以吗?@UrsReupke确定-我的答案只是部分-您应该发布您的答案并接受它,如果它符合您的要求。/*我将其转换为通用函数*/@SuppressWarnings({“rawtypes”,“unchecked”})public static void moveableFalse(TableView TableView){List