Java - Swing用户界面设计(7)

2.3.20树(JTree)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

  如果要显示一个层次关系分明的一组数据,用树状图表示能给用户一个直观而易用的感觉,JTree类如同Windows的资源管理器的左半部,通过点击可以"打开"、"关闭"文件夹,展开树状结构的图表数据。JTree也是依据M-V-C的思想来设计的,Jtree的主要功能是把数据按照树状进行显示,其数据来源于其它对象,其显示效果通常如下图所示:  

   下面是一棵包含六个分枝点的树的例子,来演示JTree的实现过程。

  1.  importjava.awt.*;
  2.   importjava.awt.event.*;
  3.   importjavax.swing.*;
  4.   importjavax.swing.tree.*;
  5.   classBranch{ 
  6.     DefaultMutableTreeNoder;
  7. //DefaultMutableTreeNode是树的数据结构中的通用节点,节点也可以有多个子节点。
  8. publicBranch(String[]data){
  9.        r=newDefaultMutableTreeNode(data[0]);
  10.        for(inti=1;i<data.length;i++)
  11.        r.add(newDefaultMutableTreeNode(data[i]));
  12.         //给节点r添加多个子节点
  13.     }
  14.     publicDefaultMutableTreeNodenode(){//返回节点
  15.        returnr;
  16.     }
  17. }
  18. publicclassTreesextendsJPanel{
  19.     String[][]data={{"Colors","Red","Blue","Green"},
  20.             {"Flavors","Tart","Sweet","Bland"},
  21.             {"Length","Short","Medium","Long"},
  22.             {"Volume","High","Medium","Low"},
  23.             {"Temperature","High","Medium","Low"},
  24.             {"Intensity","High","Medium","Low"}
  25.             };
  26.     staticinti=0;//I用于统计按钮点击的次数
  27.     DefaultMutableTreeNoderoot,child,chosen;
  28.     JTreetree;
  29.     DefaultTreeModelmodel;
  30.     publicTrees(){
  31.        setLayout(newBorderLayout());
  32.        root=newDefaultMutableTreeNode("root");
  33.        //根节点进行初始化
  34.        tree=newJTree(root);
  35.        //树进行初始化,其数据来源是root对象
  36.        add(newJScrollPane(tree));
  37.        //把滚动面板添加到Trees中
  38.        model=(DefaultTreeModel)tree.getModel();
  39.        //获得数据对象DefaultTreeModel
  40.        JButtontest=newJButton("Pressme");
  41.        //按钮test进行初始化
  42.        test.addActionListener(newActionListener(){
  43.        //按钮test注册监听器
  44.           publicvoidactionPerformed(ActionEvente){
  45.           if(i<data.length){
  46.           //按钮test点击的次数小于data的长度
  47.               child=newBranch(data[i++]).node();
  48.               //生成子节点
  49.               chosen=(DefaultMutableTreeNode)
  50.               //选择child的父节点
  51.                   tree.getLastSelectedPathComponent();
  52.                   if(chosen==null)chosen=root;
  53.                   model.insertNodeInto(child,chosen,0);
  54.                   //把child添加到chosen
  55.           }
  56.        }
  57.     });
  58.     test.setBackground(Color.blue);
  59.     //按钮test设置背景色为蓝色
  60.     test.setForeground(Color.white);
  61.     //按钮test设置前景色为白色
  62.     JPanelp=newJPanel();
  63.     //面板p初始化
  64.     p.add(test);
  65.     //把按钮添加到面板p中
  66.     add(p,BorderLayout.SOUTH);
  67.     //把面板p添加到Trees中
  68. }
  69. publicstaticvoidmain(Stringargs[]){
  70. JFramejf=newJFrame("JTreedemo");
  71. jf.getContentPane().add(newTrees(),BorderLayout.CENTER);//把Trees对象添加到JFrame对象的中央
  72. jf.setSize(200,500);
  73. jf.setVisible(true);
  74. }
  75. }
