2008-09-30 38 views
4

我正在寫一個Java樹,其中的樹節點可能需要很長時間才能計算的子節點(在這種情況下,它是一個文件系統,可能存在網絡超時,導致無法從附加驅動器獲取文件列表)。Java TreeNode:如何防止getChildCount執行昂貴的操作?

我發現這個問題是這樣的:

  1. getChildCount()前應用戶的要求開樹的特定分支被調用。我相信這樣做是爲了讓JTree知道是否在節點旁邊顯示+圖標。

  2. getChildCount()孩子的準確計數可能需要詢問的枚舉之前進行潛在的昂貴的操作

  3. 如果我僞造的getChildCount()值,樹只爲多子節點分配空間兒童。 (如果我回到「1」,我只看到1名兒童上市,儘管有更多)

孩子的枚舉可能是昂貴和費時的,我處之泰然。但我不知道getChildCount()需要知道確切的孩子數量。

任何方式我可以解決這個問題?

加:另一個問題是,如果其中一個節點代表軟盤驅動器(如何陳舊!),驅動器將在用戶請求其文件之前進行輪詢;如果驅動器中沒有磁盤,則會導致系統錯誤。

更新:不幸的是,實現TreeWillExpand偵聽器不是解決方案。這可以允許您否決擴展,但顯示的節點數量仍受限於TreeNode.getChildCount()返回的值。

回答

0

有幾個部分的解決方案:

  • 就像洛倫佐Boccaccia說,使用TreeWillExpandListener

  • ,需要調用nodesWereInserted樹上,所以正確的節點數量將被顯示。 See this code

  • 我已經決定,如果你不知道孩子計數,TreeNode.getChildCount()需要返回至少1(它不能返回0)

0

我不確定它是否完全適用,但我最近通過預先計算通常需要通過兒童列表的方法的答案來解決慢樹問題。我只在孩子被添加,刪除或更新時重新計算它們。在我的情況下,一些方法將不得不遞歸樹下找出每個節點的「存儲多少字節」之類的東西。

0

如果您需要大量訪問計算成本昂貴的數據結構的特定功能,則可能需要對其進行預計算。

對於TreeNodes,這意味着你的TreeNodes將不得不存儲他們的子數。詳細解釋一下:當你創建一個節點n0這個節點有一個子節點(cc)爲0.當你添加一個節點n1作爲這個節點的子節點時,你的節點爲n1.cc + cc++

棘手的一點是刪除操作。你必須保持對父母的反向鏈接並沿着層次結構去減去當前節點的cc

如果您只想爲節點設置hasChildren功能或覆蓋getChildCount,則布爾值可能就足夠了,並且不會強制您在刪除的情況下升級整個層次結構。或者你可以刪除反向鏈接,只是說你在刪除操作上失去了精確性。TreeNode界面實際上並不強制你提供一個刪除操作,但你可能想要一個。

那麼,這是交易。爲了提供預先計算的精確值,您將不得不保留某些類型的反向鏈接。如果你不這樣做,你最好打電話給你的方法hasHadChildren或更有趣的isVirgin

相關問題