如何在JavaFX2表视图中禁用列重新排序?
JavaFX2的特性 “用户在运行时对列重新排序”。 我想为我的应用程序中的一个特定表禁用此功能 看看API文档,没有明显的API钩子。 但是,还有如何在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
列
-属性。根据文件,它代表
属于此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