监听TableView 的列,并利用javafx.collections.ListChangeListener.Change 恢复到拖拽前的顺序。
JavaFX中,TableView的列在默认情况下是可拖拽的,但是却没有方法去禁止这个拖拽功能。
在网上看过一段代码,大致功能是:
1. 监听TableView中列变化;
2. 列顺序发生改变,重置为原始顺序。
[java] view plaincopy
1. tblView.getColumns().addListener(new ListChangeListener() {
2. @Override
3. public void onChanged(Change change) {
4. change.next();
5. if(change.wasReplaced()) {
6. tblView.getColumns().clear();
7. tblView.getColumns().addAll(column1,column2...);
8. }
9. }
10. });
这个办法需要在匿名类里面保持原始的列顺序。
可以有更简便的方法做到这一点,如下:
[java] view plaincopy
1. tableView.getColumns().addListener(new ListChangeListener() {
2. boolean isturnback = false;
3.
4. @Override
5. public void onChanged(Change c) {
6.
7. if (!isturnback) {
8. while (c.next()) {
9. if (!c.wasPermutated() && !c.wasUpdated()) {
10. true;
11. tableView.getColumns().setAll(c.getRemoved());
12. }
13. }
14. }
15. else {
16. false;
17. }
18. }
19. });
其中:
1. c.next() 用来接受当前的改变,如果没有这一句,后面的语句将报错;
2. c.wasPermutated(),判断当前改变是不是置换;
3. c.wasUpdated(),判断当前改变是不是更新;
4. 列拖曳的实现并不是被拖曳列的插入删除,而是删除全部列,再按拖曳后的顺序重新插入。c.getRemoved() 可以得到的List是拖曳前的顺序。
5. 执行setAll(..) 会触发新的Change,所以用istureback 做开关,防止死循环。
Change 类中还有的下面三个判定方法:
1. wasAdded(): 判断是否增加新的item;
2. wasRemoved(): 判断是否删除了item;
3. wasReplaced(): 判断是否有新的item替换了旧的item;
在本例中,以上三个方法返回值为true 。
按照API中的字面上的意思,reset()方法可以取消当前的改变,但测试发现此功能还没有实现。