《Java从入门到精通》第十三章学习笔记

第十三章 Swing程序设计

一、Swing概述

Swing是GUI(图形用户界面Graphic User Interface)开发工具包,在AWT(抽象窗口工具 Abstract Windows Tool)的基础上使开发跨平台的Java应用程序界面成为可能。使用Swing开发的Java程序,其界面是不受本地系统平台限制的。

二、Swing常用窗体

1、JFrame框架窗体

JFrame窗体是一个容器,它是Swing程序中各个组建的载体,可以通过继承java,swing.JFrame类创建一个窗体,在这个窗体中添加组建,同时为各个组建设置事件(方法)。

1 JFrame jf=new JFrame(title);        //创建一个标题栏内容为title字符串的JFrame窗体
2 Container container=jf.getContentPane();      
3 //通过jf的getContentPan()方法为jf窗体对象转换成一个Container类的容器对象
4 //对于这个容器,可以通过add()方法为其添加组件,也可以通过remove()方法移除组件
import java.awt.Color;
import java.awt.Container;

import javax.swing.*;

public class Example  {

    public void CreateJFrame(String title){             
        JFrame jf=new JFrame(title);                //实例化一个JFrame对象
        Container container=jf.getContentPane();    //获取jf的一个容器
        JLabel jl=new JLabel("这是一个JFRAME窗体");        //创建一个标签
        jl.setHorizontalAlignment(SwingConstants.CENTER);    //设置标签文字居中
        container.add(jl);                    //把标签添加到容器中
        container.setBackground(Color.gray);    //设置容器背景颜色
        jf.setVisible(true);        //设置窗体是否可见
        jf.setSize(200,150);         //设置窗体尺寸
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);     //设置窗体关闭方法
    }
    
    public static void main(String args[]){
        new Example().CreateJFrame("创建一个JFrame窗体");
    }
}

2、JDialog窗体:是Swing组件中的对话框,继承了AWT组件中的java.awt.Dialog类。其功能是从一个窗体中弹出另一个窗体,JDialog窗体在使用时需要调用getContentPane()方法将其转换为容器,然后在容器中设置相关特性。一般使用如下构造方法:

public JDialog();   //创建一个没有标题和父窗体的对话框
public JDialog(Frame f);  //创建一个指定父窗体的对话框,没有标题
public JDialog(Frame f,boolean model);  //创建一个指定类型的对话框,并指定父窗体,没有标题
public JDialog(Frame f,String title);  //创建一个父窗体为f标题栏内容为title的对话框
public JDialog(Frame f,String title,boolean model);//创建一个指定标题、父窗体和指定类型的对话框
 1 import java.awt.*;
 2 import java.awt.event.*;
 3 
 4 import javax.swing.*;
 5 public class Example extends JDialog{
 6     public Example(){
 7         //实例化一个JDialog类对象,指定父窗体,标题和类型
 8         super(new MyFrame(),"第一个JDialog窗体",true);
 9         Container container=getContentPane();        //创建一个容器
10         container.add(new JLabel("这是一个对话框"));        //在容器中添加标签
11         setSize(100,100);            //设置对话框窗体大小        
12     }
13     public static void main(String[] args){
14         new Example();
15     }
16 }
17 class MyFrame extends JFrame{        //创建新类
18     public MyFrame(){
19         Container container=getContentPane();        //创建一个容器
20         container.setLayout(null);
21         JLabel jl=new JLabel("这是一个JFrame窗体");                    //在窗体中设置标签
22         jl.setHorizontalAlignment(SwingConstants.CENTER);        //标签文字设置居中
23         container.add(jl);
24         JButton bl=new JButton("弹出对话框");            //定义一个按钮
25         bl.setBounds(10,10,100,21);
26         bl.addActionListener(new ActionListener() {        //为按钮添加鼠标单机事件
27             public void actionPerformed(ActionEvent e) {
28                 new Example().setVisible(true);     //使MyJDialog窗体可见
29             }
30         });
31         container.add(bl);      //添加按钮到容器中
32     }
33 }

3、标签组件与图标
(1)标签的使用:Java中由JLabel类定义标签,父类为JComponent类。一般只显示一行只读文本,一个图像或带图像的文本,并不能产生任何事件,仅仅单纯显示文本和图片。

public JLabel();    //创建一个不带图标和文本的标签对象
public JLabel(Icon icon);    //创建一个带图标的JLabel对象
public JLabel(Icon icon,int alignment);  //创建一个带图标的JLabel对象,并设置图标水平对齐方式
public JLabel(String string,int alignment);  //创建一个带文本的JLabeil对象,并设置文字水平对齐方式
public JLabel(String string,Icon icon,int alignment);  //创建一个带文本和图标的JLabeil对象,并设置标签内容水平对齐方式

 (2)图标的使用:Swing中的图标可以设置在按钮、标签等组件上。

