Java图形界面设计

一、总述

Java的图形用户界面由各种组件(component)构成,它们主要位于java.awt包与javax.swing包中。Swing与AWT最大的不同是,Swing在实现时,不包含任何本地代码(native),是一种“轻量级(lightweight)”的组件

Swing具有状态的组件。

二、容器

1.顶层容器:

JFrame、JApplet、JDialog 和 JWindow

2.JFrame创建的一个程序

2.1代码

[java]  view plain copy print ?
  1. import java.awt.*;  
  2.  import javax.swing.*;  
  3.    
  4.  public class JFrameDemo{  
  5.     public static void main(String args[]){  
  6.         JFrame frame = new JFrame("JFrameDemo");  
  7.         JButton button = new JButton("Press Me");  
  8.    
  9.         //first way to do that  
  10.         // frame.getContentPane().add(button,BorderLayout.CENTER);  
  11.    
  12.    
  13.         //another way to set the Pane     
  14.         JPanel contentPane = new JPanel();  
  15.         contentPane.setLayout(new BorderLayout());  
  16.         contentPane.add(button,BorderLayout.CENTER);  
  17.         frame.setContentPane(contentPane);  
  18.    
  19.         //frame.pack();  
  20.         frame.setVisible(true);  
  21.     }  
  22.  }  

2.2执行结果


3.面板(JPanel)

可以相互嵌套,不能独立存在,只能添加到其他窗口内部。

3.1代码


[java]  view plain copy print ?
  1. import java.awt.*;  
  2.  import javax.swing.*;  
  3.    
  4.  public class FrameWithPanel{  
  5.     public static void main(String args[]){  
  6.     JFrame frame = new JFrame("Frame with Panel");  
  7.     Container contentPane = frame.getContentPane();  
  8.     contentPane.setBackground(Color.CYAN);  
  9.    
  10.     JPanel panel = new JPanel();  
  11.     panel.setBackground(Color.yellow);  
  12.    
  13.     JButton button = new JButton("Press me");  
  14.     panel.add(button);  
  15.     //add JButton instance to JPanel  
  16.    
  17.     //add JPanel instance to JFrame's south  
  18.     contentPane.add(panel,BorderLayout.SOUTH);  
  19.     frame.setSize(300,200);  
  20.     frame.setVisible(true);  
  21.     }  
  22.  }  

3.2执行结果


三、布局

1.总述

组件的布局(包括位置与大小)通常由Layout Manager负责安排。Java平台提供了多种布局管理器,以下对其部分,进行说明。

2.FlowLayout Layout Manager

2.1FlowLayout 的三种构造方法

[java]  view plain copy print ?
  1. public FlowLayout()  
  2.     public FlowLayout(int align)  
  3.     public FlowLayout(int align,int hgap,int vgap)  


构造方法中,提供了一个对齐方式的可选项align,取值有三种形式:FlowLayout.LEFT、 FlowLayout.CENTER 、FlowLayout.RIGHT。hgap和vgap可以设定组件的水平间距和垂直距离。

2.2参考代码

[java]  view plain copy print ?
  1. import java.awt.*;  
  2.  import javax.swing.*;  
  3.    
  4.  public class FlowLayoutDemo{  
  5.     private JFrame frame;  
  6.     private JButton btn1,btn2,btn3;  
  7.    
  8.     public static void main(String args[]){  
  9.     FlowLayoutDemo that = new FlowLayoutDemo();  
  10.     that.go();  
  11.     }  
  12.     public void go(){  
  13.     frame = new JFrame("Flow Layout");  
  14.     Container contentPane = frame.getContentPane();  
  15.    
  16.     contentPane.setLayout(new FlowLayout());  
  17.    
  18.     btn1 = new JButton("OK");  
  19.     btn2 = new JButton("Open");  
  20.     btn3 = new JButton("Close");  
  21.    
  22.     contentPane.add(btn1);  
  23.     contentPane.add(btn2);  
  24.     contentPane.add(btn3);  
  25.    
  26.     frame.setSize(300,200);  
  27.     frame.setVisible(true);  
  28.     }  
  29.  }  

