第一节 | 第二节 | 第三节 | 第四节 | 第五节 | 第六节 | 第七节 | 第八节 | 第九节 | 第十节 | 第十一节 |
第九节 用JTree类来创造文件管理器
|
||||||||||
JTree组件被用来以树的形式显示数据,一层套一层,看起来清晰明了,使用户很方便地就了解到各个节点之间的层次关系,可以很容易地找到相关的数据。例如 Windows 系统的文件管理器,相信大部分人都用过。它就是一个典型的树层次结构。 JTree的构造函数: JTree() 建立一棵默认的树。 JTree(Hashtable data) 利用Hashtable建立树。 JTree(Object[] data) 利用数组建立树。 JTree(TreeModel model) 利用TreeModel建立树。 JTree(TreeNode root) 建立以root为根的树。 JTree(TreeNode root,Boolean children) 建立以 root 为根的树,并设定是否允许有子节点。 JTree(Vector value) 利用Vector建立树。 使用一个JTree可以简单地像下面这样表示: add(new JTree(new Object[]{"this","that","other"})); 下列使用了默认的树状物组件在一个滚动框中显示一个树状物。当我们按下按钮时,一个新的子树就被增加到当前选中的节点下,代码如下。 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.tree.*; public class JTreeDemo extends JFrame{ static int i=0; DefaultMutableTreeNode root; /* DefaultMutableTreeNode是树数据结构中的通用节点 */ DefaultMutableTreeNode child; DefaultMutableTreeNode chosen; JTree tree; DefaultTreeModel model; //使用 TreeNodes 的简单树数据模型. String[][] data={{"体育","足球","篮球","乒乓球"},{"娱乐","唱歌","跳舞","相声","小品"},{"电视","长虹","海尔","创维"},{"戏剧","京剧","川剧","越剧"},{"国家","中国","越南","朝鲜","德国"},{"武器","飞机","大炮","坦克"}}; JTreeDemo(){ Container contentPane=this.getContentPane(); JPanel jPanel1=new JPanel(new BorderLayout()); root=new DefaultMutableTreeNode("根"); /* DefaultMutableTreeNode(Object userObject) 创建没有父节点和子节点、但允许有子节点的树节点,并使用指定的用户对象对它进行初始化。*/ tree=new JTree(root); //建立以root为根的树 jPanel1.add(new JScrollPane(tree),BorderLayout.CENTER); /* 将树添加至滚动窗格中,同时将滚动窗格添加进jPanel1面板 */ model=(DefaultTreeModel)tree.getModel(); /* TreeModel getModel() 返回正在提供数据的 TreeModel。 */ JButton jButton1=new JButton("添加节点"); jButton1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ if(i<data.length){ child=new Branch(data[i++]).node(); chosen=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); /* Object getLastSelectedPathComponent() 返回当前选择的第一个节点中的最后一个路径组件。*/ if(chosen==null){ chosen=root; } model.insertNodeInto(child,chosen,0); /* void insertNodeInto(MutableTreeNode newChild, MutableTreeNode parent, int index) 对它进行调用,以便在父节点的子节点中的 index 位置插入 newChild。*/ } } }); jButton1.setBackground(Color.blue); jButton1.setForeground(Color.white); JPanel jPanel2=new JPanel(); jPanel2.add(jButton1); jPanel1.add(jPanel2,BorderLayout.SOUTH); contentPane.add(jPanel1); this.setTitle("JtreeDemo"); this.setSize(300,500); this.setLocation(400,400); this.setVisible(true); } class Branch{ DefaultMutableTreeNode r; public Branch(String[] data){ r=new DefaultMutableTreeNode(data[0]); for(int i=1;i<data.length;i++){ r.add(new DefaultMutableTreeNode(data[i])); } } public DefaultMutableTreeNode node(){ return r; } } public static void main(String args[]){ JTreeDemo test=new JTreeDemo(); } } 运行结果如下图所示: 最重要的类就是分支(Branch),它是一个工具,用来获取一个字符串数组并为第一个字符串建立一个 DefaultMutableTreeNode 作为根,其余在数组中的字符串作为叶。然后 node() 方法被调用以产生分У母?。树状物类包括一个来自被制造的分支的二维字符串数组,以及用来统计数组的一个静态中断i。 DefaultMutableTreeNode 对象控制这个节点,但在屏幕上表示的是被 JTree 和它的相关模型(DefaultTreeModel)所控制。 JTree 通过它自己的模型来控制。当我们修改这个模型时,模型产生一个事件,导致 JTree 对可以看见的树状物完成任何必要的升级。 在 init() 中,模型由调用 getModel() 方法所捕捉。当按钮被按下时,一个新的分支被创建了。然后,当前选择的组件被找到(如果没有选择就是根)并且由模型的 insertNodeInto() 方法做所有的改变树状物和导致它升级的工作。 |
||||||||||