本人正在学习java UI部分,但是这个布局实在让人头疼,大家有没有好的文章介绍

解决方案 »

  1.   

    ++ Swing读书笔记1-3:版面管理器(Layout Menager)
             |BorderLayout
             |FlowLayout
             |GridLayout
      AWT----|CardLayout
             |GridBagLayout  Swing--|BoxLayout
    1-3-1:BorderLayout的使用:
       BorderLayout的类层次结构图:
           java.lang.Object
            --java.awt.BorderLayout
       构造函数:BorderLayout()建立一个没有间距的border layout
                 BorderLayout(int hgap,int vgap)建立一个组件间有间距的border layout
      BorderLayout将版面划分为东、西、南、北、中
     例子:BorderLayoutDemo.java
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class BorderLayoutDemo{
       public BorderLayoutDemo(){
         JFrame f=new JFrame();
            Container contentPane=f.getContentPane();
            contentPane.setLayout(new BorderLayout());
            contentPane.add(new JButton("EAST"),BorderLayout.EAST);
            contentPane.add(new JButton("WEST"),BorderLayout.WEST);
            contentPane.add(new JButton("SOUTH"),BorderLayout.SOUTH);
            contentPane.add(new JButton("NORTH"),BorderLayout.NORTH);
            contentPane.add(new JLabel("CENTER",JLabel.CENTER),BorderLayout.CENTER);
            f.setTitle("BorderLayout");
            f.pack();
            f.setVisible(true);
            /***read**/
            /*处理关闭窗口的操作,若你没写这一段,就算你已经关闭窗口了,但程序并不会终止。
             */
            f.addWindowListener(
               new WindowAdapter(){
                   public void windowClosing(WindowEvent e){
                      System.exit(0);
                   }
               }
            );
           /***read**/
       }
       public static void main(String[] args){
         BorderLayoutDemo b=new BorderLayoutDemo();
       }
    }
       设置组件的间距,你可以使用有间距参数的BorderLayout构造函数,也可以利用BorderLayout的setHgap(int hgap)与
       setVgap(int vgap)两个方法来达成。
    1-3-2:FlowLayout的使用:
       FlowLayout的类层次结构图:
           java.lang.Object
            --java.awt.FlowLayout
       构造函数:FlowLayout()建立一个新的Flow Layout,此FlowLayout默认值是居中对齐,组件彼此有5单位的水平与垂直间距。
                 FlowLayout(int align)建立一个新的Flow Layout,此FlowLayout可设置排列方式,组件彼此有5单位的水平与垂直
                                     间距。
                 FlowLayout(int align,int hgap,int vgap)建立一个新的Flow Layout,此FlowLayout可设置排列方式与组件间距。
    FlowLayoutDemo.java
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class FlowLayoutDemo{
       public FlowLayoutDemo(){
          JFrame f=new JFrame();
             Container contentPane=f.getContentPane();
             /*你可以使用有间距的FlowLayout构造函数,使FlowLayout的排列具有间距,并
              *并可利用排列方向参数来指定靠什么方向排列,FlowLayout共有五种排列方式,
              *依次是CENTER(默认值),LEFT,RIGHT,LEADING,TRAILING,若我们将下面程序第13
              *行改成contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));                              
              */
             contentPane.setLayout(new FlowLayout());         
             contentPane.add(new JButton("first"));
             contentPane.add(new JButton("second"));
             contentPane.add(new JButton("third"));
             contentPane.add(new JButton("fourth"));
             contentPane.add(new JButton("fifth"));
             contentPane.add(new JButton("Last"));
             
             f.setTitle("FlowLayout");
             //f.pack();//必须将f.pach()去掉,否则setSize功能将没有作用
             f.setSize(400,220);
             f.setVisible(true);
            f.addWindowListener(
               new WindowAdapter(){
                   public void windowClosing(WindowEvent e){
                      System.exit(0);
                   }
               }
            );
       }
       public static void main(String[] args){
         FlowLayoutDemo b=new FlowLayoutDemo();
       }
    }
      

  2.   

    1-3-3:GridLayout的使用:
           GridLayout的类层次结构图:
           java.lang.Object
            --java.awt.GridLayout
        GridLayout比FlowLayout多了行和列的设置,也就是说你要先设置GridLayout共有几行几列,就如同二维平面一般,然后你加
    进去的组件会先填第一行的格子,然后再从第二行开始填,依此类扒,就像是一个个的格子一般。而且GridLayout会将所填进去组
    件的大小设为一样。
    构造函数:GridLayout()建立一个新的GridLayout,默认值是1行1列。
              GridLayout(int rows,int cols)建立一个几行几列的GridLayout.
              GridLayout(int rows,int cols, int hgap,int vgap)建立一个几行几列的GridLayout,并设置组件的间距。
    例子:GridLayoutDemo.javaimport java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class CardLayoutDemo implements ActionListener{
      JPanel p1,p2,p3,p4;
      int i=1;
      JFrame f;
      public CardLayoutDemo(){
        f=new JFrame();//当做top-level组件
          Container contentPane=f.getContentPane();
          contentPane.setLayout(new GridLayout(2,1));
          
          p1=new JPanel();
          Button b=new Button("Change Card");
          b.addActionListener(this);//当按下"Change Card"时,进行事件监听,将会有系统操作产生。
          p1.add(b);                //处理操作在52-64行.
          contentPane.add(p1);
          
          p2=new JPanel();
          p2.setLayout(new FlowLayout());
          p2.add(new JButton("first"));
          p2.add(new JButton("second"));
          p2.add(new JButton("third"));
          
          p3=new JPanel();
          p3.setLayout(new GridLayout(3,1));
          p3.add(new JButton("fourth"));
          p3.add(new JButton("fifth"));
          p3.add(new JButton("This is the last button"));
          
          p4=new JPanel();
          p4.setLayout(new CardLayout());
          p4.add("one",p2);
          p4.add("two",p3);
          /*要显示CardLayout的卡片,除了用show(Container parent,String name)这个方法外
           *,也可试试first(Container),next(Container),previous(Container),last(Container)这
           *四个方法,一样可以达到显示效果。
           */
          ((CardLayout)p4.getLayout()).show(p4,"one");
          
          contentPane.add(p4);
          
          f.setTitle("CardLayout");
          f.pack();
          f.setVisible(true);
          
          f.addWindowListener(
               new WindowAdapter(){
                   public void windowClosing(WindowEvent e){
                      System.exit(0);
                   }
               }
          );
          
      }
      public void actionPerformed(ActionEvent event){
         switch(i){
            case 1:
                 ((CardLayout)p4.getLayout()).show(p4,"two");
                 break;
            case 2:
                 ((CardLayout)p4.getLayout()).show(p4,"one");
                 break;
         }
         i++;
         if (i==3) i=1;
         f.validate();
      }
      public static void main(String[] args){
        new CardLayoutDemo();
      }
    }
      

  3.   

    1-3-5:GridBagLayout的使用:是java中最有弹性但也是最复杂的一种版面管理器。它只有一种构造函数,但必须配合
                               GridBagConstraints才能达到设置的效果。
        GridBagLayout的类层次结构图:
        java.lang.Object
         --java.awt.GridBagLayout
    构造函数:
        GirdBagLayout()建立一个新的GridBagLayout管理器。
        GridBagConstraints()建立一个新的GridBagConstraints对象。
        GridBagConstraints(int gridx,int gridy,int gridwidth,int gridheight,double weightx,double weighty,
                           int anchor,int fill, Insets insets,int ipadx,int ipady)建立一个新的GridBagConstraints对象
                          ,并指定其参数的值。
     参数说明:
     gridx,gridy:设置组件的位置,gridx设置为GridBagConstraints.RELATIVE代表此组件位于之前所加入组件的右边。
                 若将gridy设置为GridBagConstraints.RELATIVE代表此组件位于以前所加入组件的下面。建议定义出
                 gridx,gridy的位置,以便以后维护程序。表示放在几行几列,gridx=0,gridy=0时放在0行0列。 gridwidth,gridheight:用来设置组件所占的单位长度与高度,默认值皆为1。你可以使用GridBagConstraints.REMAINDER常
                          量,代表此组件为此行或此列的最后一个组件,而且会占据所有剩余的空间。 weightx,weighty:用来设置窗口变大时,各组件跟着变大的比例,当数字越大,表示组件能得到更多的空间,默认值皆为0。
     anchor:         当组件空间大于组件本身时,要将组件置于何处,有CENTER(默认值)、NORTH、NORTHEAST、EAST、SOUTHEAST、
                     WEST、NORTHWEST可供选择。
     insets:设置组件之间彼此的间距,它有四个参数,分别是上,左,下,右,默认为(0,0,0,0).
     ipadx,ipady:设置组件内的间距,默认值为0。              
       我们以前提过,GridBagLayout里的各种设置都必须通过GridBagConstraints,因此当我们将GridBagConstraints的参数都设置
    好了之后,必须new一个GridBagConstraints的对象出来,以便GridBagLayout使用。
    例子:
    GridBagLayoutDemo.javaimport java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class GridBagLayoutDemo{
       public GridBagLayoutDemo(){
          JButton b;
          GridBagConstraints c;
          int gridx,gridy,gridwidth,gridheight,anchor,fill,ipadx,ipady;
          double weightx,weighty;
          Insets inset;
          
          JFrame f=new JFrame();
          
          GridBagLayout gridbag=new GridBagLayout();
            Container contentPane=f.getContentPane();
            contentPane.setLayout(gridbag);
            
            b=new JButton("first");
            gridx=0;
            gridy=0;
            gridwidth=1;
            gridheight=1;
            weightx=10;
            weighty=1;
            anchor=GridBagConstraints.CENTER;
            fill=GridBagConstraints.HORIZONTAL;
            inset=new Insets(0,0,0,0);
            ipadx=0;
            ipady=0;
            c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
               fill,inset,ipadx,ipady);
            gridbag.setConstraints(b,c);
            contentPane.add(b);
            
            
            b=new JButton("second");
            gridx=1;
            gridy=0;
            gridwidth=2;
            gridheight=1;
            weightx=1;
            weighty=1;
            anchor=GridBagConstraints.CENTER;
            fill=GridBagConstraints.HORIZONTAL;
            inset=new Insets(0,0,0,0);
            ipadx=50;
            ipady=0;
            c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
               fill,inset,ipadx,ipady);
            gridbag.setConstraints(b,c);
            contentPane.add(b);        b=new JButton("third");
            gridx=0;
            gridy=1;
            gridwidth=1;
            gridheight=1;
            weightx=1;
            weighty=1;
            anchor=GridBagConstraints.CENTER;
            fill=GridBagConstraints.HORIZONTAL;
            inset=new Insets(0,0,0,0);
            ipadx=0;
            ipady=50;
            c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
               fill,inset,ipadx,ipady);
            gridbag.setConstraints(b,c);
            contentPane.add(b);
            
            b=new JButton("fourth");
            gridx=1;
            gridy=1;
            gridwidth=1;
            gridheight=1;
            weightx=1;
            weighty=1;
            anchor=GridBagConstraints.CENTER;
            fill=GridBagConstraints.HORIZONTAL;
            inset=new Insets(0,0,0,0);
            ipadx=0;
            ipady=0;
            c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
               fill,inset,ipadx,ipady);
            gridbag.setConstraints(b,c);
            contentPane.add(b);        b=new JButton("This is the last button");
            gridx=2;
            gridy=1;
            gridwidth=1;
            gridheight=2;
            weightx=1;
            weighty=1;
            anchor=GridBagConstraints.CENTER;
            fill=GridBagConstraints.HORIZONTAL;
            inset=new Insets(0,0,0,0);
            ipadx=0;
            ipady=50;
            c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
               fill,inset,ipadx,ipady);
            gridbag.setConstraints(b,c);
            contentPane.add(b);        f.setTitle("GridBagLayout");
            f.pack();
            f.setVisible(true);
          f.addWindowListener(
               new WindowAdapter(){
                   public void windowClosing(WindowEvent e){
                      System.exit(0);
                   }
               }
          );       
       }
       public static void main(String[] args){
          new GridBagLayoutDemo();
       }
    }
      

  4.   

    一般都是要BorderLayout,FlowLayout和GridBagLayout结合使用。
      

  5.   

    使用FlowLayout时有个小技巧:因为它会使所有组件要么居左或居中或居右靠拢,而且组件之间紧挨着,这点有时很不好看,可在组件件加些JLabel,并用JLabel的setText("   ");其中空格的多少就看你要组件间的间隔多大了.