Swing程序设计.docx
《Swing程序设计.docx》由会员分享,可在线阅读,更多相关《Swing程序设计.docx(51页珍藏版)》请在冰豆网上搜索。
![Swing程序设计.docx](https://file1.bdocx.com/fileroot1/2023-1/24/e6b7a977-94da-450f-9d23-7f29a7b75711/e6b7a977-94da-450f-9d23-7f29a7b757111.gif)
Swing程序设计
第13章图形化用户界面(GUI)
Swing较早期版本中的AWT更为强大、性能更优良,Swing中除了保留AWT中几个重要的重量级组件之外,其他组件都为轻量级,这样使用Swing开发出的窗体风格会与当前运行平台上的窗体风格一致,同时程序员也可以在跨平台时指定窗体统一的风格与外观。
Swing的使用很复杂,本章主要讲解Swing中的基本要素,包括容器、组件、窗体布局、事件和监听器。
通过阅读本章,您可以:
●了解Swing组件
●掌握使用常用窗体
●掌握在标签上设置图标
●掌握应用程序中的布局管理器
●掌握常用面板
●掌握按钮组件
●掌握列表组件
●掌握文本组件
●学会常用事件监听器
一、图形化用户界面介绍
●Swing概述
原来的AWT组件来自java。
awt包,当含有AWT组件的Java应用程序在不同的平台上执行时,每个平台的GUI组件的显示会有所不同,但是在不同平台上运行使用Swing开发的应用程序时,就可以统一GUI组件的显示风格,因为Swing组件允许编程人员在跨平台时指定统一的外观和风格。
Swing组件通常被称为“轻量级组件",因为它完全由Java语言编写,而Java是不依赖于操作系统的语言,它可以在任何平台上运行;相反,依赖于本地平台的组件相应地被称为“重量级组件”,如AWT组件就是依赖本地平台的窗口系统来决定组件的功能、外观和风格.Swing主要具有以下特点:
轻量级组件
可插入外观组件
●组件(Component)
定义:
以图形化的方式显示在屏幕上的,和用户进行交互的对象,就叫组件;
组件包括:
菜单、标签、文本框、密码框、滚动条、单选按钮、复选框、按钮等等;
●容器(Container)
组件不能独立的显示出来,只能将组件放在容器里,才能正常的显示。
布局的定义:
将组件合理有序的排列和分布在容器中(包括组件的位置、大小);
●布局管理器(layoutmanager)
负责确定组件在容器中的位置和大小.
调用容器的setLayout(布局管理器对象)方法,为容器指定某种布局管理器的一个对象。
当容器需要定位组件和确定组件大小时,就会给布局管理器对象发消息,让它完成该项工作.
awt中常见的布局管理器有:
BorderLoyout(边界布局管理器)
简介:
分为北、南、东、西、中;
FlowLayout(流式布局管理器)
简介:
组件在一行中从左至右水平排列,排满后折行;
GridLayout(网格布局管理器)
简介:
以行和列的网格形式安排组件;
GridBagLayout布局管理器
简介:
更复杂、功能更强的网格布局;
CardLayout布局管理器
简介:
每一个组件作为一个卡片,容器仅显示多个卡片中的某一个;
二、JFrame容器(常用窗体)
知识点:
1、如何创建窗体
Swing组件的窗体通常与组件和容器相关,所以在JFrame对象创建完成后,需要调用getContentPane()方法将窗体转换为容器,然后在容器中添加组件或设置布局管理器。
通常,这个容器用来包含和显示组件。
如果需要将组件添加至容器,可以使用来自Container类的add()方法进行设置,也可以使用remove()方法将组件从容器中删除.
2、窗体的关闭方式
创建窗体后,需要给予窗体一个关闭方式,可以调用setDefaultCloseOperation()方法关闭窗体。
Java为窗体关闭提供了多种方式,常用的有以下4种:
●EXIT_ON_CLOSE表示退出应用程序默认窗口关闭;
●DO_NOTHING_ON_CLOSE表示什么都不做就将窗体关闭;
●DISPOSE_ON_CLOSE表示任何注册监听程序对象后会自动隐藏并释放窗体;
●HIDE_ON_CLOSE表示隐藏窗口的默认窗口关闭;
3、JDialog窗体
JDialog窗体是Swing组件中的对话框,它继承了AWT组件中java。
awt。
Dialog类.
功能:
从一个窗体中弹出另一个窗体,就像是在使用IE浏览器时弹出的确定对话框一样.JDialog窗体实质上就是另一种类型的窗体,它与JFrame窗体类似,在使用时也需要调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的特性。
例子:
importjavax。
swing.*;
publicclassTest{
publicstaticvoidmain(String[]args){
/*创建窗体*/
JFramejf=newJFrame();//创建窗体对象
jf.setTitle("用户界面”);//设置窗体标题
jf。
setSize(260,180);//设置窗体大小
jf。
setLocation(100,270);//设置窗体位置
jf。
setResizable(false);//设置窗体是否可以调整大小
jf。
setDefaultCloseOperation(JFrame。
EXIT_ON_CLOSE);//设置窗体关闭方式
jf。
setVisible(true);//设置窗体可见性
}
}
没有设置标题、大小的窗体:
设置标题、大小的窗体:
扩展:
1、设置组件的位置和大小的方法:
setBounds(intx,inty,intwidth,intheight)方法相当于:
setLocation(intx,inty)和setSize(intwidth,intheight)
2、将软件的位置Location设置为:
水平居中,垂直居中
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
setLocation((screenSize。
width-getWidth())/2,(screenSize.height—getHeight())/2);
三、标签组件与图标
●概述
在Swing中显示文本或提示信息的方法是使用标签,它支持文本字符串和图标。
在应用程序的用户界面中,一个简短的文本标签可以使用户知道这些组件的目的,所以标签在Swing中是比较常用的组件。
在本节中将探讨Swing标签的用法、如何创建标签,以及如何在标签上放置文本与图标。
●标签组件Jlabel
标签由JLabel类定义,标签可以显示一行只读文本、一个图像或带图像的文本,它并不能产生任何类型的事件,只是简单地显示文本与图片,但是可以使用标签的特性指定标签上文本的对齐方式。
●图标组件Icon
Swing中的图标可以放置在按钮、标签等组件上,用于描述组件的用途或装饰组件.图标可以用Java支持的图片文件类型进行创建,也可以使用java.awt.Graphics类提供的功能方法来创建.
●创建图标
在Swing中通过Icon接口来创建图标,可以在创建时给定图标的大小、颜色等特性。
如果使用Icon接口,必须实现Icon接口中的3个方法。
●例子
importjava。
awt。
*;
importjavax.swing。
*;
publicclassDrawIconimplementsIcon{
privateintwidth;
privateintheight;
publicvoidpaintIcon(Componentc,Graphicsg,intx,inty){
g。
fillOval(x,y,width,height);
}
publicintgetIconWidth(){
//TODO自动生成的方法存根
returnthis。
width;
}
publicintgetIconHeight(){
//TODO自动生成的方法存根
returnthis。
height;
}
publicDrawIcon(intwidth,intheight){
this.width=width;
this。
height=height;
}
publicstaticvoidmain(String[]args){
DrawIconicon=newDrawIcon(15,15);
JLabeljl1=newJLabel(”测试",icon,SwingConstants。
CENTER);
JFramejf=newJFrame();
Containerc=jf。
getContentPane();
c。
add(jl1);
jf。
setSize(200,200);
DimensionscreenSize=Toolkit。
getDefaultToolkit()。
getScreenSize();
jf.setLocation((screenSize.width—jf。
getWidth())/2,(screenSize。
height—jf。
getHeight())/2);
jf。
setResizable(false);
jf。
setDefaultCloseOperation(JFrame。
EXIT_ON_CLOSE);
jf。
setVisible(true);
}
}
●创建图片图标
Swing中的图标除了可以绘制之外,还可以使用某个特定的图片创建。
Swing利用javax.swing。
ImageIcon类根据现有图片创建图标,ImageIcon类实现了Icon接口,同时Java支持多种图片格式.
●例子
importjava。
awt。
*;
import。
URL;
importjavax.swing。
*;
publicclassTestextendsJFrame{
publicTest(){
Containerc=getContentPane();
JLabeljl=newJLabel(”这是一个JFrame窗体",SwingConstants.CENTER);
URLurl=Test.class。
getResource("imageButton。
jpg");
Iconicon=newImageIcon(url);
jl.setIcon(icon);//设置标签的图标
jl。
setHorizontalAlignment(SwingConstants.CENTER);//设置标签水平对齐方式
jl。
setOpaque(true);//设置标签为不透明状态
c。
add(jl);
setTitle(”图片图标”);
setSize(250,150);
DimensionscreenSize=Toolkit。
getDefaultToolkit()。
getScreenSize();
setLocation((screenSize.width—this。
getWidth())/2,(screenSize。
height-this。
getHeight())/2);//设置组件的位置为:
水平和垂直居中
setResizable(false);
setDefaultCloseOperation(JFrame。
EXIT_ON_CLOSE);
setVisible(true);
}
publicstaticvoidmain(String[]args){
newTest();
}
}
运行结果:
注意:
java。
lang。
Class类中的getResource()方法可以获取资源文件的URL路径.例子中该方法的参数是imageButton。
jpg,这个路径是相对于Test类文件的,所以可将图片文件与类文件放在同一个文件夹下。
四、常用布局管理器
●概述
Swing提供的常用布局管理器包括边界布局管理器、流式布局管理器、网格布局管理器.
●绝对布局
顾名思义,就是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式指定组件的位置.
使用绝对布局的步骤如下:
(1)使用Container.setLayout(null)方法取消布局管理器;
(2)使用Component.setBounds()方法设置每个组件的位置和大小;
●例子
importjava。
awt.*;
importjavax。
swing.*;
publicclassTestextendsJFrame{
/*声明组件*/
privateJButtonan1;
publicTest(Stringtitle){
Containerc=getContentPane();
c。
setLayout(null);
/*创建组件*/
an1=newJButton("确定");
an1.setSize(80,40);//设置按钮的大小,如果没有此语句,按钮将无法显示,因为它的大小为0;
/*添加组件*/
c。
add(an1);
/*设置窗体属性*/
setTitle(title);
setSize(200,150);
Dimensionscreensize=Toolkit。
getDefaultToolkit()。
getScreenSize();
setLocation((screensize。
width—this。
getWidth())/2,(screensize。
height—this。
getHeight())/2);
setResizable(false);
setDefaultCloseOperation(JFrame。
EXIT_ON_CLOSE);
setVisible(true);
}
publicstaticvoidmain(String[]args){
newTest(”绝对布局");
}
}
运行结果如下:
●边界布局管理器(BorderLayout)
在默认不指定窗体布局的情况下,Swing组件的布局模式是边界布局管理器。
边界布局管理器还可以将容器划分为东、西、南、北、中5个区域,可以将组件加入到这5个区域中。
容器调用Container类的add()方法添加组件时可以设置此组件在边界布局管理器中的区域,区域的控制可以由BorderLayout类中的成员变量来决定。
●格式
Containerc=this。
getContentPane();
c.setLayout(newBorderLayout());
c.add(newJButton(“确定”),BorderLayout。
EAST);//将确定按钮添加到容器的底部并填充
c.add(newJButton(“取消”));//将取消按钮添加到容器的中部并填充至个区域的边界
注意:
如果不是五个按钮全部添加,则会以扩充中部为主进行填充,但中部不会被其他四个填充.
●流式布局管理器(FlowLayout)
流式布局管理器是布局管理器中最基本的布局管理器.流式布局管理器在整个容器中的布局正如其名,像“流"一样从左到右摆放组件,直到占据了这一行的所有空间,然后再向下移动一行.默认情况下,组件在每一行上都是居中排列的,但是通过设置也可以更改组件在每一行上的排列位置。
●格式
Containerc=this.getContentPane();
c。
setLayout(newFlowLayout(2,10,10));//设置容器的布局管理器为流式布局管理器,采用右对齐方式摆放各组件;
●网格布局管理器(GridLayout)
网格布局管理器将容器划分为网格,所以组件可以按行和列进行排列。
在网格布局管理器中,每一个组件的大小都相同,并且网格中空格的个数由网格的行数和列数决定,如一个两行两列的网格能产生4个大小相等的网格.组件从网格的左上角开始,按照从左到右、从上到下的顺序加入到网格中,而且每一个组件都会填满整个网格,改变窗体的大小,组件的大小也会随之改变。
●格式
Containerc=this。
getContentPane();
c。
setLayout(newGridLayout(3,3,5,5));//设置容器的管理器为7行3列宽为5像素高为5像素的网格布局管理器;
拓展
●创建基本窗体的步骤:
1、导入swt和swing包;
2、继承Jframe类;
3、在类中定义组件;
4、在构造方法中创建组件;
5、在构造方法中添加组件;
6、设置窗体属性;
7、显示窗体;
8、在主函数中创建对象;
9、所有布局管理器都可以添加任意组件;
五、高级布局管理器
Swing还提供了一些高级布局管理器,如箱式布局管理器、卡片布局管理器、网格组布局管理器以及弹簧布局管理器,通过使用这些布局管理器,可以设计出更好、更适用的程序界面。
在讲解过程中为了便于读者理解,结合了大量的图例,还针对每个知识点进行了举例.
箱式布局管理器BoxLayout
箱式布局管理器用来管理一组水平或垂直排列的组件.如果是用来管理一组水平排列的组件,则称为水平箱;如果是用来管理一组垂直排列的组件,则称为垂直箱。
BoxLayout类仅提供了一个构造方法BoxLayout(Containertarget,intaxis),其入口参数target为要采用该布局方式的容器对象;入口参数axis为要采用的布局方式,如果将其设置为静态常量X_AXIS,表示创建一个水平箱,组件将从左到右排列,设置为静态常量Y_AXIS则表示创建一个垂直箱,组件将从上到下排列。
无论水平箱还是垂直箱,当将窗体调小至不能显示所有组件时,组件仍会排列在一行或一列,组件按照添加到容器中的先后顺序进行排列.
默认情况下,由箱式布局管理器实现的组件之间没有间距,如果要在组件之间设置间距,可以通过使用Box类提供的6个不可见组件实现,这些组件就是专门用来设置箱式布局管理器的.
六、常用面板
面板也是一个Swing容器,它可以作为容器容纳其他组件,但它也必须被添加到其他容器中。
Swing中常用的面板包括JPanel面板以及JScrollPane面板。
JPanel面板默认使用流式布局管理器,窗体默认使用边界布局管理器.
●例子
importjava。
awt.*;
importjavax。
swing。
*;
publicclassTestextendsJFrame{
/*定义组件*/
privateJPanelmb1,mb2;
privateJButtonan1,an2,an3,an4,an5;
publicstaticvoidmain(String[]args){
newTest();//创建本类对象
}
publicTest(){
Containerc=this.getContentPane();
/*创建组件*/
mb1=newJPanel();
mb2=newJPanel();
an1=newJButton(”苹果");an2=newJButton(”香蕉”);
an3=newJButton(”水果");
an4=newJButton(”白菜”);an5=newJButton("萝卜");
/*将组件添加到窗体中*/
mb1.add(an1);mb1。
add(an2);
mb2。
add(an4);mb2.add(an5);
c。
add(mb1,BorderLayout。
NORTH);
c.add(an3);
c.add(mb2,BorderLayout。
SOUTH);
/*设置窗体属性*/
this。
setTitle(”布局综合应用”);
this。
setSize(300,200);
DimensionscreenSize=Toolkit。
getDefaultToolkit()。
getScreenSize();
this。
setLocation((screenSize。
width—this。
getWidth())/2,(screenSize。
height—this。
getHeight())/2);
this.setResizable(false);
this。
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/*设置窗体可见性*/
this。
setVisible(true);
}
}
运行结果如下:
特别注意:
在窗体默认使用BorderLayout布局管理器时,请指明每个组件添加的位置,以免被覆盖。
●JscrollPane面板
在设置界面时,可能会遇到在一个较小的容器窗体中显示一个较大部分的内容的情况,这时可以使用JscrollPane面板.JscrollPane面板是带滚动条的面板,它也是一种容器,但是JscrollPane只能放置一个组件,并且不可以使用布局管理器.如果需要在JscrollPane面板中放置多个组件,需要将多个组件放置在JPanel面板上,然后将JPanel面板作为一个整体组件添加在JscrollPane组件上。
●例子
importjava。
awt。
*;
importjavax.swing.*;
publicclassTestextendsJFrame{
/*定义组件*/
privateJTextAreata;
privateJScrollPanemb1;
publicstaticvoidmain(String[]args){
newTest();//创建本类对象
}
publicTest(){
/*将窗体转化成容器*/
Containerc=this.getContentPane();
/*创建组件*/
ta=newJTextArea(”请输入内容”,20,50);
mb1=newJScrollPane(ta);
/*将组件添加到窗体容器中*/
c.add(mb1);
/*设置窗体属性*/
this.setTitle("滚动面板”);
this.setSize(200,200);
DimensionscreenSize=Toolkit。
getDefaultToolkit()。
getScreenSize();
this。
setLocation((screenSize。
width—this。
getWidth())/2,(screenSize.height—this。
getHeight())/2);
this.setResizable(false);
this。
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/*设置窗体可见性*/
this。
setVisible(true);
}
}
运行结果如下:
七、高级组件面板
●分割