对于具有层次关系的结构,使用树控件描述是非常方便的,如文件夹及其子文件夹之间的关系、国家的行政结构关系等。本实例将使用树控件来表示中国的各个行政区域。使用Swing库中定义的工具类可以非常容易地实现。实例运行效果如图
说明:单击三角形的小图标可以显示和隐藏树节点。
DefaultMutableTreeNode是树数据结构中的通用节点。一个树节点最多可以有一个父节点、0 或多个子节点。DefaultMutableTreeNode 为检查和修改节点的父节点和子节点提供操作,也为检查节点所属的树提供操作。节点的树是所有节点的集合,通过从某一节点开始并沿着父节点和子节点的所有可能的链接,可以访问这些节点。可以使用其含有参数的构造方法在创建节点对象时定义节点的内容,该方法的声明如下:
public DefaultMutableTreeNode(Object userObject)
参数说明
userObject:用户提供的 Object,它构成节点的数据。
提示:参数userObject的类型是Object,这意味着可以使用File等类型作为树的节点。
使用add()方法为一个节点增加子节点就可以实现层次关系,该方法的声明如下:
public void add(MutableTreeNode newChild)
参数说明
newChild:作为此节点的子节点添加的节点。
(1)编写类ChinaGeographyTree,该类继承了JFrame。在框架中包含了一棵树,在树中显示了中国的直辖市、省、自治区和特别行政区信息。
(2)编写方法do_this_windowActivated(),用来监听窗体激活事件。在该方法中,为树控件增加节点信息。核心代码如下:
package com.mingrisoft.jtree; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.UIManager; import javax.swing.JScrollPane; import javax.swing.JTree; import java.awt.Font; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class ChinaGeographyTree extends JFrame { /** * */ private static final long serialVersionUID = -6221329006071145576L; private JPanel contentPane; private JTree tree; /** * Launch the application. */ public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); } catch (Throwable e) { e.printStackTrace(); } EventQueue.invokeLater(new Runnable() { public void run() { try { ChinaGeographyTree frame = new ChinaGeographyTree(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public ChinaGeographyTree() { addWindowListener(new WindowAdapter() { @Override public void windowActivated(WindowEvent e) { do_this_windowActivated(e); } }); setTitle("\u4E2D\u56FD\u884C\u653F\u533A\u57DF\u6811"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); JScrollPane scrollPane = new JScrollPane(); contentPane.add(scrollPane, BorderLayout.CENTER); tree = new JTree(); tree.setFont(new Font("微软雅黑", Font.PLAIN, 16)); scrollPane.setViewportView(tree); } protected void do_this_windowActivated(WindowEvent e) { DefaultMutableTreeNode root = new DefaultMutableTreeNode("中国"); DefaultMutableTreeNode municipalities = new DefaultMutableTreeNode("直辖市"); municipalities.add(new DefaultMutableTreeNode("北京")); municipalities.add(new DefaultMutableTreeNode("上海")); municipalities.add(new DefaultMutableTreeNode("天津")); municipalities.add(new DefaultMutableTreeNode("重庆")); DefaultMutableTreeNode province = new DefaultMutableTreeNode("省"); province.add(new DefaultMutableTreeNode("黑龙江")); province.add(new DefaultMutableTreeNode("吉林")); province.add(new DefaultMutableTreeNode("辽宁")); province.add(new DefaultMutableTreeNode("江苏")); province.add(new DefaultMutableTreeNode("安徽")); province.add(new DefaultMutableTreeNode("四川")); province.add(new DefaultMutableTreeNode("青海")); province.add(new DefaultMutableTreeNode("山东")); province.add(new DefaultMutableTreeNode("广东")); province.add(new DefaultMutableTreeNode("河南")); province.add(new DefaultMutableTreeNode("湖南")); province.add(new DefaultMutableTreeNode("海南")); province.add(new DefaultMutableTreeNode("江西")); province.add(new DefaultMutableTreeNode("山西")); province.add(new DefaultMutableTreeNode("陕西")); province.add(new DefaultMutableTreeNode("河北")); province.add(new DefaultMutableTreeNode("湖北")); province.add(new DefaultMutableTreeNode("贵州")); province.add(new DefaultMutableTreeNode("浙江")); province.add(new DefaultMutableTreeNode("福建")); province.add(new DefaultMutableTreeNode("台湾")); province.add(new DefaultMutableTreeNode("甘肃")); province.add(new DefaultMutableTreeNode("云南")); DefaultMutableTreeNode ARegion = new DefaultMutableTreeNode("自治区"); ARegion.add(new DefaultMutableTreeNode("内蒙古自治区")); ARegion.add(new DefaultMutableTreeNode("宁夏回族自治区")); ARegion.add(new DefaultMutableTreeNode("新疆维吾尔族自治区")); ARegion.add(new DefaultMutableTreeNode("西藏自治区")); ARegion.add(new DefaultMutableTreeNode("广西壮族自治区")); DefaultMutableTreeNode SARegion = new DefaultMutableTreeNode("特别行政区"); SARegion.add(new DefaultMutableTreeNode("香港")); SARegion.add(new DefaultMutableTreeNode("澳门")); root.add(municipalities); root.add(province); root.add(ARegion); root.add(SARegion); DefaultTreeModel model = new DefaultTreeModel(root); tree.setModel(model); } }
心法领悟:树结构简介。
一棵树由若干节点组成,每个节点有两种状态:没有子节点的称为叶子节点,具有子节点的称为父节点。除了根节点外,每个节点都有唯一的父节点。一棵树只有一个根节点。由若干树组成的集合称为森林。关于树的更加详细的介绍请参考专门的数据结构教材。
我要评论