2010-09-21 46 views
4

我有一個擴展了DefaultTreeModel的自定義模型的JTree。我需要能夠將節點從一個分支移動到另一個分支,而不會丟失選擇。
目前,我正在做它在我的模型是這樣的:如何在JTree中移動節點?

private void moveNode(MutableTreeNode node, MutableTreeNode newParent) { 
    super.removeNodeFromParent(node); 
    super.insertNodeInto(node, newParent, 0); 
} 

由於我使用的方法DefaultTreeModel的,節點到達正確的地方,樹視圖被更新,但它也失去了節點上的選擇。這是有道理的,因爲它(暫時)被刪除,但這不是我想要的行爲。

這樣移動節點的正確方法是什麼?移動後的選擇應與移動之前的移動相同,無論移動後是否涉及重新選擇節點。

回答

4

你有兩個選項,第一個是要選擇與滾動的JTree自己的子類去大致是這樣的:

public class MyTree extends JTree { 
    public MyTree() { 
     final MyTreeModel m = new MyTreeModel() 
     super.setTreeModel(m); 
     super.setSelectionModel(m.getSelectionModel()); 
    } 

    /** 
    * your tree model implementation which fiddles 
    * with sm when "move" is called 
    */  
    private class MyTreeModel implements TreeModel() { 
     private final DefaultTreeSelectionModel sm; 

     public MyTreeModel() { 
      this.sm = new DefaultTreeSelectionModel(); 
     } 

     public TreeSelectionModel getSelectionModel() { return this.sm; } 
    } 

} 

這樣在需要的時候,你總是有手邊的選擇模型,你可以在您的move方法中修改它。

另一方面,類似的功能已經存在於拖放支持中,並且支持DnD的樣板具有相當大但可管理的性能(另外,您可以在樹中獲得DnD支持)。問題是我不知道如何以編程方式觸發DnD事件。

+1

-1用於重新混合問題 – kleopatra 2012-02-16 13:06:17