2.3执行结果


改变Frame的大小,Frame中组件的布局也会随之改变。

3.BorderLayout 布局管理器

3.1概述

BorderLayout是顶层窗口中内容窗格的默认布局管理器,被划分为BorderLayout.NORTH、BorderLayout.SOUTH、BorderLayout.WEST、BorderLayout.EAST、BorderLayout.CENTER 五个区域。

3.2构造函数

[java]  view plain copy print ?
  1. BorderLayout()  
  2.     BorderLayout(int,int)  

3.3示例代码


[java]  view plain copy print ?
  1. import java.awt.*;  
  2.  import javax.swing.*;  
  3.    
  4.  public class BorderLayoutDemo{  
  5.     private JFrame frame;  
  6.     private JButton be,bw,bn,bs,bc;  
  7.    
  8.     public static void main(String args[]){  
  9.     BorderLayoutDemo that = new BorderLayoutDemo();  
  10.     that.go();  
  11.     }  
  12.     public void go(){  
  13.     frame = new JFrame("Border Layout");  
  14.     be = new JButton("East");  
  15.     bw = new JButton("West");  
  16.     bn = new JButton("North");  
  17.     bs = new JButton("South");  
  18.     bc = new JButton("Center");  
  19.    
  20.     frame.getContentPane().add(be,"East");  
  21.     frame.getContentPane().add(bw,BorderLayout.WEST);  
  22.     frame.getContentPane().add(bn,BorderLayout.NORTH);  
  23.     frame.getContentPane().add(bs,BorderLayout.SOUTH);  
  24.     frame.getContentPane().add(bc,BorderLayout.CENTER);  
  25.    
  26.     frame.setSize(350,200);  
  27.     frame.setVisible(true);  
  28.     }  
  29.  }  



3.4执行结果




4.GridLayout布局管理器

4.1总述

是一种网格式的布局管理器,将窗口空间分割成若干行,乘若干列的网格。组件依次放入,占一格。

4.2构造函数

public GridLayout()

public GridLayout(int rows, int cols)

public GridLayout(int rows, int cols, int hgap, int vgap)

4.3参考代码


[java]  view plain copy print ?
  1. import java.awt.*;  
  2.  import javax.swing.*;  
  3.    
  4.  public class GridLayoutDemo{  
  5.     private JFrame frame;  
  6.     private JButton b1,b2,b3,b4,b5,b6;  
  7.    
  8.     public static void main(String args[]){  
  9.     GridLayoutDemo that = new GridLayoutDemo();  
  10.     that.go();  
  11.     }  
  12.     public void go(){  
  13.     frame = new JFrame("Grid Frame");  
  14.    
  15.     Container contentPane = frame.getContentPane();  
  16.    
  17.     contentPane.setLayout(new GridLayout(3,2));  
  18.    
  19.     b1 = new JButton("grid_1");  
  20.     b2 = new JButton("grid_2");  
  21.     b3 = new JButton("grid_3");  
  22.     b4 = new JButton("grid_4");  
  23.     b5 = new JButton("grid_5");  
  24.     b6 = new JButton("grid_6");  
  25.    
  26.     contentPane.add(b1);  
  27.     contentPane.add(b2);  
  28.     contentPane.add(b3);  
  29.     contentPane.add(b4);  
  30.     contentPane.add(b5);  
  31.     contentPane.add(b6);  
  32.    
  33.     frame.pack();  
  34.     frame.setVisible(true);  
  35.     }  
  36.  }  


4.4执行结果


5.CardLayout 布局管理器

5.1总述

是一种卡片式的布局管理器,它将容器中的组件处理成一系列卡片,每一时刻只显示出其中一张。

5.2参考代码:

