要求:增加节点后原来展开的节点还是展开(model.reload()增加了就会全缩起来)
刷新不要太明显(先通过model.reload(),再找到新node,然后new TreePath(),再tree.expandPath(path)很慢,刷新很明显,而且展开后tree显示经常有问题,node会偏位)用model.reload(root),一样同model.reload()
用model.nodeChanged(node)不增加
用updateUI老是有java.lang.NullPointerException错误(功能倒实现了)
......
刷新不要太明显(先通过model.reload(),再找到新node,然后new TreePath(),再tree.expandPath(path)很慢,刷新很明显,而且展开后tree显示经常有问题,node会偏位)用model.reload(root),一样同model.reload()
用model.nodeChanged(node)不增加
用updateUI老是有java.lang.NullPointerException错误(功能倒实现了)
......
增: ( ( DefaultMutableTreeNode )tree.getModel().getRoot() ).add( node ); //?
model.insertNodeInto(MutableTreeNode newChild, MutableTreeNode parent, int index) //?
删: ( ( DefaultMutableTreeNode )tree.getModel().getRoot() ).remove( node ); //?
model.remove( node ) //?然后如何让新节点显示?model.reload()?tree.repaint()?tree.updateUI()?
JTree上的每一个节点就代表一个TreeNode对象,TreeNode本身是一个Interface,里面定义了7个有关节点的方法,例如判断是否
为树叶节点、有几个子节点(getChildCount())、父节点为何(getparent())等等、这些方法的定义你可以在javax.swing.tree的
package中找到,读者可自行查阅java api文件。在实际的应用上,一般我们不会直接实作此界面,而是采用java所提供的
DefaultMutableTreeMode类,此类是实作MutableTreeNode界面而来,并提供了其他许多实用的方法。MutableTreeNode本身也是一
个Interface,且继承了TreeNode界面此类主要是定义一些节点的处理方式,例如新增节点(insert())、删除节点(remove())、设置
节点(setUserObject())等。整个关系如下图:
TreeNode----extends--->MutableTreeNode---implements---DefaultMutableTreeNode 接下来我们来看如何利DefaultMutableTreeNode来建立JTree,我们先来看DefaultMutableTreeNode的构造函数:DefaultMutableTreeNode构造函数:
DefaultMutableTreeNode():建立空的DefaultMutableTreeNode对象。
DefaultMutableTreeNode(Object userObject):建立DefaultMutableTreeNode对象,节点为userObject对象。
DefaultMutableTreeNode(Object userObject,Boolean allowsChildren):建立DefaultMutableTreeNode对象,节点为userObject对
象并决定此节点是否允许具有子节点。
以下为利用DefaultMutableTreeNode建立JTree的范例:TreeDemo2.java
此程序"资源管理器"为此棵树的根节点.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
public class TreeDemo2{
public TreeDemo2(){
JFrame f=new JFrame("TreeDemo2");
Container contentPane=f.getContentPane();
DefaultMutableTreeNode root=new DefaultMutableTreeNode("资源管理器");
DefaultMutableTreeNode node1=new DefaultMutableTreeNode("我的公文包");
DefaultMutableTreeNode node2=new DefaultMutableTreeNode("我的电脑");
DefaultMutableTreeNode node3=new DefaultMutableTreeNode("收藏夹");
DefaultMutableTreeNode node4=new DefaultMutableTreeNode("Readme");
root.add(node1);
root.add(node2);
root.add(node3);
root.add(node4);
DefaultMutableTreeNode leafnode=new DefaultMutableTreeNode("公司文件");
node1.add(leafnode);
leafnode=new DefaultMutableTreeNode("私人文件");
node1.add(leafnode);
leafnode=new DefaultMutableTreeNode("个人信件");
leafnode=new DefaultMutableTreeNode("本机磁盘(C:)");
node2.add(leafnode);
leafnode=new DefaultMutableTreeNode("本机磁盘(D:)");
node2.add(leafnode);
leafnode=new DefaultMutableTreeNode("本机磁盘(E:)");
node2.add(leafnode);
DefaultMutableTreeNode node31=new DefaultMutableTreeNode("网站列表");
node3.add(node31);
leafnode=new DefaultMutableTreeNode("奇摩站");
node31.add(leafnode);
leafnode=new DefaultMutableTreeNode("职棒消息");
node31.add(leafnode);
leafnode=new DefaultMutableTreeNode("网络书店");
node31.add(leafnode);
JTree tree=new JTree(root);
JScrollPane scrollPane=new JScrollPane();
scrollPane.setViewportView(tree);
contentPane.add(scrollPane);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public static void main(String[] args){
new TreeDemo2();
}
}
我要JTree每个节点前后都有图标,所以自己写了IconRenderer implements TreeCellRenderer;要整个树节点排序,tree是用model建的,并override了insertNodeInto()方法。然后就碰到很多问题难以解决了,上面都多少提到了一些:
因为使用model.insertNodeInto(node, parent,num),好像用tree.repaint()没用了,只有model.reload()好用,(tree.updateUI()也行,但是有时会nullPointer错误),model.reload()有个问题,就是会把expand节点collapse掉,所以我建了一个hashMap去存已展开节点,等model.reload()后,去通过for循环tree.expandPath(( new TreePath(tree.getModel().getRoot()).pathByAddingChild(hashMap.get(i)))重新展开节点,但是会有节点偏位!
有没有java gui guru告诉我为什么啊?
(P.S. Tree只建了3层,root setVisible(false)了,只有node和leaf)
我在sun的swing论坛里也找了,很多人也是这个问题,虽然提供了很多方法,我也试了,但还是不理想,都有小问题
以下是DefaultTreeModel的 insertNodeInto()方法,里面的 nodesWereInserted()就是激发事件的语句。 public void insertNodeInto(MutableTreeNode newChild,
MutableTreeNode parent, int index){
parent.insert(newChild, index); int[] newIndexs = new int[1]; newIndexs[0] = index;
nodesWereInserted(parent, newIndexs); /*************/
}
不行,我override jTree,node,其他都用的default...,更新model,不刷新树。