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