[java]  view plain copy print ?
  1. import java.awt.*;  
  2.  import javax.swing.*;  
  3.  import java.awt.event.*;  
  4.    
  5.  public class CardLayoutDemo extends MouseAdapter{  
  6.     JPanel p1,p2,p3,p4,p5;  
  7.     JLabel l1, l2, l3, l4, l5;  
  8.    
  9.     //declare a Cardlayout object  
  10.     CardLayout myCard;  
  11.     JFrame frame;  
  12.     Container contentPane;  
  13.    
  14.     public static void main(String args[]){  
  15.     CardLayoutDemo that = new CardLayoutDemo();  
  16.     that.go();  
  17.     System.out.println("test");  
  18.     }  
  19.    
  20.     public void go(){  
  21.     frame = new JFrame("Card Test");  
  22.     contentPane = frame.getContentPane();  
  23.     myCard = new CardLayout();  
  24.    
  25.     contentPane.setLayout(myCard);  
  26.    
  27.     p1=new JPanel();  
  28.     p2 = new JPanel();  
  29.     p3 = new JPanel();  
  30.     p4 = new JPanel();  
  31.     p5 = new JPanel();  
  32.    
  33.     //set the different bk color for each JPanel label  
  34.     l1 =  new JLabel("This is the first JPanel");  
  35.     p1.add(l1);  
  36.     p1.setBackground(Color.yellow);  
  37.    
  38.     l2 =  new JLabel("This is the second JPanel");  
  39.     p2.add(l2);  
  40.     p2.setBackground(Color.green);  
  41.    
  42.     l3 =  new JLabel("This is the third JPanel");  
  43.     p3.add(l3);  
  44.     p3.setBackground(Color.magenta);  
  45.    
  46.     l4 =  new JLabel("This is the forth JPanel");  
  47.     p4.add(l4);  
  48.     p4.setBackground(Color.white);  
  49.    
  50.     l5 =  new JLabel("This is the fifth JPanel");  
  51.     p5.add(l5);  
  52.     p5.setBackground(Color.cyan);  
  53.    
  54.     //set mouseListener  
  55.     p1.addMouseListener(this);  
  56.     p2.addMouseListener(this);  
  57.     p3.addMouseListener(this);  
  58.     p4.addMouseListener(this);  
  59.     p5.addMouseListener(this);  
  60.    
  61.     //set each JPanle as a Card to insert frame  
  62.     contentPane.add(p1,"First");  
  63.     contentPane.add(p2,"Sencond");  
  64.     contentPane.add(p3,"Third");  
  65.     contentPane.add(p4,"Forth");  
  66.     contentPane.add(p5,"Fifth");  
  67.    
  68.     //display the first pic  
  69.     myCard.show(contentPane,"First");  
  70.     frame.setSize(300,200);  
  71.      frame.show();  
  72.     }  
  73.    
  74.     public void mouseClicked(MouseEvent e){  
  75.     myCard.next(contentPane);  
  76.     }  
  77.  }  


5.2执行结果




6.BoxLayout布局管理器

6.1总述

将容器中的组件,按水平排成一行,或按垂直方向排成一列。

6.2构造函数

BoxLayout(Container target, int axis)

axis = BoxLayout.X_AXIS | BoxLayout.Y_AXIS

6.3参考代码

