2016-02-04 72 views
1

我之前問過這個問題,但我覺得我沒有給出太多的代碼來解釋我的問題。如何在java jtree中動態地(從列表中)添加節點到我的父節點?

這就是我想做的事:

我有一個名爲User對象的列表。每個對象包含兩個字段 - usernamepassword。我創建了一個方法來構建一個JTree,像這樣的用戶名:

public class UserTreeBuilder implements TreeWillExpandListener { 
    private JTree userTree; 
    DefaultMutableTreeNode dummyParent; 

    public JTree build(List<User> list){ 
     DefaultMutableTreeNode top = new DefaultMutableTreeNode(""); 
     createNodes(top, list); 
     userTree = new JTree(top); 
     userTree.getSelectionModel().setSelectionMode 
      (TreeSelectionModel.SINGLE_TREE_SELECTION); 
     userTree.setRootVisible(false); 
     userTree.addTreeWillExpandListener(this); 

     return userTree; 
    } 

    public void createNodes(DefaultMutableTreeNode top, List<User> list) { 
     DefaultMutableTreeNode category = null; 
     DefaultMutableTreeNode user = null; 

     category = new DefaultMutableTreeNode("User"); 
     top.add(category); 


     for(User ui : list){ 
      user = new DefaultMutableTreeNode(ui.getUserName()); 
      category.add(user); 
     } 
    } 

    @Override 
    public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException { 
     DefaultMutableTreeNode node = (DefaultMutableTreeNode) userTree.getLastSelectedPathComponent(); 

     String nodeName = node.toString(); 
     System.out.println("NODE TO STRING: "+nodeName); 

     if (node == null) 
      //Nothing is selected.  
     return; 

    } 

    @Override 
    public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

它的工作好,我看到名單爲:

(folder icon) users 
    (dot icon) user1 
    (dot icon) user2 
    (dot icon) user3 
    etc. 

所以賬戶user1user2等都是最低的節點。

我有一個方法,獲取用戶名作爲參數,並返回屬於該用戶的東西的列表。它看起來像這樣:

public ArrayList<Things> fetchThings(User user){ 
    List<Things> list = new ArrayList<Things>(); 
    . 
    . 
    . 
return list; 

我的問題是 - 我怎麼能取東西對特定用戶(調用我的方法fetchThings)當有人點擊我原來JTree的給定用戶,然後顯示那些東西的子節點分配給那個用戶?

例如,有人點擊user2,這是他看到的是:

(folder icon) users 
    (folder icon) user1 
    (folder icon) user2 
     (dot icon) thing1 
     (dot icon) thing2 
     (dot icon) thing3 
     . 
     . 
     . 
    (folder icon) user3 
    etc. 

我試圖用孩子的延遲加載從https://docs.oracle.com/javase/tutorial/uiswing/components/tree.html這個頁面,但我不能使它發揮作用。你能幫我實施我嗎?

回答

5

如果你讀過JTree JavaDocs你就會知道,你可以得到的點擊來自使用類似的節點......

MouseListener ml = new MouseAdapter() { 
    public void mousePressed(MouseEvent e) { 
     int selRow = tree.getRowForLocation(e.getX(), e.getY()); 
     TreePath selPath = tree.getPathForLocation(e.getX(), e.getY()); 
     if(selRow != -1) { 
      if(e.getClickCount() == 1) { 
       mySingleClick(selRow, selPath); 
      } 
      else if(e.getClickCount() == 2) { 
       myDoubleClick(selRow, selPath); 
      } 
     } 
    } 
}; 

可以使用TreePathgetLastPathComponent它會返回一個Object,這你的情況,你可以將它轉換爲DefaultMutableTreeNode

如果您已經閱讀TreeWillExpandListenerTreeeExpansionEventTreePath JavaDoc中,你就會知道,當treeWillExpand被調用時,你可以得到節點VV HICH將使用TreeExpansionEvent#getPath#getLastPathComponent,像擴大...

@Override 
public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException { 
    DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) event.getPath().getLastPathComponent(); 
    System.out.println(treeNode); 
} 

從那裏,你可以簡單地調用,你需要以獲得您需要填充的問題DefaultMutableTreeNode信息任何功能

userDefaultMutableTreeNode將需要重寫isLeaf方法並返回false,這將允許該節點是「擴張」,有點像......

for (User ui : list) { 
    user = new DefaultMutableTreeNode(ui.getUserName()) { 
     @Override 
     public boolean isLeaf() { 
      return false; 
     } 
    }; 
    category.add(user); 
} 
+0

謝謝,T他是我得到的最明確答案之一,我非常感謝!還有一個問題 - 你能告訴我應該如何調用我的方法fetchThings(User user),以及如何根據它返回的'something'列表將父節點添加到父節點上? – randomuser1

+1

好吧,您已經知道如何將節點添加到另一個節點(您已經設置了初始樹)。再次,最好的地方是閱讀[DefaultMutableTreeNode'的JavaDocs](https://docs.oracle.com/javase/8/docs/api/javax/swing/tree/DefaultMutableTreeNode.html)。 「最好」的地方是主觀的,但我可能會從'treeWillExpand'開始 – MadProgrammer

相關問題