//图标的创建方式,可以通过Icon接口来创建,如果使用该接口,必须实现接口中的三个方法:
public int getIconHeight();
public int getIconWidth();
public void paintIcon(Compent arg0,Graphics arg1,int arg2,int arg3);
 1 import java.awt.*;
 2 import javax.swing.*;
 3 public class DrawIcon implements Icon {
 4     private int width;
 5     private int height;
 6     public int getIconWidth(){
 7         return this.width;
 8     }
 9     public int getIconHeight(){
10         return this.height;
11     }
12     public DrawIcon(int width,int height){
13         this.width=width;
14         this.height=height;                
15     }
16     public void paintIcon(Component arg0,Graphics arg1,int x,int y){
17         arg1.fillOval(x,y,width,height);
18     }
19 
20     public static void main(String[] args) {
21         DrawIcon icon=new DrawIcon(15, 15);
22         
23         //创建一个标签,并设置标签上的文字居中
24         JLabel jl=new JLabel("Test",icon,SwingConstants.CENTER);
25         JFrame jf=new JFrame();
26         Container c=jf.getContentPane();
27     }
28 
29 }

上述通过绘制方法创建图标,也可以使用图片创建,Swing通过javax.swing.ImageIcon类根据图片实现图标,ImageIcon类实现了Icon接口。

import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;
import java.net.URL;

import javax.swing.*;
public class MyImageIcon extends JFrame{
    public MyImageIcon(){
        Container container=getContentPane();
        JLabel jl=new JLabel("这是一个JFrame窗体",JLabel.CENTER);
        URL url=MyImageIcon.class.getResource("1.jpg");
        ImageIcon icon=new ImageIcon(url);
        jl.setIcon(icon);
        jl.setHorizontalAlignment(SwingConstants.CENTER);
        jl.setOpaque(true);         //设置标签不透明
        container.add(jl);
        setSize(250,100);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new MyImageIcon();

    }

}

 三、常用布局管理器

Swing提供的常用布局管理器包括流布局管理器、边界布局管理器、网格布局管理器。除使用布局管理器之外也可以使用绝对布局。

1、绝对布局:即明确指定组件在容器中的位置和大小,步骤如下:

使用Container.setLayout(null)先取消使用布局管理器;再使用Component.setBounds()方法设置每个组件的大小和位置。

import java.awt.Container;
import javax.swing.*;
public class AbsolutePosition extends JFrame {
    public AbsolutePosition(){
        setTitle("本窗体使用绝对布局");
        setLayout(null);        //使该窗体取消布局管理器设置
        setBounds(0,0,200,150);        //绝对定位窗体的位置和大小
        Container c=getContentPane();        //创建容器对象
        JButton b1=new JButton("按钮1");
        JButton b2=new JButton("按钮2");
        b1.setBounds(100,30,80,30);         //设置按钮的位置和大小
        b2.setBounds(60,70,100,20);
        c.add(b1);
        c.add(b2);
        setVisible(true);        //使窗体可见
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);    //设置窗体关闭方式
    }
    public static void main(String[] agrs){
        new AbsolutePosition();
    }
    

}

2、流(FlowLayout)布局管理器:是布局管理器中最基本的布局管理器,像“流”一样从左到右摆放各个组件,直到占据了这一行的所有空间,然后再向下移动一行。默认情况下,组件在每一行都是居中排列,但这个也可以通过设置更改。常用构造方法如下:
public FlowLayout();

public FlowLayout(int alignment);

public FlowLayout(int alignment,int horizGap,int vertGap);

构造方法中的alignment参数表示组件在每一行的具体摆放位置,具体可以被赋予三个值:FlowLayout.LEFT=0;FlowLayout.CENTER=1;FlowLayout.RIGHT=2;分别对应左对齐、居中、右对齐。

horizGap和vertGap分别对应以像素为单位的各组件之间的水平间隔与垂直间隔。

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.LayoutManager;

import javax.swing.*;

public class FlowLayoutPosition extends JFrame {
    public FlowLayoutPosition(){
        setTitle("本窗体采用流布局管理器");
        Container c=getContentPane();
        //设置窗体使用流布局管理器,使组件用右对齐方式排列,并设置水平间隔10px,垂直间隔10px
        setLayout(new FlowLayout(0,10,10));  //书上代码,为何不行?
        for(int i=0;i<10;i++){
            c.add(new JButton("button"+i));
        }
        setSize(300,200);
        setVisible(true);        //使窗体可见
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    
    public static void main(String[] agrs){
        new FlowLayoutPosition();
    }

}

3、边界布局管理:该布局是窗体的默认布局管理器。一般边界布局管理器可以把容器划分为东西南北中五个区域,容器在使用add()方法时可以设置该添加组件在容器中的设置区域。

import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;


public class BorderLayoutPosition extends JFrame {
    String[] border={"Center","North","South","West","East"};
    String[] buttonName={"center button","north button","south button","west button","east button"};
    public BorderLayoutPosition(){
        setTitle("XXX");
        Container c=getContentPane();
        setLayout(new BorderLayout(5,5));
        for(int i=0;i<border.length;i++){
            c.add(border[i],new JButton(buttonName[i]));
        }
        setSize(350,200);
        setVisible(true);        //使窗体可见
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    
    public static void main(String[] agrs){
        new BorderLayoutPosition();
    }


}

4、网格布局管理器:组件按行和列进行布置,每个组件大小都相同,并且填满整个网格,网格和组件的大小随窗体而编号。

import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;


public class GridLayoutPositon extends JFrame {
    public GridLayoutPositon(){
        setTitle("网格布局");
        Container c=getContentPane();
        setLayout(new GridLayout(3,5));    //设置网格为3*5
        for(int i=0;i<19;i++){
            c.add(new JButton("button"+i));
        }
        setSize(300,300);
        setVisible(true);        //使窗体可见
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    
    public static void main(String[] agrs){
        new GridLayoutPositon();
    }
}