[java]  view plain copy print ?
  1. import java.awt.*;  
  2.  import javax.swing.*;  
  3.    
  4.  public class BoxLayoutDemo{  
  5.  <span style="white-space:pre">    </span>private JFrame frame;  
  6.  <span style="white-space:pre">    </span>private JPanel pv,ph;  
  7.    
  8.  <span style="white-space:pre">    </span>public static void main(String args[]){  
  9.  <span style="white-space:pre">        </span>BoxLayoutDemo that = new BoxLayoutDemo();  
  10.  <span style="white-space:pre">        </span>that.go();  
  11.  <span style="white-space:pre">    </span>}  
  12.  <span style="white-space:pre">    </span>public void go(){  
  13.  <span style="white-space:pre">        </span>frame = new JFrame("Box Layout example");  
  14.  <span style="white-space:pre">        </span>Container contentPane = frame.getContentPane();  
  15.    
  16.  <span style="white-space:pre">        </span>pv = new JPanel();  
  17.  <span style="white-space:pre">        </span>pv.setLayout(new BoxLayout(pv,BoxLayout.Y_AXIS));  
  18.    
  19.  <span style="white-space:pre">        </span>pv.add(new JLabel("Monday"));  
  20.  <span style="white-space:pre">        </span>pv.add(new JLabel("Tuesday"));  
  21.  <span style="white-space:pre">        </span>pv.add(new JLabel("Wednesday"));  
  22.  <span style="white-space:pre">        </span>pv.add(new JLabel("Thursday"));  
  23.  <span style="white-space:pre">        </span>pv.add(new JLabel("Friday"));  
  24.  <span style="white-space:pre">        </span>pv.add(new JLabel("Saturday"));  
  25.  <span style="white-space:pre">        </span>pv.add(new JLabel("Sunday"));  
  26.    
  27.  <span style="white-space:pre">        </span>contentPane.add(pv,BorderLayout.CENTER);  
  28.    
  29.  <span style="white-space:pre">        </span>ph  = new JPanel();  
  30.  <span style="white-space:pre">        </span>ph.setLayout(new BoxLayout(ph,BoxLayout.X_AXIS));  
  31.    
  32.  <span style="white-space:pre">        </span>ph.add(new JButton("Yes"));  
  33.  <span style="white-space:pre">        </span>ph.add(new JButton("No"));  
  34.  <span style="white-space:pre">        </span>ph.add(new JButton("Cancle"));  
  35.    
  36.  <span style="white-space:pre">        </span>contentPane.add(ph,BorderLayout.SOUTH);  
  37.    
  38.  <span style="white-space:pre">        </span>frame.pack();  
  39.  <span style="white-space:pre">        </span>frame.setVisible(true);  
  40.  <span style="white-space:pre">    </span>}  
  41.  }  


6.4执行结果



6.5专门使用BoxLayout的特殊容器—Box类

6.5.1创建实例的静态方法

[java]  view plain copy print ?
  1. public static Box createHorizontalBox()  
  2.     public static Box createVerticalBox()  

6.5.2|6.3的代码,改写如下


[java]  view plain copy print ?
  1. //the specific Box class for BoxLayout Container  
  2.  import java.awt.*;  
  3.  import javax.swing.*;  
  4.    
  5.  public class BoxDemo{  
  6.     private JFrame frame;  
  7.     private Box bv,bh;  
  8.    
  9.     public static void main(String arg[]){  
  10.         BoxDemo that = new BoxDemo();  
  11.         that.go();  
  12.     }  
  13.     void go(){  
  14.         frame = new JFrame("Box Layout example");  
  15.         Container contentPane = frame.getContentPane();  
  16.    
  17.         bv = Box.createVerticalBox();  
  18.    
  19.         bv.add(new JLabel("Monday"));  
  20.         bv.add(new JLabel("Tuesday"));  
  21.         bv.add(new JLabel("Wednesday"));  
  22.         bv.add(new JLabel("Thursday"));  
  23.         bv.add(new JLabel("Friday"));  
  24.         bv.add(new JLabel("Saturday"));  
  25.         bv.add(new JLabel("Sunday"));  
  26.    
  27.         contentPane.add(bv,BorderLayout.CENTER);  
  28.    
  29.         bh = Box.createHorizontalBox();  
  30.         bh.add(new JButton("Yes"));  
  31.         bh.add(new JButton("No"));  
  32.         bh.add(new JButton("Cancel"));  
  33.    
  34.         contentPane.add(bh,BorderLayout.SOUTH);  
  35.    
  36.         frame.setSize(300,200);  
  37.         //frame.pack();  
  38.         frame.setVisible(true);  
  39.     }  
  40.  }  


6.6Box类提供的创建不可组件方法


[java]  view plain copy print ?
  1. public static Component createHorizontalGlue()  
  2.     public static Component createHorizontalStrut(int width)  
  3.     public static Component createVerticalGlue()  
  4.     public static Component createVerticalStrut(int height)  
  5.     public static Component createRigidArea(Dimension d)  

