6

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

查看 API 文档,没有明显的 API 挂钩。但是,有columns- 属性。根据文档,它代表

作为此 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();
  }
}

但是,IllegalStateException当我请求wasPermutated.
有没有办法防止重新排序,或者至少以编程方式恢复它?

4

1 回答 1

9

请参见下面的 SSCCE,它显示侦听器被调用 - 但是added在移动列时该标志设置为。请注意,您需要next()在使用更改之前致电,否则您将获得一个IllegalStateException. 有关简单的规范示例,请参阅的javadoc 。ListChangeListener.Change

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();
  }
}
于 2012-05-15T10:40:58.923 回答