2014-09-27 65 views
0

我實現了TreeModel以適應現有的可視化數據模型作爲JTree。我遇到了具有多個相同子節點(葉)的節點的問題。例如,考慮具有作爲字符串的葉節點的JTree。每當父節點包含具有相同字符串值的子項時,就會出現問題。這些葉節點的TreePath是相同的,而作爲Strings,equals()返回true。該文檔明確地呼籲:對具有相同子項的JTree節點的支持

JTree及其相關的類大量使用TreePaths爲 確定TreeModel中的節點。如果一個TreeModel返回相同的 對象,相比之下等於,在相同的 父輩下的兩個不同索引處的結果TreePath對象相當於 。某些實現可能會假設如果兩個TreePath相等,則它們將標識相同的節點。如果不符合此條件,則可能會導致繪畫問題和其他異常情況。換句話說,如果給定父項的getChild 返回相同的對象(由等於確定) 可能會導致問題,建議您避免這樣做。

有沒有辦法解決這個問題?到目前爲止我唯一想到的(理論上 - 我沒有實現並驗證它會工作)是將一個String包裝到另一個類中,重寫toString()以返回包裝的字符串,並利用默認的equals()方法,它測試實際的包裝器對象必須是相同的(相同的實例)才能返回true。這似乎是一個可怕的黑客。任何人?

編輯:我結束了使用提出的方法。我需要支持同一個字符串的多個實例作爲我的應用程序的同一父級的子代,並且沒有找到其他解決方法。它的工作原理,但...

+2

爲更好地幫助在局部變量越早張貼SSCCE/MCVE用硬編碼值DefaultTreeModel的,那麼它應該是一個很好的問題 – mKorbel 2014-09-27 06:24:25

+1

*「我已經打了一個問題,即有多個相同的子(葉)節點的節點。例如,請考慮一個帶有葉節點的JTree,它們是字符串。「*爲什麼它們包含多個相同的字符串?這不會讓用戶感到困惑嗎? *「這三個'可愛的小貓圖片中的哪一個我喜歡?」* – 2014-09-27 06:24:34

+0

@Andrew Thompson這可能是我濫用JTree的原因 - 我願意接受其他選擇。考慮像播放列表編輯器(這不是什麼,但是關閉)。將同一曲目不止一次添加到播放列表是合理的,甚至是理想的。使用樹可以一次擴展多個「播放列表」,以查看在其他「播放列表」中使用哪些「曲目」。 – ags 2014-09-27 15:04:22

回答

1

我的建議是創建一個TreeNode的子類,並重寫equals方法。 (在TreeNode中保存你的字符串)。我想用這個你可以使用java的DefaultTreeModel。

相關問題