6.6.1参考代码


[java]  view plain copy print ?
  1. //to create invisible component  
  2.  import java.awt.*;  
  3.  import javax.swing.*;  
  4.    
  5.  public class GlueAndStrut{  
  6.     private JFrame frame;  
  7.     private Box b1,b2,b3,b4;  
  8.    
  9.     public static void main(String args[]){  
  10.         GlueAndStrut that = new GlueAndStrut();  
  11.         that.go();  
  12.     }  
  13.     void go(){  
  14.         frame = new JFrame("Glue And Strut");  
  15.         Container contentPane = frame.getContentPane();  
  16.         contentPane.setLayout(new GridLayout(4,1));  
  17.    
  18.         b1 = Box.createHorizontalBox();  
  19.         b1.add(new JLabel("Box 1:"));  
  20.         b1.add(new JButton("Yes"));  
  21.         b1.add(new JButton("No"));  
  22.         b1.add(new JButton("Cancel"));  
  23.    
  24.         b2 = Box.createHorizontalBox();  
  25.         b2.add(new JLabel("Box 2:"));  
  26.         b2.add(new JButton("Yes"));  
  27.         b2.add(new JButton("No"));  
  28.         b2.add(Box.createHorizontalGlue());  
  29.         b2.add(new JButton("Cancel"));  
  30.    
  31.         b3 = Box.createHorizontalBox();  
  32.         b3.add(new JLabel("Box 3:"));  
  33.         b3.add(new JButton("Yes"));  
  34.         b3.add(new JButton("No"));  
  35.         b3.add(Box.createHorizontalStrut(20));  
  36.         b3.add(new JButton("Cancel"));  
  37.    
  38.         b4 = Box.createHorizontalBox();  
  39.         b4.add(new JLabel("Box 4:"));  
  40.         b4.add(new JButton("Yes"));  
  41.         b4.add(new JButton("No"));  
  42.         b4.add(Box.createRigidArea(new Dimension(10,10)));  
  43.         b4.add(new JButton("Cancel"));  
  44.    
  45.         contentPane.add(b1);  
  46.         contentPane.add(b2);  
  47.         contentPane.add(b3);  
  48.         contentPane.add(b4);  
  49.    
  50.         frame.setSize(300,200);  
  51.         frame.setVisible(true);  
  52.     }  
  53.  }  


6.6.2执行结果

7.不使用布局管理器

7.1一般做法

a.setLayout(null)将布局管理器设置为空

b.setBounds(int x,int y,int width,int height) 设置组件的位置与大小

7.2参考代码

[java]  view plain copy print ?
  1. import java.awt.*;  
  2.  import javax.swing.*;  
  3.    
  4.  public class NullLayoutDemo{  
  5.     private JFrame frame;  
  6.     private JButton b1,b2,b3;  
  7.    
  8.     public static void main(String args[]){  
  9.         NullLayoutDemo that = new NullLayoutDemo();  
  10.         that.go();  
  11.     }  
  12.     private void go(){  
  13.         frame = new JFrame("Null Layout Demo");  
  14.         Container contentPane = frame.getContentPane();  
  15.    
  16.         //set the layout as null;     
  17.         contentPane.setLayout(null);  
  18.    
  19.         //add the buttons  
  20.         b1 = new JButton("Yes");  
  21.         contentPane.add(b1);  
  22.         b2 = new JButton("No");  
  23.         contentPane.add(b2);  
  24.         b3 = new JButton("Cancel");  
  25.         contentPane.add(b3);  
  26.    
  27.         //set the buttons' pos and size;  
  28.         b1.setBounds(30,15,75,20);  
  29.         b2.setBounds(150,15,75,50);  
  30.         b3.setBounds(150,100,75,20);  
  31.    
  32.         frame.setSize(300,200);  
  33.         frame.setVisible(true);  
  34.     }  
  35.  }  


7.3执行结果

你可能感兴趣的:(java,界面)