【问题标题】:How can I add dynamically (from a list) nodes to my parent nodes in java jtree?java - 如何在java jtree中动态(从列表)添加节点到我的父节点?
【发布时间】:2016-02-05 05:43:55
【问题描述】:

我之前问过这个问题,但我觉得我没有提供太多代码来解释我的问题。

这就是我想做的:

我有一个名为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 的子项延迟加载,但我无法使其工作。你能帮我实现吗?

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    如果您阅读过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 的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);
    }
    

    【讨论】:

    • 谢谢,这是我在这里得到的最清晰的答案之一,非常感谢!还有一个问题 - 你能告诉我究竟应该如何 - 或在哪里 - 我应该调用我的方法 fetchThings(User user) 以及如何根据它返回的 things 列表将子节点添加到父节点?
    • 好吧,您似乎已经知道如何将节点添加到另一个节点(您这样做是为了设置初始树)。同样,最好的起点是阅读JavaDocs for DefaultMutableTreeNode。 “最好”的地方是主观的,但我可能会从treeWillExpand开始
    猜你喜欢
    • 2017-05-05
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2012-09-01
    • 2012-10-04
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多