第十三章 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
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(); } }