所以我有这个非常有趣的问题:
该问题的目标是拥有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()
方法,但它不会添加新节点。
关于如何处理这个问题的任何想法?想到任何解决方案?
答案 0 :(得分:2)
m.add( y );
之后你可以使用:
((DefaultTreeModel) tree.getModel()).nodesWereInserted(m,new int[]{m.getChildCount()-1});
Accordint to docs:
在将一些TreeNodes插入节点后调用此方法。 childIndices应该是新元素的索引,必须按升序排序。
所以火灾需要事件并帮助你。
也可以使用{安德鲁·汤普森提到的TreeSelectionListener
代替MouseListener
。