2014-01-15 220 views
0

所以我有這個非常有趣的問題: 問題的目標是有一個JTree,一個文本字段和一個添加按鈕;當單擊節點並且文本字段中有文本時,按下添加按鈕時,將創建一個節點作爲單擊節點的子節點。JTree添加節點並更新

我實例一棵樹,像往常一樣:

tree = new JTree(treeModel); 
    tree.setEditable(true); 
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 
    tree.setShowsRootHandles(true); 

然後,我設置了聽衆:

tree.addMouseListener(new MouseAdapter() 
    { 
     @Override 
     public void mouseClicked(MouseEvent e) 
     { 
      doMouseClicked(e); 
     } 
    }); 

    jButton.addActionListener(new ActionListener() 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      if(nodeIsClicked && (!jTextField.getText().isEmpty())) 
      { 
       DefaultMutableTreeNode y = new DefaultMutableTreeNode(jTextField.getText()); 
       m.add(y); 
      } 
     } 
    }); 
} 

void doMouseClicked(MouseEvent me) { 
    tp = tree.getPathForLocation(me.getX(), me.getY()); 
    if (tp != null) 
    { 
     m = (DefaultMutableTreeNode) tp.getLastPathComponent(); 
     nodeIsClicked = true; 
    } 
    else 
    { 
     nodeIsClicked = false; 
    } 
} 

奇怪的是,除了事實,我不能完全設定按照我想要的方式更新更新(基本上將樹擴展到剛剛創建的節點),例如,之後向節點添加2個節點,然後將另一個節點添加到剛剛創建的兩個節點之一,點擊再次嘗試添加一個新節點 - 什麼也不做。它一直到m.add()方法,但它只是不添加新節點。

關於如何處理這個問題的任何想法?任何想到的解決方案?

+2

爲了更快提供更好的幫助,請發佈[MCVE](http://stackoverflow.com/help/mcve)。另外,爲什麼此代碼使用'MouseListener'而不是['TreeSelectionListener'](http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TreeSelectionListener.html )? –

回答

1

m.add(y);後,您可以使用:

((DefaultTreeModel) tree.getModel()).nodesWereInserted(m,new int[]{m.getChildCount()-1}); 

Accordint到文檔:

調用此方法您插入一些樹節點到節點之後。 childIndices應該是新元素的索引,並且必須按升序排序。

因此,火災需要事件和幫助你。

還使用TreeSelectionListener而不是如@AndrewThompson所述的MouseListener

+0

是的,我很困惑如何實現!非常感謝!我還使用了TreeSelectionListener,並且除了樹擴展部分之外,它工作得很好,哈哈。謝謝! – borg123