资源描述
第第1010章章 图图形用形用户户界面界面设计设计1目目录录10.1AWT和Swing简介10.2Swing容器10.3布局管理器10.4Swing组件10.5事件处理10.6图形处理10.7习题210.1AWT10.1AWT和和SwingSwing简简介介图形用户界面(GraphicalUserInterface,GUI),使用图形方式借助菜单、按钮等标准界面元素和键盘、鼠标操作,实现人机交互。AWT(AbstractWindowingToolkit),中文译为抽象窗口工具包,是Java提供的用来建立和设置Java的图形用户界面的基本工具。3ComponentContainerPanelAppletWindow FrameDialogButtonTextFieldTextAreaTextComponentCheckboxMenuComponentMenuMenuItemMenuBar其他组件图10-1AWT组件的继承关系图4Swing是为了解决AWT存在的问题而新开发的包。Swing的构建是基于AWT之上的一套全新图形界面系统(如图10-2Swing类的继承关系图),它提供了AWT所能够提供的所有功能,并且用纯粹的Java代码对AWT的功能进行了大幅度的扩充和改进。5JComponentObjectComponentContainerAbstractButtonJOptionPaneJToggleButtonJListJPopupMenuJTextComponentJMenuBarJScrollPaneJLabelJPanelJButtonJMenuItemJRadioButtonJButtonJCheckBoxJMenuItemJMenuItemJPasswordField图10-2swing类的继承关系图6Java语言的图形用户界面设计一般使用AWT和Swing组件来实现。其程序设计的基本步骤大致分为五个部分:引入常用的包。如:java.awt.*,javax.swing.event.*,javax.swing.*等。设置顶层容器。一般会选择JFrame(Frame)作为顶层容器。设置布局管理器。常用的布局管理器有FlowLayout,BorderLayout,CardLayout,GridLayout,GirdBagLayout,BoxLayout等。利用add()方法向容器中添加组件。对组件进行必要的事件处理。710.2Swing10.2Swing容器容器容器(Container)也是一个类,实际上是Component的子类,因此容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。容器不仅可以简化图形化界面的设计,以整体结构来布置界面。而且,所有的容器都可以通过add()方法向容器中添加组件。JFrame和JPanel都属于swing包下的类,它们都是容器组件。在swing包下的所有组件名称都在原来名字的前面加了一个“J”。810.2.1JFrame顶层容器JFrame是Java图形用户界面中最顶层的容器之一。窗口是最基本的用户界面元素。框架窗口是一种窗体,其中带有边框、标题栏及用于关闭和最大/最小化窗口的图标等。在GUI的应用程序中,JFrame在图形用户界面中的表现形就是窗口。JFrame构造方法主要有如下两种方式:JFrameObjectName=newJFrame();JFrameObjectName=newJFrame(Stringtitle);9【实例10-1】JFrameTest.javaimportjava.awt.Dimension;importjava.awt.Point;importjavax.swing.JFrame;publicclassJFrameTestpublicstaticvoidmain(Stringargs)JFramef=newJFrame();f.setTitle(JFrame);/实例化Dimension对象Dimensiondim=newDimension(350,250);f.setSize(dim);10/实例化Point对象Pointp=newPoint(300,200);f.setLocation(p);f.setVisible(true);运行结果:1110.2.2JPanel面板容器Java语言中的JPanel组件属于容器组件,JPanel与JFrame相同,也是一种用途广泛的容器。与JFrame不同的是,面板不能独立存在,必须被添加到其他容器内部。但是,面板可以嵌套,可以在面板内放置按钮、文本框等各种非容器组件,由此可以设计出复杂的图形用户界面。JPanel的构造方法如下:JPanelObjectName=newJPanel();12【实例10-2】JPanelTest.javaimportjavax.swing.*;importjava.awt.*;classJPanelTestpublicstaticvoidmain(Stringargs)throwsExceptionJFramejf=newJFrame(JPanel);jf.setSize(300,200);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setVisible(true);jf.setResizable(false);jf.setLocationRelativeTo(null);jf.setLayout(null);/实例化一个面板JPanelp=newJPanel();13/设置面板背景色为蓝色p.setBackground(Color.BLUE);p.setSize(150,100);/将面板添加到窗体中jf.getContentPane().add(p);运行结果:1410.310.3布局管理器布局管理器布局管理器(layoutmanager)是用来安排容器中多个组件的位置及大小,以确保GUI中各组件能安排在适当的位置。Java语言中的布局管理器包括以下几种:FlowLayout流式布局管理器(10.3.1);BorderLayout边框布局管理器(10.3.2);CardLayout卡片布局管理器(10.3.3);GridLayout网格布局管理器(10.3.4);GirdBagLayout网格布局管理器(10.3.5);BoxLayout网格布局管理器(10.3.6)。1510.3.1FlowLayout流式布局管理器流式布局管理器提供了一种非常简单的布局,用来将一群组件置于一行。它是JPanel的默认布局管理器。流式布局管理器会将组件安排在同一行,并维持组件原本所定义的大小,当此行已经排满时,他会将剩余的组件自动排列到下一行,而各行的组件会向中间对齐也可以通过使用常量LEFT、CENTER或RIGHT来改变默认地对齐方式。16FlowLayout的构造方法有如下几种:publicFlowLayout():创建默认布局;publicFlowLayout(intalign):设置对齐方法;publicFlowLayout(intalign,inthgap,intvgap):设置对齐方法,组建的水平间距和垂直间距;1710.3.2BorderLayout边框布局管理器边框布局管理器可以将组件安置在5个不同的区域,它们分为东、南、西、北、中,分别用常量EAST,SOUTH,WEST,NORTH和CENTER表示。与流布局管理器不同的是,各区域的组件并不一定会维持原来定义的大小,而是会充满各区域所提供的空间。18BorderLayout布局管理器有如下两种构造方法:BorderLayout():构造一个各部分间距为0的BorderLayout实例;BorderLayout(inta,intb):构造一个各部分具有指定间距的BorderLayout实例;1910.3.3CardLayout卡片布局管理器CardLayout是一种卡片式的布局管理器,它将容器中的组件处理为一系列卡片,每一时刻只显示出其中的一张。CardLayout有如下两种构造方法:CardLayout():生成一个卡片布局管理器。CardLayout(inthgap,intvgap):生成一个卡片布局管理器,并指定卡片内组件之间的空间。2010.3.4GridLayout网格布局管理器GridLayout卡片布局管理器是一种网格式的布局管理器,它将容器空间划分成若干行乘若干列的网格,组件依次放入其中,每个组件占据一格。GridLayout有如下三种构造方法:publicGridLayout():创建一个只有一行的网格,网格的列数根据实际需要而定;publicGridLayout(introws,intcols):创建一个可以设定行数和列数的网格布局。rows和cols分别指定网格的行数和列数;publicGridLayout(introws,intcols,inthgap,intvgap):设置逐渐之间的水平和垂直间距。hgap和vgap分别表示网格间的水平间距和垂直间距;2110.3.5GirdBagLayout网格包布局管理器GirdBagLayout网格包布局是基于网格布局的一种改进布局。和基本的网格布局不同的是,使用该布局管理器时,一个组件不一定只占据一个网格,可以占据多个网格,这样就增加了布局的灵活性。网格包布局使用的基本单位为cell,一个组件可以占一个以上的cell,一个组件占有的区域称为该组件的显示区域。每个组件施加空间控制是通过类GridBagConstraints来实现的。2210.3.6BoxLayout框布局管理器BoxLayout框布局管理器也是用来将一群组件排列在一起,除了至左而右的排列方式,还提供由上而下的排列方式。同流式布局不同的是,当空间不够时,BoxLayout组件不会自动往下移。BoxLayout的构造方法形式如下:BoxLayout(Containertarget,intaxis):axis是用来指定组件排列的方式(X_AXIS水平排列;Y_AXIS垂直排列)。2310.4Swing10.4Swing组组件件10.4.1标签组件标签是用来显示一个单行文本的组件。Swing中使用JLabel类来标识。标签中的文本具有三种对齐方式:左对齐、居中对齐和右对齐,分别使用LABEL.LEFT、LABEL.ENTER和LABEL.RIGHT三个静态常量表示。24JLabel有如下几种构造方法:PublicJLabel():创建没有名字的标签;PublicJLabel(Stringtitle):创建名字为title的标签;PublicJLabel(Stringtitle,intalignment):创建名字为title、对齐方式为alignment的标签;PublicJLabel(Iconicon):创建具有图标icon的标签;PublicJLabel(Stringtitle,intalignment,Iconicon):创建名字为title、对齐方式为alignment、具有图标icon的标签;2510.4.2文本组件文本组件主要有两种类型,即:JTextField文本框和JTextArea文本域。文本框是一个单行的文本域,可以接受从键盘输入的信息。Swing的JTextFiled类是用来创建文本框的(相当于AWT的TextFiled类)。文本域相当与多行的文本框,它不受行数的限制,当内容超出吸纳是范围时,具有滚动显示的功能。Swing的JTextArea类是用来创建文本域的(相当于AWT的TextArea类)。261)JTextField文本框JTextField类具有如下几种构造方法:publicJTextField():创建长度为1个字符的文本框;publicJTextField(inta):创建长度为a个字符的文本框;publicJTextField(Stringstr):创建初始字符串为str的文本框;publicJTextField(Stringstr,inta):创建长度为a个字符且初始字符串为str的文本框;272)JTextArea文本域JTextArea类具有如下几种构造方法:publicJTextArea():创建空文本域;publicJTextArea(Stringstr):创建初始文本为str的文本域;publicJTextArea(introws,intcolumns):创建rows行、columns列大小的文本域;publicJTextArea(Stringstr,introws,intcolumns):创建初始文本为str,并且具有rows行、columns列大小的文本域;publicJTextArea(Stringstr,introws,intcolumns,intscrollbars):创建初始文本为str、具有rows行、columns列大小,并且滚动方式为scrollbars的文本域;2810.4.3按钮组件Swing中使用JButton来表示按钮组件。它是一种在点击时触发行为事件的组件。JButton类有如下几种构造方法:publicJButton():创建没有名字的按钮;publicJButton(Stringtitle):创建名字为title的按钮;publicJButton(Iconicon):创建图标为icon的按钮;publicJButton(Stringtitle,Iconicon):创建名字为title、图标为icon的按钮;2910.4.4树形组件(JTree)生活中会经常使用到树形组件,最常用的就是计算机的左侧导航,如图10-3计算机树形组件所示:3010.4.5下拉列表组件(JComboBox)下拉列表组件是一些项目的简单列表,用户可以从中进行选择。Swing中使用JComboBox标识。JComboBox和AWT中的Choice类似,不同的是JComboBox可以被设置成可编辑的。JComboBox的两种构造方法如下:publicJComboBox():默认构造方法;publicJComboBox(ObjectstringItems):带有字符串列表的构造方法;3110.510.5事件事件处处理理所谓事件,就是用户对组件的一个操作,如鼠标的各种动作、键盘的操作以及发生在组件上的各种动作,因此事件一般也分为三种类型:键盘事件、鼠标事件以及组件的动作事件。32学习事件要明确事件类、事件对象、事件源和事件监听器四个概念:事件类:不同的事件被封装成不同的事件类,Java在java.awt.event包中定义了许多事件类;事件对象:描述的是用户所执行的操作,用户的操作不同,事件对象的内容也会不同;事件源:产生事件的组件称为事件源(eventsource);事件监听器:事件监听器是在事件发生时被通知的对象,一个组件如果需要响应一个事件,则必须先注册一个指定的事件监听器,注册后该事件监听器将时刻监视着该组件,一旦在该组件上发生相应的事件,则产生一个事件对象并调用相应的事件处理方法。3310.5.1窗口事件处理JFrame是Window的子类,凡是Window子类创建的对象都可以发生WindowEvent类型事件,即窗口事件。当一个JFrame窗口被激活、撤消激活、打开、关闭、图标化或撤消图标化时,就引发了窗口事件,即WindowEvent创建一个窗口事件对象。3410.5.2焦点事件处理Swing组件可以触发焦点事件。可以使用publicvoidaddFocusListener(FocusListenerlistener)增加焦点事件监视器。当组件获得焦点监视器后,如果组件从无输入焦点变成有输入焦点或从有输入焦点变成无输入焦点都会触发FocusEvent事件。创建监视器的类必须要实现FocusListener接口,该接口有两个方法:publicvoidfocusGained(FocusEvente):当组件从无输入焦点变成有输入焦点触发FocusEvent事件时调用;publicvoidfocusLost(FocusEvente):当组件从有输入焦点变成无输入焦点触发FocusEvent事件时调用;3510.5.3鼠标事件处理鼠标事件包括鼠标单击事件,鼠标移动事件等。当用户按下鼠标、释放鼠标或移动鼠标时会产生鼠标事件。该事件对应两种监听器:MouseListener和MouseMotionListener接口。鼠标按钮相关事件监听器由实现MouseListener接口的对象表示,而鼠标移动相关事件监听器则由实现MouseMotionListener接口的对象表示。36鼠标单击事件可以分为两个子事件:MOUSE_DOWN事件和MOUSEUP事件。当按下鼠标时生成MOUSE_DOWN事件,当松开鼠标时生成MOUSEUP事件。下面是处理MOUSE_DOWN事件的mouseDown()方法:publicBooleanmouseDown(Evente,intx,inty)下面是处理MOUSEUP事件的mouseUp()方法:publicBooleanmouseUp(Evente,intx,inty)3710.5.4键盘事件处理当用户按下或释放键时产生该类事件,也称为键盘事件。当按下某个键时,就会生成KEY_PRESS事件,当放开这个键时,则会生成KEY_RELEASE事件。键盘事件中,事件源使用addKeyListener()方法获得监视器,使用KeyListener接口处理键盘事件,该接口定义有三个抽象方法:1)publicabstractvoidkeyTyped(KeyEventkeyevent);2)publicabstractvoidkeyPressed(KeyEventkeyevent);3)publicabstractvoidkeyReleased(KeyEventkeyevent);3810.610.6图图形形处处理理10.6.1图形绘制和填充Graphics图形类是Java语言中绘制图形图像的基础类,它包含于java.awt包中,本身是一个抽象类。Graphics类提供了Java程序中绘制不同图形的方法。在程序设计过程中,Graphics对象并不是手动生成的,而是先覆盖paint方法,然后在paint方法中直接使用Graphics对象。39【实例10-18】绘制直线importjava.applet.Applet;importjava.awt.Graphics;publicclassDrawLineextendsAppletpublicvoidpaint(Graphicsline)intx1=0,y1=0;intx2=150,y2=150;line.drawLine(x1,y1,x2,y2);运行结果:40【实例10-19】绘制椭圆importjava.applet.Applet;importjava.awt.Graphics;publicclassdrawextendsAppletpublicvoidpaint(Graphicsdraw)intx=80,y=20;intwidth=40,height=80;draw.drawOval(x,y,width,height);运行结果:41【实例10-20】绘制和填充其他图形importjava.applet.Applet;importjava.awt.Graphics;publicclassDrawextendsAppletpublicvoidpaint(Graphicsdraw)intx=51,30,46;inty=34,28,45;intn=3;draw.fillPolygon(x,y,n);draw.fillRect(122,43,22,48);draw.fillRoundRect(65,34,26,43,20,30);42运行结果:4310.6.2字体和颜色处理字体的构造方法如下:FontclockFaceFont=newFont(字体名称,字体风格,字体大小);颜色的构造方法如下:publicColor(intr,intg,intb);4410.710.7习题习题3.Window是显示屏上独立的本机窗口,它独立于其它容器,Window的两种形式是()A.Frame和DialogB.Panel和FrameC.Container和ComponentD.LayoutManager和Container4.Swing采用的设计规范是()A.视图-模式-控制B.模式-视图-控制C.控制-模式-视图D.控制-视图-模式458.在JAVA编程中,Swing包中的组件处理事件时,下面正确的是()A.Swing包中的组件也是采用事件的授权处理模型来处理事件的B.Swing包中的组件产生的事件类型,也都带有一个J字母,如:JMouseEventC.Swing包中的组件也可以采用事件的传递处理机制D.Swing包中的组件所对应的事件适配器也是带有J字母的,如:JMouseAdapter9.关于使用Swing的基本规则,下列说法正确的是()A.Swing构件可直接添加到顶级容器中B.要尽量使用非Swing的重要级构件C.Swing的Jbutton不能直接放到Frame上D.以上说法都对4613.根据要求设计程序:a.做两个文本框和一个按钮;b.两个文本框内可以输入100,200内的数字;c.点击按钮可以输出两个文本框的数值之和。如下图所示:47
展开阅读全文