下面就来看一下怎样具体实现吧,关于拖拽部分已经在http://blog.csdn.net/luoshenfu001/article/details/10893673上面有完整的实现了,在此就不再累述,本文只关注树节点的增,删和重命名的实现,下面使用将整个JTree放入JScrollPanel中,然后JScrollPanle又在一个大的JPanel中。
简单的说,实现增加和删除并不太难,可以使用DefaultTreeModel的两个基本方法:treeModel.insertNodeInto(childNode, parent, parent.getChildCount()); 和treeModel.removeNodeFromParent(currentNode); 就可以了,在注意添加的时候确保UserObject (就是放在TreeNode里面的对象)为真正的用户数据对象就可以了。
对于重命名节点的实现可谓费了很多周折,实现Oralce官方文档中‘How to use a tree’中的方法,给TreeModel添加treeModel监听器来监听TreeNode值的改变,但是在里面得到的UserObject的类型竟然变为了String,丧失了原来的自定义对象类型,非常奇怪!后来终于在StackoverFlow中找到了解决方案,那就是实现自定义的TreeModel,并修改的valueForPathChanged方法的实现,就大功告成了。
http://stackoverflow.com/questions/11554583/jtree-node-rename-preserve-user-object
看来还是外国人给力啊。
另外,还值得一提的是,不论是通过双击重命名还是右键重命名都可以使用下面这一小段来实现重命名的效果!岂不是很赞?
if (evt.getClickCount() == 2) {
TreePath path = tree.getSelectionPath();
tree.startEditingAtPath(path);
}
本文代码中依赖的几个其他类都在上面的链接中有,想要的可以去上一篇中寻找。
package test;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import org.apache.log4j.Logger;
public class TreePanel extends JPanel {
private final Logger logger = Logger.getLogger(TreePanel.class);
private static final long serialVersionUID = 1975901083214104961L;
private JTree tree;
private InnerDocsMgt mainPanel;
private List
dirsList = new ArrayList();
private DefaultTreeModel treeModel;
private DefaultMutableTreeNode rootNode;
private Toolkit toolkit = Toolkit.getDefaultToolkit();
public TreePanel(InnerDocsMgt mainPanel) {
super();
this.mainPanel = mainPanel;
init();
}
public void init() {
GridBagLayout gbl_panel = new GridBagLayout();
gbl_panel.columnWidths = new int[] { 54, 0, 0, 0, 0, 0, 0, 0 };
gbl_panel.rowHeights = new int[] { 31, 0, 0 };
gbl_panel.columnWeights = new double[] { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, Double.MIN_VALUE };
gbl_panel.rowWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE };
this.setLayout(gbl_panel);
JLabel lblNewLabel = new JLabel(
"\u5185\u90E8\u8D44\u6599\u76EE\u5F55\u5217\u8868");
GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
gbc_lblNewLabel.gridwidth = 5;
gbc_lblNewL