public TreeDemo5() { // try { // AlloyLookAndFeel.setProperty("alloy.isLookAndFeelFrameDecoration", "true"); // AlloyTheme theme = new BedouinTheme();//设置界面的外观,手册中共有5种样式 // LookAndFeel alloyLnF = new AlloyLookAndFeel(theme); // UIManager.setLookAndFeel(alloyLnF); // } catch (UnsupportedLookAndFeelException ex) { // You may handle the exception here // } // this line needs to be implemented in order to make JWS work properly UIManager.getLookAndFeelDefaults().put("ClassLoader", getClass().getClassLoader()); JFrame f = new JFrame("TreeDemo"); 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("私人文件"); node1.add(leafnode);
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); tree.setEditable(true);//设置JTree为可编辑的 tree.addMouseListener(new MouseHandle());//使Tree加入检测Mouse事件,以便取得节点名称 //下面两行取得DefaultTreeModel,并检测是否有TreeModelEvent事件. DefaultTreeModel treeModel = (DefaultTreeModel)tree.getModel(); treeModel.addTreeModelListener(this);
JScrollPane scrollPane = new JScrollPane(); scrollPane.setViewportView(tree);
label = new JLabel("更改数据为: "); contentPane.add(scrollPane,BorderLayout.CENTER); contentPane.add(label,BorderLayout.SOUTH); f.pack(); f.setVisible(true);
汗!原来你要SWT的,我用SWing给做了,功能完全实现了,觉得好的话就给分吧 /** @version 1.02 2008-01-06 @author tanlingyun */import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.tree.*;/** This program demonstrates tree editing. */ public class TreeEditTest { public static void main(String[] args) { JFrame frame = new TreeEditFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }/** A frame with a tree and buttons to edit the tree. */ class TreeEditFrame extends JFrame implements MouseListener { public TreeEditFrame() { setTitle("TreeEditTest"); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); // construct tree TreeNode root = makeSampleTree(); model = new DefaultTreeModel(root); tree = new JTree(model); tree.setEditable(true); tree.addMouseListener(this); // add scroll pane with tree JScrollPane scrollPane = new JScrollPane(tree); add(scrollPane, BorderLayout.CENTER); makeButtons(); pop = new JPopupMenu(); JMenuItem addChild,deleteNode; addChild = new JMenuItem("添加");
addChild.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (selectedNode == null) return; DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New"); model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount()); // now display new node
pop.add(addChild); pop.add(deleteNode); } public TreeNode makeSampleTree() { DefaultMutableTreeNode root = new DefaultMutableTreeNode("World"); DefaultMutableTreeNode country = new DefaultMutableTreeNode("USA"); root.add(country); DefaultMutableTreeNode state = new DefaultMutableTreeNode("California"); country.add(state); DefaultMutableTreeNode city = new DefaultMutableTreeNode("San Jose"); state.add(city); city = new DefaultMutableTreeNode("San Diego"); state.add(city); state = new DefaultMutableTreeNode("Michigan"); country.add(state); city = new DefaultMutableTreeNode("Ann Arbor"); state.add(city); country = new DefaultMutableTreeNode("Germany"); root.add(country); state = new DefaultMutableTreeNode("Schleswig-Holstein"); country.add(state); city = new DefaultMutableTreeNode("Kiel"); state.add(city); return root; } /** Makes the buttons to add a sibling, add a child, and delete a node. */ public void makeButtons() { JPanel panel = new JPanel(); JButton addSiblingButton = new JButton("Add Sibling"); addSiblingButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (selectedNode == null) return; DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent(); if (parent == null) return; DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New"); int selectedIndex = parent.getIndex(selectedNode); model.insertNodeInto(newNode, parent, selectedIndex + 1);
// now display new node
TreeNode[] nodes = model.getPathToRoot(newNode); TreePath path = new TreePath(nodes); tree.scrollPathToVisible(path); } }); panel.add(addSiblingButton); JButton addChildButton = new JButton("Add Child"); addChildButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (selectedNode == null) return; DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New"); model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount()); // now display new node
你杂不叫氧化钙0428
package rjc;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
//import com.incors.plaf.alloy.*;
//import com.incors.plaf.alloy.themes.bedouin.*;public class TreeDemo5 implements TreeModelListener
{
JLabel label = null;
String nodeName = null; //原有节点名称
public TreeDemo5()
{
// try {
// AlloyLookAndFeel.setProperty("alloy.isLookAndFeelFrameDecoration", "true");
// AlloyTheme theme = new BedouinTheme();//设置界面的外观,手册中共有5种样式
// LookAndFeel alloyLnF = new AlloyLookAndFeel(theme);
// UIManager.setLookAndFeel(alloyLnF);
// } catch (UnsupportedLookAndFeelException ex) {
// You may handle the exception here
// }
// this line needs to be implemented in order to make JWS work properly
UIManager.getLookAndFeelDefaults().put("ClassLoader", getClass().getClassLoader());
JFrame f = new JFrame("TreeDemo");
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("私人文件");
node1.add(leafnode);
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);
tree.setEditable(true);//设置JTree为可编辑的
tree.addMouseListener(new MouseHandle());//使Tree加入检测Mouse事件,以便取得节点名称
//下面两行取得DefaultTreeModel,并检测是否有TreeModelEvent事件.
DefaultTreeModel treeModel = (DefaultTreeModel)tree.getModel();
treeModel.addTreeModelListener(this);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewportView(tree);
label = new JLabel("更改数据为: ");
contentPane.add(scrollPane,BorderLayout.CENTER);
contentPane.add(label,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}); }
/*本方法实作TreeModelListener接口,本接口共定义四个方法,分别是TreeNodesChanged()
*treeNodesInserted()、treeNodesRemoved()、treeNodesRemoved()、
*treeStructureChanged().在此范例中我们只针对更改节点值的部份,因此只实作
*treeNodesChanged()方法.
*/
public void treeNodesChanged(TreeModelEvent e) {
TreePath treePath = e.getTreePath();
System.out.println(treePath);
//下面这行由TreeModelEvent取得的DefaultMutableTreeNode为节点的父节点,而不是用户点选
//的节点,这点读者要特别注意。要取得真正的节点需要再加写下面6行代码.
DefaultMutableTreeNode node = (DefaultMutableTreeNode)treePath.getLastPathComponent();
try {
//getChildIndices()方法会返回目前修改节点的索引值。由于我们只修改一个节点,因此节点索引值就放在index[0]
//的位置,若点选的节点为root node,则getChildIndices()的返回值为null,程序下面的第二行就在处理点选root
//node产生的NullPointerException问题.
int[] index = e.getChildIndices();
//由DefaultMutableTreeNode类的getChildAt()方法取得修改的节点对象.
node = (DefaultMutableTreeNode)node.getChildAt(index[0]);
} catch (NullPointerException exc) {}
//由DefaultMutableTreeNode类getUserObject()方法取得节点的内容,或是写成node.toString()亦相同.
label.setText(nodeName+"更改数据为: "+(String)node.getUserObject());
}
public void treeNodesInserted(TreeModelEvent e) {
}
public void treeNodesRemoved(TreeModelEvent e) {
}
public void treeStructureChanged(TreeModelEvent e) {
} public static void main(String args[]) {
new TreeDemo5();
}
//处理Mouse点选事件
class MouseHandle extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{
try{
JTree tree = (JTree)e.getSource();
//JTree的getRowForLocation()方法会返回节点的列索引值。例如本例中,“本机磁盘(D:)”的列索引值为4,此索引值
//会随着其他数据夹的打开或收起而变支,但“资源管理器”的列索引值恒为0.
int rowLocation = tree.getRowForLocation(e.getX(), e.getY()); /*JTree的getPathForRow()方法会取得从root node到点选节点的一条path,此path为一条直线,如程序运行的图示
*若你点选“本机磁盘(E:)”,则Tree Path为"资源管理器"-->"我的电脑"-->"本机磁盘(E:)",因此利用TreePath
*的getLastPathComponent()方法就可以取得所点选的节点.
*/ TreePath treepath = tree.getPathForRow(rowLocation);
TreeNode treenode = (TreeNode) treepath.getLastPathComponent();
nodeName = treenode.toString();
}catch(NullPointerException ne){}
}
}
}
/**
@version 1.02 2008-01-06
@author tanlingyun
*/import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;/**
This program demonstrates tree editing.
*/
public class TreeEditTest
{
public static void main(String[] args)
{
JFrame frame = new TreeEditFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}/**
A frame with a tree and buttons to edit the tree.
*/
class TreeEditFrame extends JFrame implements MouseListener
{
public TreeEditFrame()
{
setTitle("TreeEditTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); // construct tree TreeNode root = makeSampleTree();
model = new DefaultTreeModel(root);
tree = new JTree(model);
tree.setEditable(true);
tree.addMouseListener(this); // add scroll pane with tree JScrollPane scrollPane = new JScrollPane(tree);
add(scrollPane, BorderLayout.CENTER); makeButtons();
pop = new JPopupMenu();
JMenuItem addChild,deleteNode;
addChild = new JMenuItem("添加");
addChild.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)
tree.getLastSelectedPathComponent(); if (selectedNode == null) return; DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New");
model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount()); // now display new node
TreeNode[] nodes = model.getPathToRoot(newNode);
TreePath path = new TreePath(nodes);
tree.scrollPathToVisible(path);
}
});
deleteNode = new JMenuItem("删除");
deleteNode.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
DefaultMutableTreeNode selectedNode
= (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (selectedNode != null && selectedNode.getParent() != null)
model.removeNodeFromParent(selectedNode);
}
});
pop.add(addChild);
pop.add(deleteNode);
} public TreeNode makeSampleTree()
{
DefaultMutableTreeNode root = new DefaultMutableTreeNode("World");
DefaultMutableTreeNode country = new DefaultMutableTreeNode("USA");
root.add(country);
DefaultMutableTreeNode state = new DefaultMutableTreeNode("California");
country.add(state);
DefaultMutableTreeNode city = new DefaultMutableTreeNode("San Jose");
state.add(city);
city = new DefaultMutableTreeNode("San Diego");
state.add(city);
state = new DefaultMutableTreeNode("Michigan");
country.add(state);
city = new DefaultMutableTreeNode("Ann Arbor");
state.add(city);
country = new DefaultMutableTreeNode("Germany");
root.add(country);
state = new DefaultMutableTreeNode("Schleswig-Holstein");
country.add(state);
city = new DefaultMutableTreeNode("Kiel");
state.add(city);
return root;
} /**
Makes the buttons to add a sibling, add a child, and
delete a node.
*/
public void makeButtons()
{
JPanel panel = new JPanel();
JButton addSiblingButton = new JButton("Add Sibling");
addSiblingButton.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
DefaultMutableTreeNode selectedNode
= (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (selectedNode == null) return; DefaultMutableTreeNode parent
= (DefaultMutableTreeNode) selectedNode.getParent(); if (parent == null) return; DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New"); int selectedIndex = parent.getIndex(selectedNode);
model.insertNodeInto(newNode, parent, selectedIndex + 1);
// now display new node
TreeNode[] nodes = model.getPathToRoot(newNode);
TreePath path = new TreePath(nodes);
tree.scrollPathToVisible(path);
}
});
panel.add(addSiblingButton); JButton addChildButton = new JButton("Add Child");
addChildButton.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)
tree.getLastSelectedPathComponent(); if (selectedNode == null) return; DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New");
model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount()); // now display new node
TreeNode[] nodes = model.getPathToRoot(newNode);
TreePath path = new TreePath(nodes);
tree.scrollPathToVisible(path);
}
});
panel.add(addChildButton); JButton deleteButton = new JButton("Delete");
deleteButton.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
DefaultMutableTreeNode selectedNode
= (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (selectedNode != null && selectedNode.getParent() != null)
model.removeNodeFromParent(selectedNode);
}
});
panel.add(deleteButton);
add(panel, BorderLayout.SOUTH);
}
public void mouseClicked(MouseEvent e) {
} public void mouseEntered(MouseEvent e) {
} public void mouseExited(MouseEvent e) {
} public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
pop.show(this, e.getX(), e.getY()+20);
}
} public void mouseReleased(MouseEvent e) {
}
private JPopupMenu pop;
private DefaultTreeModel model;
private JTree tree;
private static final int DEFAULT_WIDTH = 400;
private static final int DEFAULT_HEIGHT = 200;
}本文部分参考了《Java核心技术》卷2和mq612(五斗米)的blog,特此声明