Java+GUI.docx
- 文档编号:15737160
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:16
- 大小:167.47KB
Java+GUI.docx
《Java+GUI.docx》由会员分享,可在线阅读,更多相关《Java+GUI.docx(16页珍藏版)》请在冰点文库上搜索。
Java+GUI
第8章:
图形程序设计入门
学习目标
♦描述java图形程序设计类的层次结构
♦使用框架、面板和简单用户界面GUI组件
♦布局管理器
–使用FlowLayout,GridLayout,BorderLayout管理器
♦在面板上绘制组件
–paintComponent方法
♦
♦熟悉Colors,Fonts,andFontMetrics类
♦绘制几何图形
♦理解事件驱动程序设计的概念
–事件源,监听器和监听接口ListenerInterface
早期的Java图形界面设计采用AWT组件:
♦现代的程序中,图形化的使用者接口(GUI)相当重要,良好的GUI可以让程序更具吸引力、更好操作、更容易学习。
虽然Java早就有AWT,可以用来设计GUI,但是AWT有两大缺失:
♦AWT只提供最基本的组件(比方说:
按钮、滚动条等),而不提供TreeView等现代化GUI组件。
更糟的是,AWT的组件还只提供最基本的功能,比方说:
按钮上面只能出现文字,不能出现图形。
(当然,你也可以利用继承的方式来设计出图文兼容的按钮,但这还要花不少额外的时间。
)
♦不能跨平台:
AWT透过「同位体系统(peersystem)」来和操作系统沟通。
比方说:
如果你建立一个按钮(Button)对象,就会有一个按钮同位体(ButtonPeer)对象被建立,此按钮同位体对象会请底层的操作系统建立一个真正的按钮。
如果此程序是在Windows98上执行,所建立的按钮自然是Windows98的按钮。
AWT组件的外观就会受到底层操作系统的影响。
目前更流行的是Swing组件:
♦Swing是由Sun公司研发设计。
有了Swing,上述的问题都迎刃而解。
Swing不但填补了JavaGUI不能跨平台的缺点,也提供许多新的组件,可以用来组合出复杂的用户界面,除此之外,Swing也为Java注入新的特色,支持包括了拖放功能(drag-and-drop)、复原(undo)、并允许使用者改变GUI的外观(lookandfeel)。
Swing组件都是「轻量级的(lightweight)」。
♦Swing是一个带有丰富组件的GUI工具包,它组成了JFC(JavaFoundationClass)的用户界面功能的核心部分,它不仅是AWT所提供的组件的替代品,并且在这些组件的基础上有了很大进步。
Swing都是100%纯Java的,不依赖具体的Windows系统,可以在各种平台上实现。
Swing包含了250多个类,提供了40多个组件,是AWT组件的四倍,Swing还提供了大量有助于开发GUI界面所需的附加组件,它们都定义在javax.swing扩展包中。
为了和原来的java.awt包区别开来,SUN专门为Swing设置了扩展包(javax.swing),并规定所有的Swing组件都是以字母“J”开头,如JLable、JButton、JTextField等,以示和AWT组件进行区别。
♦Swing组件不能取代AWT组件,因为Swing是架构在AWT之上的,没有AWT就没有Swing。
它只能替代AWT的用户界面组件,辅助类仍保持不变,并且仍然使用AWT的事件模型。
图形程序设计所用类层次结构(Swing)
♦
图形类可以分为三组:
容器类、组件类和辅助类。
♦容器类:
如Jframe、Jpanel和Japplet等,用来包含其他组件。
容器是图形用户界面中容纳其他组件的部分,一个容器中可以容纳一个或多个组件,甚至还可以容纳其他容器。
♦组件类:
如JButton、JTextField、JTextArea、JComboBox、JList、JRadioButton、JMenu等,都是JComponent类的子类。
组件通常为图形用户界面中的可见部分,例如按钮和标签等。
通过add()方法可以将组件加入容器并显示出来。
♦辅助类:
如Color、Font、FontMetrics、Dimension和LayoutManager等,是组件和容器用于绘制和放置对象的。
JComponent
框架
♦框架是一个不被其它窗体所包含的独立的窗体,是在java的图形化应用中容纳其它用户接口组件的基本单位。
♦Frame类是用来创建一个窗体的。
UI(用户接口组件)
♦要创建一个用户界面,需要创建一个框架或applet来存放用户界面组件。
♦框架或applet可以包含菜单、面板和用户界面组件。
面板用于分组存放用户界面组件,还可以存放其他面板。
创建框架
♦下面两个构造方法用来创建Jframe对象:
●publicJFrame()
声明并创建一个没有标题的Jframe对象。
●publicJFrame(Stringtitle)
声明并创建一个指定标题的Jframe对象。
♦源程序:
MyFrame.java
♦注意:
为使之在JDK1.2中运行,需注释掉EXIT_ON_CLOSE相关的语句。
框架居中
♦默认情况下,窗体将显示在显示器的左上角为了让框架显示在指定位置,须用JFrame类中的setLocation(x,y)方法。
♦要把框架放在屏幕上居中的位置,需要知道屏幕和框架的宽和高。
♦屏幕的宽和高可由java.awt.Toolkit类得到:
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
intscreenWidth=screenSize.width;
intScreenHeight=screenSize.height;
♦框架的宽和高可由Component类中的getSize方法得到:
DimensionframeSize=frame.getSize();
intframeWidth=frameSize.width;
intframeHeight=frameSize.height;
在框架中添加组件
♦使用add方法可以在框架的内容窗格中添加组件:
//在框架中添加一个Button组件
frame.getContentPane().add(newJButton("OK"));
♦源程序:
MyFrameWithComponents.java
布局管理器
♦Java的布局管理器提供了一层抽象,自动把用户界面映射到所有的窗口系统。
♦Java的GUI组件放在容器中放置。
这些GUI组件由容器的布局管理器来安排位置。
前面的程序中并没有指定”OK”按钮在框架中的放置位置,但Java知道该把按钮放在哪里,因为在后台工作的布局管理器能够将组件放到正确的位置。
默认情况下,Jframe的内容窗格默认的布局管理器是BorderLayout。
♦布局管理器设置在容器中,设置的语法如下:
container.setLayout(newSpecificLayou());
设置好布局管理器后,就可以向容器内添加组件。
要将组件添加到容器,使用add方法。
要从容器中删除一个组件,使用remove方法。
容器container可以是框架或applet的内容窗格,或是JPanel的一个实例。
布局管理器的种类
♦FlowLayout
♦GridLayout
♦BorderLayout
♦CardLayout
♦
♦GridBagLayout
布局管理器FlowLayout
♦FlowLayout是最简单的布局管理器。
它按添加组件的顺序由左到右将组件排列在容器中,一行排满后再排新的一行。
♦FlowLayout的三个构造方法:
•publicFlowLayout(intalign,inthGap,intvGap)
根据指定的对齐方式、水平间距和垂直间距构造一个新的FlowLayout对象。
间距指组件之间用像素度量的距离。
对齐方式可以使用三个常量之一来指定,这三个常量是:
FlowLayout.RIGHT、FlowLayout.CENTER、FlowLayout.LEFT。
•publicFlowLayout(intalign)
根据指定的对齐方式构造一个新的FlowLayout对象,默认水平、垂直间距都是5个像素。
•publicFlowLayout()
构造一个新的FlowLayout对象,默认的对齐方式是居中,默认水平、垂直间距都是5个像素。
♦例8.1:
测试FlowLayout布局管理器
按添加的顺序从左到右将组件排列在容器中。
一行排满后,再排新的一行。
源程序:
ShowFlowLayout.java
布局管理器GridLayout
♦FGridLayout根据构造方法定义的行数和列数以网格(矩阵)的形式排列组件,组件按添加的顺序从左到右排列。
♦FGridLayout的三个构造方法:
•publicGridLayout(introws,intcolumns,inthGap,intvGap)
该方法以指定的行数和列数构造一个新的GridLayout对象,组件在容器上的水平和垂直间距也按指定值设置。
•publicGridLayout(introws,intcolumns)
该方法以指定的行数和列数构造一个新的GridLayout对象,组件的水平和垂直间距设为0。
•publicGridLayout()
该方法以每行一列的方式构造一个新的GridLayout对象。
♦例8.2:
测试GridLayout布局管理器
布局管理器GridLayout根据构造方法定义的行数和列数以网格(矩阵)的形式排列组件。
首先是第一行,接着是第二行,如此下去。
源程序:
ShowGridLayout.java
布局管理器BorderLayout
♦BorderLayout布局管理器将窗口分成五部分:
东区、南区、西区、北区、中央。
使用add(component,index)方法将组件添加到BorderLayout布局管理器中。
♦add(Component,index)方法中,index是一个常量,取值为:
BorderLayout.East,BorderLayout.South,BorderLayout.West,BorderLayout.North或BorderLayout.Center。
♦BorderLayout的两个构造方法:
•publicBorderLayout(inthGap,intvGap)
该方法根据指定的水平和垂直间距来构造新的BorderLayout布局管理器。
•publicBorderLayout()
该方法构造新的BorderLayout布局管理器,组件之间没有水平和垂直间距。
♦组件根据它们最合适的尺寸和在容器中的位置来放置。
南、北组件可以水平扩展,东、西组件能够竖直拉伸,中央组件既可以水平也可以竖直扩展以填满空白空间。
♦Example8.3测试BorderLayout布局管理器
本例使用BorderLayout布局管理器在框架中放置东、西、南、北和中央按钮。
源程序:
ShowBorderLayout.java
使用面板作容器
♦面板(Panels)是分组放置用户界面组件的更小的容器。
♦通常将组件放置在panel中,将panel放置在框架中,也可在一个面板中再放置面板。
♦面板的Swing版是JPanel。
JPanel类的构造方法是JPanel()。
默认情况下,JPanel使用FlowLayout。
♦注意:
给JFrame添加组件,实际添加到了JFrame的内容窗格中。
给面板添加组件,直接添加到了面板中。
♦Example8.4测试Panel
本例使用面板组织组件。
它创建一个微波炉用户界面。
源程序:
TestPanels.java
在面板上绘制图形
♦面板是不可见的,可以用作组织组件的小容器,以达到要求的布局效果。
Jpanel另一重要用途是可以用于绘制图形和文本。
♦要在面板上画图,需要创建一个由Jpanel扩展的新类,并且覆盖paintComponent方法告知如何在面板上画图。
可以在面板上显示字符串、绘制几何图形和显示图像。
♦paintComponent方法的方法头标志如下:
publicvoidpaintComponent(Graphicsg)
Graphics对象g由Java运行系统自动创建,这个对象控制信息的绘制方式。
♦Graphics类是在不同的平台上显示图形和图像的一个抽象类。
它是在Java虚拟机的本地平台上实现的。
当使用方法paintComponent在一个图形环境g中画图时,这个g是抽象类Graphics在特定平台上具体子类的一个实例。
Graphics类封装了平台细节,可以不用考虑特定平台而统一画图。
Color类
♦可以使用java.awt.Color类为GUI组件设置颜色。
Colorc=newColor(r,g,b);
r,g,b指定一个颜色的红、绿、蓝成分。
每种颜色的亮度用一个byte值表示,从0(最暗)到255(最亮)。
♦例如:
Colorc=newColor(128,100,100);
设置颜色
♦可以使用下列定义在Component类中的方法来设置组件的背景色和前景色:
setBackground(Colorc)
setForeground(Colorc)
♦Java.awt.Color中将13种标准颜色定义为常量,可以选用它们。
♦例如,将一个面板的背景色设置成黄色:
JPanelmyPanel=newJPanel();
myPanel.setBackground(Color.yellow);
Font类
♦可以设置组件或所画对象的字体,为设置字体,需要从Font类中创建Font对象,语法为:
FontmyFont=Font(name,style,size);
字体名可选择ScanSerif、Serif、Monospaced、Dialog或DialogInput等。
字型可选择Font.PLAIN、Font.BOLD、Font.ITALIC等,字型可以组合使用。
♦例如:
FontmyFont=newFont("SansSerif",Font.BOLD,16);
FontmyFont=newFont("Serif",Font.BOLD+Font.ITALIC,12);
♦简单实例:
SetColorAndFont.java
FontMetrics类
♦FontMetrics可用来计算字符串的精确长度和宽度,对于度量字符串的大小以便能在正确位置显示是很有帮助的。
获得给定字体的FontMetrics对象
♦FontMetrics是一个抽象类,要得到给定字体的FontMetrics对象,可以使用定义在Graphics类中的下列方法:
•g.getFontMetrics(Fontf);
该方法返回指定字体的字体尺度。
•g.getFontMetrics();
该方法返回当前字体的字体尺度。
♦可以用下列FontMetrix类中的实例方法得到字体的信息:
•publicintgetAscent()
•publicintgetDescent()
•publicintgetLeading()
•publicintgetHeight()
•publicintstringWidth(Stringstr)
♦Example8.5使用FontMetrics
以20磅粗体ScanSerif字体在框架中央显示“Welcometojava”
源程序:
TestFontMetrics.java
绘制几何图形
♦绘制直线
♦绘制矩形
♦绘制椭圆
♦绘制圆弧
♦绘制多边形
绘制直线
♦drawLine(x1,y1,x2,y2);
♦简单实例:
TestDrawLine.java
绘制矩形
♦drawRect(x,y,w,h);
♦fillRect(x,y,w,h);
绘制圆角矩形
♦drawRoundRect(x,y,w,h,aw,ah);
♦fillRoundRect(x,y,w,h,aw,ah);
♦简单实例:
TestRect.java
绘制椭圆
♦drawOval(x,y,w,h);
♦fillOval(x,y,w,h);
♦
简单实例:
TestOvals.java
绘制圆弧
♦drawArc(x,y,w,h,angle1,angle2);
♦fillArc(x,y,w,h,angle1,angle2);
♦简单实例:
TestArcs.java
绘制多边形
♦
int[]x={40,70,60,45,20};
int[]y={20,40,80,45,60};
g.drawPolygon(x,y,x.length);
g.fillPolygon(x,y,x.length);
♦简单实例:
TestPolygon.java
Example8.6绘制时钟
♦本例提供了一个程序,对给定的时、分、秒显示一个时钟。
时、分、秒作为命令行参数传递给程序。
♦源程序:
DisplayClock.java
事件驱动程序设计
♦过程驱动的程序设计是以过程的顺序执行。
程序决定了执行次序。
♦Java图形程序设计是事件驱动的。
在事件驱动程序设计中,激活一个事件时就开始执行相应的代码,事件也许是点击按钮、移动鼠标等等。
事件
♦事件:
可以定义为程序发生了某些事情的信号。
♦外部用户行为,如移动鼠标、点击鼠标按钮和按下键盘等,可以引发事件。
操作系统,如时钟等,也可以引发事件,程序可以响应或忽略事件。
♦事件源:
在其上发生事件的GUI组件被称为事件的源对象。
例如,按钮是点击按钮事件的源对象。
♦一个事件是事件类的实例,事件类的根类是java.util.EventObject。
♦事件对象包含与事件有关的一切属性。
可以使用EventObject类中的实例方法getSource()获得事件的源对象。
Event类结构体系
用户行为、源对象和事件类型
用户行为源对象事件类型
点击按钮JButtonActionEvent
改变文本JTextComponentTextEvent
选定多项JlistListSelectionEvent
选定一个新项JComboBoxItemEvent
事件委托处理模型
事件、事件监听器和监听器方法
事件类监听器接口e监听器方法(处理器)
ActionEventActionListeneractionPerformed(ActionEvent)
ItemEventItemListeneritemStateChanged(ItemEvent)
WindowEventWindowListenerwindowClosing(WindowEvent)
windowOpened(WindowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
windowClosed(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
ContainerEventContainerListenercomponentAdded(ContainerEvent)
componentRemoved(ContainerEvent)
例8.7处理简单行为事件
♦本例的程序在窗口中显示两个按钮“ok”和“Cancle”,在控制台上显示信息指出点击了哪一个按钮。
源程序:
TestActionEvent.java
♦例2:
监听ActionEvent、MouseEvent事件
源程序:
MyFrame1.java
♦例3:
监听FocusEvent、KeyEvent事件
源程序:
MyFrame2.java
事件剪裁类
♦java.awt.event.*包中定义了“Adapter”类,称为事件剪裁类。
♦java.awt.event.*包中的每个包容方法超过一个的Listener监听者接口都有一个Adapter类与之对应,例如对应MouseListener接口有一个MouseAdapter类。
♦这些Adapter类就是把它们对应接口中的所有方法用空的方法体实现。
这样我们的程序就可以以Adapter类为父类,继承并覆盖这些空方法中对我们有用的那些。
♦举例:
MyFrame3.java
例8.8处理窗口事件
♦该例演示如何处理窗口事件。
Windows类的任何子类都能发生如下窗口事件:
打开窗口、正在关闭窗口、关闭窗口、激活窗口、非激活窗口、图表化窗口和还原窗口、程序生成一个框架,监听窗口事件,并显示信息指明当前发生的事件。
♦源程序:
TestWindowEvent.java
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java GUI