JTree添加节点和更新

时间:2014-01-15 23:04:26

标签: java swing 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个节点根,然后另一个节点到我刚创建的两个节点之一,当我再次点击root并尝试添加一个新节点 - 什么都没有。它一直到m.add()方法,但它不会添加新节点。

关于如何处理这个问题的任何想法?想到任何解决方案?

1 个答案:

答案 0 :(得分:2)

m.add( y );之后你可以使用:

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

Accordint to docs:

  

在将一些TreeNodes插入节点后调用此方法。 childIndices应该是新元素的索引,必须按升序排序。

所以火灾需要事件并帮助你。

也可以使用{安德鲁·汤普森提到的TreeSelectionListener代替MouseListener