zoukankan      html  css  js  c++  java
  • Java图形界面设计

    一、总述

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

    Swing具有状态的组件。

    二、容器

    1.顶层容器:

    JFrame、JApplet、JDialog 和 JWindow

    2.JFrame创建的一个程序

    2.1代码

    import java.awt.*;
     import javax.swing.*;
     
     public class JFrameDemo{
     	public static void main(String args[]){
     		JFrame frame = new JFrame("JFrameDemo");
     		JButton button = new JButton("Press Me");
     
     		//first way to do that
     		// frame.getContentPane().add(button,BorderLayout.CENTER);
     
     
     		//another way to set the Pane 	
     		JPanel contentPane = new JPanel();
     		contentPane.setLayout(new BorderLayout());
     		contentPane.add(button,BorderLayout.CENTER);
     		frame.setContentPane(contentPane);
     
     		//frame.pack();
     		frame.setVisible(true);
     	}
     }

    2.2执行结果

    3.面板(JPanel)

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

    3.1代码

    import java.awt.*;
     import javax.swing.*;
     
     public class FrameWithPanel{
     	public static void main(String args[]){
     	JFrame frame = new JFrame("Frame with Panel");
     	Container contentPane = frame.getContentPane();
     	contentPane.setBackground(Color.CYAN);
     
     	JPanel panel = new JPanel();
     	panel.setBackground(Color.yellow);
     
     	JButton button = new JButton("Press me");
     	panel.add(button);
     	//add JButton instance to JPanel
     
     	//add JPanel instance to JFrame's south
     	contentPane.add(panel,BorderLayout.SOUTH);
     	frame.setSize(300,200);
     	frame.setVisible(true);
     	}
     }

    3.2执行结果


    三、布局

    1.总述

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

    2.FlowLayout Layout Manager

    2.1FlowLayout 的三种构造方法

    			public FlowLayout()
     			public FlowLayout(int align)
     			public FlowLayout(int align,int hgap,int vgap)

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

    2.2参考代码

    import java.awt.*;
     import javax.swing.*;
     
     public class FlowLayoutDemo{
     	private JFrame frame;
     	private JButton btn1,btn2,btn3;
     
     	public static void main(String args[]){
     	FlowLayoutDemo that = new FlowLayoutDemo();
     	that.go();
     	}
     	public void go(){
     	frame = new JFrame("Flow Layout");
     	Container contentPane = frame.getContentPane();
     
     	contentPane.setLayout(new FlowLayout());
     
     	btn1 = new JButton("OK");
     	btn2 = new JButton("Open");
     	btn3 = new JButton("Close");
     
     	contentPane.add(btn1);
     	contentPane.add(btn2);
     	contentPane.add(btn3);
     
     	frame.setSize(300,200);
     	frame.setVisible(true);
     	}
     }

    2.3执行结果

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


    3.BorderLayout 布局管理器

    3.1概述

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

    3.2构造函数

    			BorderLayout()
     			BorderLayout(int,int)

    3.3示例代码

    import java.awt.*;
     import javax.swing.*;
     
     public class BorderLayoutDemo{
     	private JFrame frame;
     	private JButton be,bw,bn,bs,bc;
     
     	public static void main(String args[]){
     	BorderLayoutDemo that = new BorderLayoutDemo();
     	that.go();
     	}
     	public void go(){
     	frame = new JFrame("Border Layout");
     	be = new JButton("East");
     	bw = new JButton("West");
     	bn = new JButton("North");
     	bs = new JButton("South");
     	bc = new JButton("Center");
     
     	frame.getContentPane().add(be,"East");
     	frame.getContentPane().add(bw,BorderLayout.WEST);
     	frame.getContentPane().add(bn,BorderLayout.NORTH);
     	frame.getContentPane().add(bs,BorderLayout.SOUTH);
     	frame.getContentPane().add(bc,BorderLayout.CENTER);
     
     	frame.setSize(350,200);
     	frame.setVisible(true);
     	}
     }


    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参考代码

    import java.awt.*;
     import javax.swing.*;
     
     public class GridLayoutDemo{
     	private JFrame frame;
     	private JButton b1,b2,b3,b4,b5,b6;
     
     	public static void main(String args[]){
     	GridLayoutDemo that = new GridLayoutDemo();
     	that.go();
     	}
     	public void go(){
     	frame = new JFrame("Grid Frame");
     
     	Container contentPane = frame.getContentPane();
     
     	contentPane.setLayout(new GridLayout(3,2));
     
     	b1 = new JButton("grid_1");
     	b2 = new JButton("grid_2");
     	b3 = new JButton("grid_3");
     	b4 = new JButton("grid_4");
     	b5 = new JButton("grid_5");
     	b6 = new JButton("grid_6");
     
     	contentPane.add(b1);
     	contentPane.add(b2);
     	contentPane.add(b3);
     	contentPane.add(b4);
     	contentPane.add(b5);
     	contentPane.add(b6);
     
     	frame.pack();
     	frame.setVisible(true);
     	}
     }

    4.4执行结果


    5.CardLayout 布局管理器

    5.1总述

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

    5.2参考代码:

    import java.awt.*;
     import javax.swing.*;
     import java.awt.event.*;
     
     public class CardLayoutDemo extends MouseAdapter{
     	JPanel p1,p2,p3,p4,p5;
     	JLabel l1, l2, l3, l4, l5;
     
     	//declare a Cardlayout object
     	CardLayout myCard;
     	JFrame frame;
     	Container contentPane;
     
     	public static void main(String args[]){
     	CardLayoutDemo that = new CardLayoutDemo();
     	that.go();
     	System.out.println("test");
     	}
     
     	public void go(){
     	frame = new JFrame("Card Test");
     	contentPane = frame.getContentPane();
     	myCard = new CardLayout();
     
     	contentPane.setLayout(myCard);
     
     	p1=new JPanel();
     	p2 = new JPanel();
     	p3 = new JPanel();
     	p4 = new JPanel();
     	p5 = new JPanel();
     
     	//set the different bk color for each JPanel label
     	l1 =  new JLabel("This is the first JPanel");
     	p1.add(l1);
     	p1.setBackground(Color.yellow);
     
     	l2 =  new JLabel("This is the second JPanel");
     	p2.add(l2);
     	p2.setBackground(Color.green);
     
     	l3 =  new JLabel("This is the third JPanel");
     	p3.add(l3);
     	p3.setBackground(Color.magenta);
     
     	l4 =  new JLabel("This is the forth JPanel");
     	p4.add(l4);
     	p4.setBackground(Color.white);
     
     	l5 =  new JLabel("This is the fifth JPanel");
     	p5.add(l5);
     	p5.setBackground(Color.cyan);
     
     	//set mouseListener
     	p1.addMouseListener(this);
     	p2.addMouseListener(this);
     	p3.addMouseListener(this);
     	p4.addMouseListener(this);
     	p5.addMouseListener(this);
     
     	//set each JPanle as a Card to insert frame
     	contentPane.add(p1,"First");
     	contentPane.add(p2,"Sencond");
     	contentPane.add(p3,"Third");
     	contentPane.add(p4,"Forth");
     	contentPane.add(p5,"Fifth");
     
     	//display the first pic
     	myCard.show(contentPane,"First");
     	frame.setSize(300,200);
     	 frame.show();
     	}
     
     	public void mouseClicked(MouseEvent e){
     	myCard.next(contentPane);
     	}
     }

    5.2执行结果



    6.BoxLayout布局管理器

    6.1总述

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

    6.2构造函数

    BoxLayout(Container target, int axis)

    axis = BoxLayout.X_AXIS | BoxLayout.Y_AXIS

    6.3参考代码

    import java.awt.*;

     import javax.swing.*; 

     public class BoxLayoutDemo{

      private JFrame frame;

      private JPanel pv,ph; 

      public static void main(String args[]){ 

      BoxLayoutDemo that = new BoxLayoutDemo();

      that.go();

     

    public void go(){

      frame = new JFrame("Box Layout example"); 

      Container contentPane = frame.getContentPane();

       pv = new JPanel(); 

      pv.setLayout(new BoxLayout(pv,BoxLayout.Y_AXIS));

       pv.add(new JLabel("Monday"));

      pv.add(new JLabel("Tuesday")); 

      pv.add(new JLabel("Wednesday"));

      pv.add(new JLabel("Thursday"));

      pv.add(new JLabel("Friday")); 

      pv.add(new JLabel("Saturday")); 

      pv.add(new JLabel("Sunday"));   

    contentPane.add(pv,BorderLayout.CENTER);  

      ph  = new JPanel();  

    ph.setLayout(new BoxLayout(ph,BoxLayout.X_AXIS));  

      ph.add(new JButton("Yes"));

      ph.add(new JButton("No"));

      ph.add(new JButton("Cancle")); 

      contentPane.add(ph,BorderLayout.SOUTH);  

      frame.pack();

      frame.setVisible(true); 

     

    }


    6.4执行结果


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

    6.5.1创建实例的静态方法

    		public static Box createHorizontalBox()
     		public static Box createVerticalBox()

    6.5.2|6.3的代码,改写如下

    //the specific Box class for BoxLayout Container
     import java.awt.*;
     import javax.swing.*;
     
     public class BoxDemo{
     	private JFrame frame;
     	private Box bv,bh;
     
     	public static void main(String arg[]){
     		BoxDemo that = new BoxDemo();
     		that.go();
     	}
     	void go(){
     		frame = new JFrame("Box Layout example");
     		Container contentPane = frame.getContentPane();
     
     		bv = Box.createVerticalBox();
     
     		bv.add(new JLabel("Monday"));
     		bv.add(new JLabel("Tuesday"));
     		bv.add(new JLabel("Wednesday"));
     		bv.add(new JLabel("Thursday"));
     		bv.add(new JLabel("Friday"));
     		bv.add(new JLabel("Saturday"));
     		bv.add(new JLabel("Sunday"));
     
     		contentPane.add(bv,BorderLayout.CENTER);
     
     		bh = Box.createHorizontalBox();
     		bh.add(new JButton("Yes"));
     		bh.add(new JButton("No"));
     		bh.add(new JButton("Cancel"));
     
     		contentPane.add(bh,BorderLayout.SOUTH);
     
     		frame.setSize(300,200);
     		//frame.pack();
     		frame.setVisible(true);
     	}
     }

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

    	public static Component createHorizontalGlue()
     	public static Component createHorizontalStrut(int width)
     	public static Component createVerticalGlue()
     	public static Component createVerticalStrut(int height)
     	public static Component createRigidArea(Dimension d)

    6.6.1参考代码

    //to create invisible component
     import java.awt.*;
     import javax.swing.*;
     
     public class GlueAndStrut{
     	private JFrame frame;
     	private Box b1,b2,b3,b4;
     
     	public static void main(String args[]){
     		GlueAndStrut that = new GlueAndStrut();
     		that.go();
     	}
     	void go(){
     		frame = new JFrame("Glue And Strut");
     		Container contentPane = frame.getContentPane();
     		contentPane.setLayout(new GridLayout(4,1));
     
     		b1 = Box.createHorizontalBox();
     		b1.add(new JLabel("Box 1:"));
     		b1.add(new JButton("Yes"));
     		b1.add(new JButton("No"));
     		b1.add(new JButton("Cancel"));
     
     		b2 = Box.createHorizontalBox();
     		b2.add(new JLabel("Box 2:"));
     		b2.add(new JButton("Yes"));
     		b2.add(new JButton("No"));
     		b2.add(Box.createHorizontalGlue());
     		b2.add(new JButton("Cancel"));
     
     		b3 = Box.createHorizontalBox();
     		b3.add(new JLabel("Box 3:"));
     		b3.add(new JButton("Yes"));
     		b3.add(new JButton("No"));
     		b3.add(Box.createHorizontalStrut(20));
     		b3.add(new JButton("Cancel"));
     
     		b4 = Box.createHorizontalBox();
     		b4.add(new JLabel("Box 4:"));
     		b4.add(new JButton("Yes"));
     		b4.add(new JButton("No"));
     		b4.add(Box.createRigidArea(new Dimension(10,10)));
     		b4.add(new JButton("Cancel"));
     
     		contentPane.add(b1);
     		contentPane.add(b2);
     		contentPane.add(b3);
     		contentPane.add(b4);
     
     		frame.setSize(300,200);
     		frame.setVisible(true);
     	}
     }

    6.6.2执行结果

    7.不使用布局管理器

    7.1一般做法

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

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

    7.2参考代码

    import java.awt.*;
     import javax.swing.*;
     
     public class NullLayoutDemo{
     	private JFrame frame;
     	private JButton b1,b2,b3;
     
     	public static void main(String args[]){
     		NullLayoutDemo that = new NullLayoutDemo();
     		that.go();
     	}
     	private void go(){
     		frame = new JFrame("Null Layout Demo");
     		Container contentPane = frame.getContentPane();
     
     		//set the layout as null;	
     		contentPane.setLayout(null);
     
     		//add the buttons
     		b1 = new JButton("Yes");
     		contentPane.add(b1);
     		b2 = new JButton("No");
     		contentPane.add(b2);
     		b3 = new JButton("Cancel");
     		contentPane.add(b3);
     
     		//set the buttons' pos and size;
     		b1.setBounds(30,15,75,20);
     		b2.setBounds(150,15,75,50);
     		b3.setBounds(150,100,75,20);
     
     		frame.setSize(300,200);
     		frame.setVisible(true);
     	}
     }

    7.3执行结果



  • 文章声明
  • 作者:Owen
  • 出处: http://www.cnblogs.com/owenyang
  • 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该博客同步发在 HEXO-博客
查看全文
  • 相关阅读:
    在EasyDarwin进行实时视频转发的两种模式
    Windows服务中读取配置文件的方法
    reactor设计模式
    用Darwin实现流媒体转发程序(附源码)
    Windows服务中读取配置文件的方法
    c# 参数 this
    基于DSS的先侦听后推送式流媒体转发
    用live555做本地视频采集转发,附源码
    Darwin在转发流过程中对推送端断开的处理问题
    基于live555的流媒体代理转发服务器
  • 原文地址:https://www.cnblogs.com/owenyang/p/3579097.html
  • Copyright © 2011-2022 走看看