繁体   English   中英

如何在Java jtree中动态(从列表中)将节点添加到父节点?

[英]How can I add dynamically (from a list) nodes to my parent nodes in 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;

我的问题是-当某人单击原始jtree上的给定用户,然后将这些东西显示为分配给该用户的子节点时,如何为特定用户获取东西(调用我的方法fetchThings)?

例如,某人单击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使用延迟加载子项,但无法使其正常工作。 您能帮我实施吗?

如果您已经阅读了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转换为DefaultMutableTreeNode

如果您已经阅读了TreeWillExpandListenerTreeeExpansionEventTreePath的JavaDocs,就会知道调用treeWillExpand时,可以通过使用TreeExpansionEvent#getPath#getLastPathComponent获得将要扩展的节点,类似...

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

从那里,您可以简单地调用所需的任何功能,以获取填充有问题的DefaultMutableTreeNode所需的信息。

您的user DefaultMutableTreeNode将需要覆盖isLeaf方法并返回false ,这将使该节点可以“扩展”,例如...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM