GUI基础概述.docx
- 文档编号:29556691
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:42
- 大小:180.74KB
GUI基础概述.docx
《GUI基础概述.docx》由会员分享,可在线阅读,更多相关《GUI基础概述.docx(42页珍藏版)》请在冰豆网上搜索。
GUI基础概述
目前,大多数软件都是图形用户界面(GraphicsUserInterface,简称GUI)的,并且程序的运行是靠事件驱动(event-driven)的。
这样的应用程序可以使用户很方便地与程序进行交互。
本章主要介绍使用Java开发图形用户界面程序的方法,其中包括容器和布局管理器,另外还将介绍Java小程序的开发以及图形绘制等内容。
JavaGUI基础
1.1概述
图1就是一个图形用户界面的应用程序,其中包含的图形界面元素有窗口、菜单、工具栏、按钮、选项卡等。
该程序是JDK自带的演示程序,通过运行jdk_install\demo\jfc\swingset2.html或jdk_install\demo\jfc\SwingSet2\SwingSet2.jar程序可以得到该界面,这里jdk_install是JDK的安装目录。
图1GUI演示程序
在Java1.2之前,Java提供了一个AWT类库,Sun把它叫做抽象窗口工具箱(AbstractWindowToolkit,简称AWT)。
为了开发GUI程序,程序员需要使用该库中有关的类,它为程序员提供了构建GUI程序的组件,如Frame、Button、Label等。
这些组件是通过java.awt包提供的。
AWT最初是为设计小应用程序界面而开发的。
由于AWT存在严重缺陷,Sun从Java1.2版开始提供了一个新的组件库Swing。
Swing可以说是第二代GUI开发工具集,它是通过javax.swing包提供的,javax.swing包也是Java基础类库(JavaFoundationClasses,JFC)的组成部分。
由于Swing组件比AWT组件有许多优点,所以新开发的程序应该使用Swing组件而不应该再使用AWT组件。
但是,要注意Swing组件并没有完全取代AWT,它只是替代了AWT包中的图形用户界面组件(如Button、TextFiels、TextArea等),AWT中的一些辅助类(如Graphics、Color、Font、LayoutManager等)仍然保持不变。
另外,Swing仍然使用AWT的事件模型。
1.2Swing组件简介
javax.swing包中提供了新的用于创建图形用户界面的组件,因为这些组件的实现是完全独立于平台的,因此通常被称为“轻量级”组件,而AWT组件被称为“重量级”组件。
Swing提供了更多的组件,功能更强大,不仅能够开发开发功能强大的应用程序界面,也能够开发小应用程序界面。
原来在AWT包中的大部分组件名称在Swing包中都以大写字母J开头的,如AWT中按钮类为Button,在Swing中按钮类为JButton。
除此之外,AWT组件在java.awt包中,Swing组件在javax.swing包中。
在开发新的图形用户界面的程序时,AWT组件和Swing组件不能混合使用。
1.组件及层次
在Java语言中,与图形用户界面相关的包有多个,其中比较重要的有java.awt包、java.awt.event包、javax.swing包。
图2给出了有关包中常用的类及类的层次结构。
图2JavaGUI所用类的层次结构图
图2中Applet类在java.applet包中,以J开头的类在javax.swing包中,其他类在java.awt包中。
下面简单介绍其中常用的类。
Component组件类:
它是所有图形用户界面类的父类。
Container容器类:
它是Component类的一个子类,是一种可以容纳其他组件和容器的组件。
Container类的子类都是容器,有三个常用的子类容器:
Panel、Window、JComponent。
JComponent轻量组件类:
它是所有轻量组5件类的父类,它的子类都在javax.swing包中,如JButton、JLabel、JMenu、JRadioButton、JList、JTextField、JTextArea、JscrollPane等。
Graphics图形类:
它是一个抽象类,它提供了在容器中绘制字符串和简单图形的图形环境。
Color颜色类:
这个类用来处理图形和组件的颜色。
例如,可以为JFrame、JPanel等组件指定背景色和前景色,也可以指定绘制的线条、图形和字符串的颜色。
Font字体类:
在使用绘图对象绘制字符串时可以指定字体,其中包括字体、字型和大小。
JApplet小应用程序类:
它是Applet类的子类,创建基于Swing的Java小应用程序需要继承JApplet类。
JFrame框架窗口类:
它是一个顶级窗口。
在Java图形应用程序中,它是包含其他Swing组件的最外层容器。
JDialog对话框类:
它是一个弹出式对话框,一般用来接收用户的输入和显示有关信息。
在基于Swing的设计中,JComponent类是非常重要的类。
它是所有轻量级组件的根类。
图3是JComponent类及其子类的类层次结构图:
图3JComponent及其子类的层次结构
上图中JTextComponent类在javax.swing.text包中,而其它子类都在javax.swing包中。
关于这些类的使用,将在后续章节中详细介绍。
2.组件分类
上述这些组件按功能大致可以分为三类:
∙容器组件:
容器组件又可以分为三类:
①顶层容器:
包括JFrame、JApplet、JDialog;②通用容器:
包括JPanel、JScrollPane、JSplitPane、JTabbedPane、JToolBar;③专用容器:
包括JInternalFrame、JLayeredPane、JRootPane等。
∙基本组件:
基本组件包括JButton、JTextField、JComboBox、JList、JMenu、JSlider等。
这些组件有的主要用于信息的显示,如JLabel、JProgressBar、JToolTip等,有的可以在其中编辑信息,如JTextArea、JtextField、JFileChooser、JColorChooser、JTable、JTree等。
∙菜单组件:
菜单组件包括JMenuBar、JMenu、JMenuItem、JRadioButtonMenuItem、JCheckBoxMenuItem和JPopupMenu等。
这些组件主要用于构建各种菜单。
1.3JComponent类和Container类的常用方法
本节主要介绍常用组件和容器的操作方法。
1.JComponent类及其方法
JComponent抽象类是所有Swing组件的父类,其中定义了每个组件都可以使用的方法,常用的方法有:
∙publicvoidsetSize(intwidth,intheight)设置组件或容器的大小。
∙publicvoidsetVisible(booleanb)设置组件或容器是否可见。
∙publicvoidsetBackground(Colorc)设置组件的背景颜色,Color为颜色类。
∙publicColorgetBackground()返回组件的背景颜色,Color为颜色类。
∙publicvoidsetForeground(Colorc)设置组件的前景颜色。
∙publicColorgetForeground()返回组件的前景颜色。
∙publicvoidsetFont(Fontf)设置组件上使用的字体,Font为字体类。
∙publicFontgetFont()返回组件上使用的字体。
∙publicGraphicsgetGraphics()返回组件的图形上下文(graphicscontext)或绘图对象,Graphics为图形上下文类,使用该类对象可以在组件上绘制图形。
∙publicvoidsetToolTipText(Stringtext)设置组件上的提示信息。
∙publicStringgetToolTipText()返回组件上的提示信息。
2.Container类及其方法
Container类是所有容器类的父类,在编写GUI程序时经常要使用这个类的方法。
容器组件的特点是:
容器中可以容纳其他组件,通过调用容器的add()方法把其他组件添加到容器中。
添加到容器中的组件位置和大小由容器的布局管理器决定(LayoutManager)。
如果需要手工控制组件在容器中的大小和位置,应该将容器的布局管理器设置为null,即调用容器的setLayout()方法,并将参数指定为null,然后调用组件的setLocation()方法设置组件在容器中的位置、调用setSize()或setBounds()方法设置组件的大小。
Container类中的常用方法:
∙publicComponentadd(Componentcomp)
∙publicComponentadd(Componentcomp,intindex)
向容器中添加组件,index参数指定组件添加到容器中的位置,无index参数则添加到默认位置。
∙publicvoidremove(Componentcomp)从容器中清除指定的组件。
∙publicvoidsetLayout(LayoutManagermgr)设置容器的布局。
参数mgr是布局管理器对象,它决定组件在容器中如何摆放。
∙publicvoidpaint(Graphicsg)在容器上绘制图形。
∙publicvoidpaintComponents(Graphicsg)在容器上绘制图形。
∙publicvoidupdate(Graphicsg)更新容器上绘制的图形。
1.4简单的框架窗口
1.创建简单的框架窗口
每个使用SwingGUI的程序必须至少有一个顶层Swing容器。
对于GUI应用程序来说,一般应该有一个主窗口,也称为框架窗口。
在Swing中,框架窗口是由JFrame对象实现的。
JFrame类常用的构造方法有:
∙publicJFrame()创建一个没有标题的窗口对象。
∙publicJFrame(Stringtitle)创建一个以title为标题的窗口对象。
下面的程序创建了一个空的框架窗口。
程序SimpleFrame.java
importjavax.swing.*;
publicclassSimpleFrame{
publicstaticvoidmain(Stringargs[]){
JFrameframe=newJFrame("SimpleFrame");
frame.setSize(400,240);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
_____________________________________________________________________________▃
程序中使用JFrame类的构造方法创建一个框架窗口对象frame。
由于新创建的JFrame对象的大小是0×0像素的,所以使用组件类的setSize()方法将窗口对象frame的大小设置为400×200像素。
框架创建之后是不可见的,因此还使用了语句setVisible()方法将框架设置为可见。
setSize()和setVisible()方法都是定义在Component类中的,所以JFrame类可以继承它们。
最后程序调用了JFrame类的setDefaultCloseOperation()方法,该方法的功能是当用户点击窗口的关闭按钮时结束程序的运行,参数JFrame.EXIT_ON_CLOSE是JFrame类中定义的常量。
程序运行结果如图4所示:
图4最简单的框架窗口
从图4中可以看到,框架窗口具有边框、标题栏、最大化按钮、最小化按钮以及关闭按钮。
如果使用早期平台,关闭窗口可以通过注册监听器实现。
下面是用匿名内部类实现的监听器:
frame.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
用该段程序替换上面一行程序,效果相同。
2.继承JFrame类
在上面程序中创建的窗口是在main()方法中创建了一个JFrame对象,然后设置大小并显示了该窗口。
一切都是在main()方法内完成的。
这在创建比较简单的窗口时还可以,如果窗口比较复杂,就会使得main()方法的内容过多。
因此,一般应该创建一个继承JFrame类的子类,然后编写程序创建该类对象。
程序SimpleFrame.java
importjavax.swing.*;
publicclassSimpleFrameextendsJFrame{
publicSimpleFrame(){
this("SimpleFrame");
}
publicSimpleFrame(Stringtitle){
super(title);
setSize(400,250);
setLocation(350,250);//设置窗口显示位置
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
publicstaticvoidmain(Stringargs[]){
SimpleFrameframe=newSimpleFrame();
}
}
_____________________________________________________________________________▃
SimpleFrame类继承了JFrame类,在其构造方法中创建用户界面。
程序中setLocation()方法设置窗口在屏幕中显示的左上角位置。
3.框架窗口居中
默认情况下,程序运行时框架显示在屏幕的左上角。
要指定框架在屏幕上的显示位置,需要使用JFrame类中的setLocation(x,y)方法,该方法把框架的左上角放置在屏幕的(x,y)处。
如果要把框架放置在屏幕的中央位置,需要知道屏幕和框架的宽和高,以便确定框架左上角在屏幕上的坐标。
屏幕的宽和高可以由java.awt.Toolkit类得到。
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
intscreenWidth=screenSize.width;
intscreenHeight=screenSize.height;
在用下面方法得到框架的大小,然后可计算得到框架居中的左上角坐标x和y的值。
DimensionframeSize=frame.getSize();
intx=(screenWidth-frameSize.width)/2;
inty=(screenheight-frameSize.height)/2;
最后再调用frame的setLocation()方法设置框架的左上角位置。
frame.setLocation(x,y);
完整的程序如下所示:
程序CenterFrame.java
importjava.awt.*;
importjavax.swing.*;
publicclassCenterFrame{
publicstaticvoidmain(Stringargs[]){
JFrameframe=newJFrame("SimpleFrame");
frame.setSize(400,250);
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
intscreenWidth=screenSize.width;
intscreenHeight=screenSize.height;
DimensionframeSize=frame.getSize();
intx=(screenWidth-frameSize.width)/2;
inty=(screenHeight-frameSize.height)/2;
frame.setLocation(x,y);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
_____________________________________________________________________________▃
该程序运行后,框架窗口显示在屏幕的中央。
1.5在框架中添加组件
实际上JFrame对象是由多个窗格组成的,如图5所示。
要向框架中添加组件,必须先获得框架的内容窗格(contentpane)对象,然后将组件添加到内容窗格对象上。
向框架窗口中添加组件有两种方法:
(1)调用JFrame类的getContentPane()方法获得框架的内容窗格对象,它是Container类的对象,然后调用内容窗格对象的add()方法将组件添加到内容窗格中,代码如下所示:
ContainercontentPane=getContentPane();
contentPane.add(newJButton("OK"));
(2)建立一个JPanel类的中间容器,把组件添加到中间容器中,再用顶层容器的setContentPane(ContainercontentPane)方法将中间容器设置为顶层容器的内容窗格,代码如下所示:
JPanelpanel=newJPanel()
panel.add(newJButton("OK"));
frame.setContentPane(panel)
无论使用哪种方法,都要注意容器采用什么布局管理器,并根据需要设置正确的布局管理器。
例如下面程序实现在窗口中添加两个按钮,内容窗格采用流式布局管理器。
程序FrameWithButton.java
importjava.awt.*;
importjavax.swing.*;
publicclassFrameWithButtonextendsJFrame{
JButtonjButton1,jButton2;
Containercp=null;
publicFrameWithButton(){
this("FrameWithButton");
}
publicFrameWithButton(Stringtitle){
super(title);
jButton1=newJButton("OK");
jButton2=newJButton("Cancel");
cp=getContentPane();
FlowLayoutlayout=newFlowLayout();
cp.setLayout(layout);
cp.add(jButton1);
cp.add(jButton2);
setSize(400,300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
publicstaticvoidmain(String[]args){
JFrameframe=newFrameWithButton("FrameWithButton");
}
}
_____________________________________________________________________________▃
程序的运行结果如图6所示。
图6程序FrameWithButton的运行结果
从程序的运行结果看,两个按钮被添加到框架窗口中。
请试着将程序中加黑的两行去掉,再重新编译并运行该程序,看结果如何,为什么?
布局管理器
在许多其他窗口系统中,组件在窗口中的放置是通过硬编码实现的,即通过指定组件在窗口中的绝对位置来对组件布局,如将一个按钮放置在窗口坐标的(10,10)处。
使用硬编码的方法,用户界面可能在一个系统下显示正常,而在其他系统下显示不正常。
Java语言的一个特点是强调程序的平台无关性。
对于图形用户界面同样是这样。
在Java的图形界面程序中,它是通过为每种容器提供了布局管理器来实现组件布局的。
所谓布局管理器就是为容器设置一个LayoutManager对象(这个对象就是布局管理器对象),由它来管理组件在容器中摆放的顺序、位置、大小以及当窗口大小改变后组件如何变化等特征。
通过使用布局管理器机制就可以实现GUI的跨平台性,同时避免为每个组件设置绝对位置。
常用的布局管理器有:
FlowLayout、BorderLayout、GridLayout、CardLayout和GridBagLayout,这些类都是在java.awt包中定义的。
每种容器都有默认的布局管理器,也可以为容器指定新的布局管理器。
可以使用容器的方法setLayout(LayoutManagerlayout)设置容器的布局。
其中参数LayoutManager是接口,LayoutManager2是它的子接口。
下面分别介绍以上几种常用的布局管理器在图形化用户界面中的应用。
2.1BorderLayout布局管理器
BorderLayout布局也叫边界式布局,它将容器分成东、南、西、北、中五个区域,每个区域可放置一个组件或其他容器。
北占据容器的上方,东占据容器的右侧,等等。
中间区域是在东、南、西、北都填满后剩下的区域。
BorderLayout布局管理器的构造方法有:
∙publicBorderLayout(inthgap,intvgap)该构造方法创建一个布局管理器对象,hgap和vgap分别指定使用这种布局时组件之间的水平间隔和垂直间隔距离,单位为像素。
∙publicBorderLayout()该构造方法创建一个BorderLayout布局管理器对象,使用这种布局时组件之间没有间隔。
向BorderLayout布局的容器中添加组件应该使用add(Componentc,intindex)方法,c为添加的组件,index为指定的位置。
指定位置需要使用BorderLayout类定义的五个常量:
BorderLayout.NORTH、BorderLayout.SOUTH、BorderLayout.EAST、BorderLayout.WEST、BorderLayout.CENTER。
如果不指定位置,组件添加到中央位置。
若要改变容器的布局管理器须调用容器的setLayout()方法,它的格式为:
∙publicvoidsetLayout(LayoutManagerlayout)
下面的程序演示了BorderLayout布局的使用:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GUI 基础 概述