2016-02-04 39 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