JavaFX中,TableView的列在默認情況下是可拖拽的,但是卻沒有方法去禁止這個拖拽功能。
在網上看過一段代碼,大致功能是:
1. 監聽TableView中列變化;
2. 列順序發生改變,重置爲原始順序。
tblView.getColumns().addListener(new ListChangeListener() {
@Override
public void onChanged(Change change) {
change.next();
if(change.wasReplaced()) {
tblView.getColumns().clear();
tblView.getColumns().addAll(column1,column2...);
}
}
});
這個辦法需要在匿名類裏面保持原始的列順序。
可以有更簡便的方法做到這一點,如下:
tableView.getColumns().addListener(new ListChangeListener() {
boolean isturnback = false;
@Override
public void onChanged(Change c) {
if (!isturnback) {
while (c.next()) {
if (!c.wasPermutated() && !c.wasUpdated()) {
isturnback = true;
tableView.getColumns().setAll(c.getRemoved());
}
}
}
else {
isturnback = false;
}
}
});
其中:
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()方法可以取消當前的改變,但測試發現此功能還沒有實現。
參考: