JTree拖拽及無限級分類實現

    我一直用自己寫的一個軟件來記筆記,最開始用的是PB做的,功能有限,且到了一家公司不讓用盜版,於是用Java又做了一個,隨着筆記的分類越來越多,JList已經不能滿足顯示分類的要求了,查找起來不方便,於是想改用JTree來實現,但隨之而來的一個問題是,如何來管理分類的父類別改變,唯一的辦法是拖拽來管理。於是研究了一天,參考了幾個例子,終於實現了。

該文涉及兩個問題:

1.分類是從DB中取來的,實現無限級分類

2.實現樹的拖拽

 

DB的框架用的是IBatis,現在更名叫MyBatis了,這個東西用過之後就再也離不開了,非常方便,省卻了很多無聊機械的setter代碼,而且對於動態sql的支持非常好,文檔一天就可以看完,上手很快。

表結構:

 

temp_type(type_no int primary key , type_name varchar(200) , parent_type_no int null)

測試數據:

 

MyBatis配置文件:


1)dao.xml:

 

 

2)映射文件:booktype.xml

 

 

3)dao基類:作用是把MyBatis的session的各個方法包括一下,在具體 dao裏使用

 

 

4)具體dao:

 

 

5)業務對象:

 

呵呵,以上這些是用於取數據,看不懂也沒關係,不影響主題。

 

下面是創建一個包含JTree的類,不僅負責生成JTree,還要加上各種事件,包括右鍵菜單的生成,添加、刪除的操作,與DB的交互。

 

 

這裏面有一個方法generateTree,是個遞歸,用來生成符合類別層次定義的類別結點的。很簡單,一目瞭然,不加註釋了。

 

下面講解實現拖拽的辦法。說起拖拽,看起來很難,實現起來並不難。關鍵有兩個地方,一個是實現TransferHandler接口,它用來跟蹤拖拽的過程,比如釋放鼠標的時候,源做什麼操作,目標又做什麼操作,這是寫你的邏輯的主要接口,另外一個接口是Transferable,它負責包括一下你拖拽的對象的,注意,對象只能從這個接口包裝後獲得,別無它法。下面是實現,看之前最好學習一下《Java核心技術中》拖拽的章節,否則很難理解:

 


1)exportDone是指完成拖拽後,對拖拽源的操作,在JTree裏顯然是要刪除原位置的結點,

2)importData方法是指放開鼠標時,要如何放置這些拖拽過來的結點,且此方法先於exportDone執行。

3)createTransferable則是用前面講的Transferable的實現類,包裝一下你拖拽的數據,即結點,返回給系統;

4)canImport用來確定什麼情況下,允許拖拽;

5)getSourceActions指允許的操作,如MOVE(移動操作)

 

   JTtree刪除結點是要靠DefaultTreeModel.removeNodeFromParent,而插入則是insertNodeInto,這裏有一個最關鍵的問題是,在importData將結點插入到新位置,而在exportDone寫了刪除結點的代碼後,一運行,發現無法拖拽,實際上是拖拽成功了,但馬上又被刪除了,原因是,傳過來的拖拽結點對象實際保存的是對象的引用,而非深copy結點insertNodeInto到新位置之後,父結點對象被更新成了新位置的,這時再刪除的時候,也是從新父結點來刪除拖過來的子結點,當然就馬上把結點刪除了。這是今天花時間最多處理的問題,參考的兩個例子,其中一個是copy一份拖拽結點,重新new一個結點用來插入,而刪除時則用原始的,分開進行可以避免這個問題,另一個例子巨長,不知怎麼,沒有new卻確實生成了新對象了,避免了此問題,但時間有限,沒深研究,我深思過後,覺得最簡單的辦法就是不實現exportDone,因爲它總是先插入新結點才被執行,如果讓順序反過來,我手工先刪除舊結點,再插入新結點,問題就解決了,所以,就只實現importData了,把邏輯全寫在這一個方法裏即可。當然exportDone方法還是有它的價值的,用在源和目標不是一個對象的時候,它是必須的,JTree比較特殊。

 

調用者程序:

 

 

運行時效果如下:

 

如你所見,拖拽的時候,對應的DB中父類的改變,還沒有實現,可以自己加一下。

 

參考例子:

1.http://www.javaprogrammingforums.com/java-code-snippets-tutorials/3141-drag-drop-jtrees.html

2.http://www.coderanch.com/t/346509/GUI/java/JTree-drag-drop-inside-one

 

MyBatis3下載地址:

http://code.google.com/p/mybatis/downloads/list?can=3&q=%22mybatis-3%22+-migrations

 

想要完整源代碼的可以留言。

 

 

 

 

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