2.4布局管理器

  和AWT相同,为了容器中的组件能实现平台无关的自动合理排列,Swing也采用了布局管理器来管理组件的排放、位置、大小等布置任务,在此基础上将显示风格做了改进。   另外一个不同点在于Swing虽然有顶层容器,但是我们不能把组件直接加到顶层容器中,Swing窗体中含有一个称为内容面板的容器(ContentPane),在顶层容器上放内容面板,然后把组件加入到内容面板中,前面已讲过如何得到和设置内容面板。   所以,在Swing中,设置布局管理器是针对于内容面板的,另外Swing新增加了一个BoxLayout布局管理器。显示上与AWT略有不同,如下图所示:

现在简单介绍一下BoxLayout布局管理器

  BoxLayout布局管理器按照自上而下(y轴)或者从左到右(x轴)的顺序布局依次加入组件。建立一个BoxLayout对象,必须指明两个参数:被布局的容器和BoxLayout的主轴。缺省情况下,组件在纵轴方向上居中对齐。

  设置布局管理器的方法如下:

<!--EndFragment--><!--EndFragment-->
  1.  pane.setLayout(newBoxLayout(pane,BoxLayout.Y-AXIS));
  2.   JScrollPanelistScroller=newJScrollPane(list);
  3.   listScroller.setPreferredSize(newDemension(250,80));
  4.  listScroller.setMinimumSize(newDimension(250,80)); 
  5.  listScroller.setAlignmentX(LEFT_ALIGNMENT);  ……
  6.  //从上到下设置标签和滚动板.
  7.   JPanellistPane=newJPanel();
  8.   listPane.setLayout(newBoxLayout(listPanae,BoxLayout,Y_AXIS));
  9.   JLabellabel=newJLabel(labelText);
  10.   listPane.add(label);
  11.   listPane.add(Box.createRigidArea(newDemension(0,5)));
  12.   listPane.add(listScroller);
  13.  listPane.setBorder(BorderFactory.creatEmptyBorder(10,10,10,10);
  14.   //从左到右设置按钮
  15.  JPanelbuttonPane=newJPanel();
  16.   buttonPane.setLayout(newBoxLayout(buttonPane,Boxlayout.X_AXIS));
  17.   buttonPane.setBoder(BorderFactory.createEmptyBorder(0,10,10,10));
  18.  buttonPane.add(Box.createHorizontalGlue());
  19.  buttonPane.add(cancelButton);
  20.  buttonPane.add(Box.createRigiArea(newDimension(10,0)));
  21.  buttonPane.add(setButton);
  22.  ContainercontentPane=getContentPane();
  23.  contentPane.add(listPane,BorderLayout.CENTER);
  24.  contentPane.add(buttonPane,BorderLayout.SOUTH);

【小结】

  对于AWT而言,Java1.1到Java1.2最大的改变就是Java中所有的库。当Java1.1版纳入新的事件模型和JavaBeans时,平台被设置--现在它可以被拖放到可视化的应用程序构建工具中,创建GUI组件。另外,事件模型的设计和Bean无疑对轻松的编程和可维护的代码都非常有益。对于Swing组件而言,交叉平台GUI编程可以变成一种有意义的尝试。   本章主要介绍了一些Swing的新特性,它和AWT相比有哪些不同的方法和应用,着重阐述了Swing的特色组件和容器,并以图形的形式给出具体描述,同时介绍了组件的分类,使用Swing的基本规则,各种容器面板以及布局管理器,由于Swing是Java2新增特性,它对图形化用户界面提供了庞大而复杂的类库支持,要能做到开发和实用,还需做大量工作,利用API的帮助,逐步深入摸索其规律,从组件和容器入手,掌握其特色方法。从另一角度来看,Swing和AWT无论是布局管理器还是事件处理机制,以及对一些重量容器的保留和使用,都是我们非常熟悉的内容,其原理我们已在AWT一章做了详细介绍,因此,AWT作为Swing的基础,是需要很好掌握的,希望大家能在不断设计应用中摸索出新方法和新技巧

<!--EndFragment-->

你可能感兴趣的:(java,数据结构,编程,swing,Office)