【问题标题】:How to disable column-reordering in a JavaFX2 TableView?如何在 JavaFX2 TableView 中禁用列重新排序?
【发布时间】:2012-05-22 20:11:07
【问题描述】:

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

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

【问题讨论】:

  • 我刚刚尝试了该方法,并且在移动列时确实调用了 onChanged 方法。但是我在change.wasPermutated() 上得到一个 IllegalStateException。
  • 在那种情况下,我的代码可能太复杂了。我将设置一个最小的示例并从那里继续。
  • 刚刚对我的答案进行了编辑,它有点工作。您需要先调用change.next(),然后再检查其状态+移动列似乎将标志设置为添加,而不是排列...
  • 也重置似乎没有做你认为它正在做的事情 - 请参阅此处的 javadoc:docs.oracle.com/javafx/2/api/javafx/collections/…

标签: java user-interface tableview javafx-2


【解决方案1】:

请参阅下面的 SSCCE,它显示侦听器被调用 - 但在移动列时标志设置为 added。请注意,您需要在使用更改之前致电next(),否则您将获得IllegalStateException。请参阅javadoc of 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();
  }
}

【讨论】:

  • 感谢您的 cmets,我现在有一个工作样本。我的代码比你的更简洁,我觉得它更好地回答了这个问题,但我想把解决方案归功于你。如果我编辑您的答案以显示我的代码并将其标记为已接受,可以吗?
  • @UrsReupke 当然——我的回答只是部分的——如果它符合你的要求,你应该发布你的答案并接受它。
  • /*我把它变成了一个通用函数*/ @SuppressWarnings({ "rawtypes", "unchecked" }) public static void moveableFalse(TableView tableView) { List>列 = 新的 ArrayList(tableView.getColumns()); tableView.getColumns().addListener(new ListChangeListener() { public boolean suspend; @Override public void onChanged(Change change) { change.next(); if (change.wasReplaced() && !suspended) { this.suspended = true ; tableView.getColumns().setAll(columns); this.suspended = false; } } }); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 2022-01-07
  • 2010-11-07
  • 1970-01-01
相关资源
最近更新 更多