import java.awt.Dimension; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; public class JTreeTest extends JFrame{ /** * 描述:<描述函数的功能>。 《br》 *<p> * @param args */ public JTreeTest(){ //无参数的构造函数 JTree exam1 = new JTree(); //JTree(Object[] value) String[] str = {"A","B","C","D","E","F"}; JTree exam2 = new JTree(str); // 构造函数:JTree(TreeNode root)(TreeNode空) // 用空结点创建树 DefaultMutableTreeNode dmt = new DefaultMutableTreeNode(); JTree exam3 = new JTree(dmt); // 构造函数:JTree(TreeNode root)(同上,只是TreeNode非空) // 用一个根结点创建树 DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("Color"); JTree exam4 = new JTree(node2); // 构造函数:JTree(TreeNode root, boolean asksAllowsChildren)(同上,只是TreeNode又有不同) // 使用DefaultMutableTreeNode类先用一个根结点创建树,设置为可添加孩子结点,再添加孩子结点 DefaultMutableTreeNode color = new DefaultMutableTreeNode("Color"); DefaultMutableTreeNode red = new DefaultMutableTreeNode("red"); color.add(red); color.add(new DefaultMutableTreeNode("Gray")); red.add(new DefaultMutableTreeNode("Light")); red.add(new DefaultMutableTreeNode("yang")); JTree exam5 = new JTree(color); // 构造函数:JTree(TreeNode root)(同上,只是TreeNode非空) // 通过逐个添加结点创建树 DefaultMutableTreeNode biology = new DefaultMutableTreeNode("Biology"); DefaultMutableTreeNode animal = new DefaultMutableTreeNode("animal"); DefaultMutableTreeNode mammal = new DefaultMutableTreeNode("mammal"); DefaultMutableTreeNode horse = new DefaultMutableTreeNode("horse"); mammal.add(horse); animal.add(mammal); biology.add(animal); JTree exam6 = new JTree(biology); // 构造函数:JTree(TreeModel newModel) // 用DefaultMutableTreeNodel类定义一个结点再用这个结点做参数定义一个用DefaultTreeMode // 创建一个树的模型,再用JTree的构造函数创建一个树 DefaultMutableTreeNode biology1 = new DefaultMutableTreeNode("Biology"); DefaultMutableTreeNode animal1 = new DefaultMutableTreeNode("animal"); DefaultMutableTreeNode mammal1 = new DefaultMutableTreeNode("mammal"); DefaultMutableTreeNode horse1 = new DefaultMutableTreeNode("horse"); biology1.add(animal1); animal1.add(mammal1); mammal1.add(horse1); DefaultTreeModel model = new DefaultTreeModel(biology1); JTree exam7 = new JTree(model); JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS)); panel.setPreferredSize(new Dimension(700,400)); panel.add(new JScrollPane(exam1)); panel.add(new JScrollPane(exam2)); panel.add(new JScrollPane(exam3)); panel.add(new JScrollPane(exam4)); panel.add(new JScrollPane(exam5)); panel.add(new JScrollPane(exam6)); panel.add(new JScrollPane(exam7)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setContentPane(panel); setVisible(true); } public static void main(String[] args) { // TODO 自动生成的方法存根 new JTreeTest(); } }
一.Swing树组件
1. 简单的树:
构造函数
JTree()
JTree(TreeNode )
JTree(TreeModel newmodel);
DefaultMutableTreeNode类实现了TreeNode接口,用来创建树的节点;其中的add方法可以添加节点;
DefaultTreeModel 实现了TreeModel接口;仅提供了两个构造方法,必须直接指定树的根节点
panel.add(new JScrollPane(exam1)); 树放在JScrollPane上;
2.
二.处理节点中的事件
1. 树的选择模式通过TreeSelectionModel类的对象可以设置树的选择模式,可以通过JTree类的getSelectionModel方法获得这个对象,并且通过setSelectionModel来设置模式;
2. 选中节点和取消节点的选中状态时,将发出TreeSelectionEvent事件,通过实现TreeSelectionListener接口可以捕获该事件。
3. 当捕获TreeSelectionEvent事件时,valueChanged(TreeSelectionEvent e)将被触动,通过JTree的getSelectionPaths方法可以获得所有选中节点的路径,该方法返回一个TreePath路径的数据;通过getselectionPath可以获得索引值最小的节点路径;isSelectionEmpty() 获得查看是否存在选中节点;getSelectionCount可以获得选中节点的个数;
4. TreePath的常用方法:
getPath();
getLastPath();
getParentPath();
pathByAddingChild();
getPathCount();
getPathComponent(int elemnt);
三.遍历树的节
DefaultMutableTreeNode 提供了两组相对的遍历方式,第一组:前序和后续遍历:preorderEnumeration()遍历和postorderEnumeration来获得遍历的枚举对象;
第二组:广度和深度优先遍历:广度:breathFirstEnumeration(); depthFirstEnumeration() 遍历;DefaultMutableTreeNode其他的常用方法:
getLevel(); getDepth(); getParent(); getChildCount(); getFirstChild(); getSiblingCount(); getNextSibling(); getPreviousSibling(); getPath() isRoof() isLeaf();
Enumeration enu = color.preorderEnumeration();
while(enu.hasMoreElements()){
DefaultMutableTreeNode dm = (DefaultMutableTreeNode)enu.nextElement();
System.out.println(dm.getUserObject());
}
四.定制树:
1. 树的根节点是否显示:setRootVisible();
2. 树根节点前的手柄是否显示:setShowsRootHandles();
3. 节点图标设置:DefaultTreeCellRenderer可以改变节点图标,通过JTree类的getCellRenderer()方法获得该对象;
setLeafIcon()
setCloseIcon();
setOpenIcon() 处于打开状态时采用的图标;
4. 树节点之间连线的设置:
PutClientProperty();
5. 展开节点:
Tree.expandPath()
五.维护树模型:
1. 添加树节点:DefaultTreeModel方法的InsertNodeInto()方法;也可以直接用节点方法
2. 修改树节点:DefaultTreeModel的 nodeChanged方法;
3. 删除树节点:DefaultTreeModel的removeNodeFromParent()方法;
but1.addActionListener(new ActionListener(){
@Override
publicvoid actionPerformed(ActionEvent arg0) {
// TODO自动生成的方法存根
DefaultMutableTreeNode node = new DefaultMutableTreeNode(text1.getText());
TreePath path = exam5.getSelectionPath();
DefaultMutableTreeNode par = (DefaultMutableTreeNode)path.getLastPathComponent();
par.insert(node, par.getChildCount());
}
});
修改节点实现:node.setUserObject(text.getText());
treeModel.nodeChanged();
六.处理展开节点事件
1. 展开和折叠节点时,将发出TreeExpansionEvent事件;将要被展开或折叠和已经展开和折叠的事件
exam5.addTreeWillExpandListener(new TreeWillExpandListener(){
@Override
publicvoid treeWillCollapse(TreeExpansionEvent event)
throws ExpandVetoException {
// TODO自动生成的方法存根
}
@Override
publicvoid treeWillExpand(TreeExpansionEvent event)
throws ExpandVetoException {
// TODO自动生成的方法存根
}
});
exam5.addTreeExpansionListener(new TreeExpansionListener(){
@Override
publicvoid treeCollapsed(TreeExpansionEvent arg0) {
// TODO自动生成的方法存根
}
@Override
publicvoid treeExpanded(TreeExpansionEvent arg0) {
// TODO自动生成的方法存根
}
});
JTree
最新推荐文章于 2024-03-30 20:13:01 发布