JavaFX:禁止TableView的列拖拽功能

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()方法可以取消當前的改變,但測試發現此功能還沒有實現。


參考:

代碼示例


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章