版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章Java的图形用户界面与
事件处理本章知识点GUI界面AWT组件SWING组件事件处理机制本类做事件监听成员内部类实现事件监听匿名内部类实现事件监听适配器模式实现事件监听GraphicUserInterface----GUI程序通过GUI为用户提供交互式的图形化操作,接受用户的输入并向用户输出程序运行的结果GUI不是Java的强项图形用户界面java.awt包下的AWT类java.swing包下的Swing类10.1AWT组件及应用AWT:AbstractWindowToolKit(抽象窗口工具包)提供了一套与本地图形函数进行交互的接口,所谓“本地”就是指操作系统。当利用AWT构建GUI的时候,实际上是在利用操作系统所提供的图形函数库----重量级组件。10.1.1AWT和Swing概述不同操作系统的图形库所提供的功能是不一样的,一个平台上存在的功能在另外一个平台上则可能不存在,所以AWT为了实现“一次编译,到处运行”的理念,不得不通过牺牲功能来实现平台无关性。AWT提供的图形功能是各种通用型操作系统所提供的图形功能的交集。Swing:在AWT的基础上构建的一套新的图形界面系统,它用100%的Java代码编写,并且对AWT的功能进行了大幅度的扩充----轻量级组件。10.1.1AWT和Swing概述因为Swing组件是用纯Java代码实现的,因此在一个平台上设计的树形组件也可以在其他平台上使用。AWT和Swing的比较AWT是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。如果是嵌入式应用,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是至关重要的因素,这种情况下,简单而高效的AWT是第一选择。在标准Java应用中,硬件资源往往不是关键因素,所以提倡使用Swing,即通过牺牲速度来丰富应用程序的功能。10.1.1AWT和Swing概述10.1.2AWT组成1.组件(Component)一个以图形化方式显示在屏幕上并能与用户进行交互的对象,例如按钮(Button)、标签(Label)、单选/多选按钮(Checkbox)、文本框(TextField)等,组件通常被放在容器中。Component类定义了所有组件所具有的特性和行为,并派生出其他所有的组件。10.1.2AWT组成2.容器(Container)容器是Component的子类,所以说容器本身也是一个组件,它具有组件的所有特性,同时又具有容纳基本组件和容器的功能,一个容器可以将多个容器和基本组件组织为一个整体。每个容器用add()方法向容器添加内容,用remove()方法从容器中删除内容。每个容器与一个布局管理器相关联,以确定容器内组件的布局方式。容器可以通过setLayout()方法设置某种布局。10.1.2AWT组成3.布局管理器(LayoutManager)用于管理界面元素在容器中的布局方式流式布局FlowLayout边界布局BorderLayout网络布局GridLayout卡片布局CardLayout等10.1.2AWT组成AWT容器Window(窗口):可独立存在的顶级窗口Panel(面板):不能独立存在,用于容纳其他组件,并存在于容器中。10.1.3AWT的容器1.WindowWindow:没有边界、标题栏、菜单栏,且大小不可以调整,主要是作为父类存在。Frame(窗体,Window的子类):有边界、标题栏、菜单栏,可以调整大小。Dialog(对话框,Window的子类):有边界、标题栏,可以调整大小,不支持菜单栏。10.1.3AWT的容器构建Frame的常用方法Frame():构造一个新的、最初不可见的Frame对象。Frame(Stringtitle):构造一个新的、最初不可见的、具有指定标题的Frame对象。构建Dialog的常用方法Dialog(Frameowner):构造一个最初不可见的、无模式的Dialog,它指定Dialog的所有者Frame和一个空标题。10.1.3AWT的容器【例10-1】创建一个Frame窗口。10.1.3AWT的容器publicclassFrameTest{
publicstaticvoidmain(String[]args){ Frameframe=newFrame("Frame窗口"); //设置窗口的位置,大小 //相当于frame.setLocation(50,50); frame.setSize(300,120); frame.setBounds(50,50,300,120);
#将窗口的主体区域设置为灰色 frame.setBackground(newColor(240,240,240));
//设置窗口的可见性 frame.setVisible(true); }}2.PanelPanel是一个通用的容器,代表一个区域,这个区域可以容纳其他的组件。Panel:没有边框或其他可见的边界,不能移动,不能改变大小,不能作为顶层容器的容器,不能独立存在。Panel只能嵌套在其他容器(Window或Panel)内部,用来分割大容器的布局,作为大容器的一部分实现各区域的单独管理,从而设计出比较复杂的容器结构。10.1.3AWT的容器要使Panel可见,必须将其添加到Window中。【例10-2】使用Panel装载基本组件,并添加到Frame。10.1.3AWT的容器布局管理:Java为了实现跨平台的特性并获得动态的布局效果,将容器内的所有组件的大小、位置、顺序、间隔等交给布局管理器负责。每一个容器都会引用一个布局管理器实例,通过它自动进行组件的布局管理。容器默认的布局管理器Window、Frame、Dialog:BorderLayoutPanel:FlowLayout10.1.4布局管理器1、FlowLayout(流式布局)按照组件添加到容器中的次序顺序地排放组件,即把组件从左至右,从上向下,一个接一个地放到容器中,未指定大小的组件由布局管理器根据组件的最佳尺寸决定,组件排列的位置随着容器大小的改变而改变。构造方法:FlowLayout():使用默认的对齐方式和间距(居中对齐,水平和垂直间隔为5个像素)。FlowLayout(intalign):指定对齐方式,默认水平和垂直间隔为5个像素。对齐方式为FlowLayout的静态常量:FlowLayout.CENTER,FlowLayout.LEFT,FlowLayout.RIGHT。FlowLayout(intalign,inthgap,intvgap):依次指定对齐方式、水平间距和垂直间距。10.1.4布局管理器2.BorderLayout(边界布局)东:BorderLayout.EAST西:BorderLayout.WEST南:BorderLayout.SOUTH北:BorderLayout.NORTH中:BorderLayout.CENTER10.1.4布局管理器BorderLayout的一个区域只能放置一个组件,后添加的组件会覆盖原组件。如果想在一个区域放置多个组件就需要先使用Panel来装载这些组件,再将Panel填至指定区域。3.GridLayout(网格布局)容器分成等长等大的若干网格,每个网格放置一个组件。向GridLayout布局的容器中添加组件时,默认从左至右、从上至下依次将组件添加至每个网格。与FlowLayout不同的是,GridLayout中组件的大小由所处区域决定,每个组件占满所处区域。构造方法:GridLayout():未指定网格的行数、列数,所有组件分布在一行中,每个组件一列。GridLayout(introws,intcols):使用指定行数、列数,默认水平、垂直间距将容器分割为网格。GridLayout(introws,intcols,inthgap,intvgap):使用指定的行数、列数,水平、垂直间距将容器分割为网格。10.1.4布局管理器【例10-3】构建一个计算器的布局。10.1.4布局管理器NORTH:FlowLayout布局CENTER:GridLayout布局4.CardLayout(卡片布局)容器中的多个组件被看成一叠卡片(组件重叠),在任何时候只有其中一张是可见的,这张卡片占据容器的整个区域。卡片布局就好比幻灯片在播放时,所有幻灯片都叠在一起,每次只能看见最前面的一张。构造方法:CardLayout():创建默认的CardLayout布局管理器。CardLayout(inthgap,intvgap):指定卡片与容器左右边界间距和上下边界。使用first(Containertarget),last(Containertarget),previous(Containertarget),next(Containertarget)方法显示容器target中的指定组件,show(Containertarget,Stringname)显示target容器中指定名字的卡片。10.1.4布局管理器10.2事件处理事件源(EventSource):每个可以触发事件的组件。事件对象(ActionEvent):发生的事件会被封装为(事件对象中会包含事件源对象)。事件监听器(EventListener):每一种事件都对应专门的监听器负责观察事件的发生。事件源与事件监听器之间要通过“注册”这个动作发生关联,即为一个事件源指定一个(或多个)事件监听器。被指定的事件监听器将观察管辖范围内的事件在该事件源上是否发生。事件处理器(EventHandler):事件源一旦发生该事件,监听器立即调用其定义的事件处理器作出响应。10.2.1事件处理的原理10.2.1事件处理的原理事件监听器事件源外部动作事件对象生成事件对象注册监听器触发事件源上的事件事件对象作为参数传入事件监听器事件处理方法调用事件监听器中定义的事件处理方法EventSourceActionEventEventListenerEventHandler事件监听器都是接口,java.awt.event按照事件的不同类型定义了多个监听接口,每类事件都有对应的事件监听器。监听器接口定义了事件发生时可以调用的方法,一个类可以实现一个或多个监听器接口。10.2.1事件处理的原理最常用的监听器接口是ActionListener,它监听按钮、菜单项的单击事件,文本框内的回车事件。它的事件处理方法为actionPerformed(ActionEvente),其中ActionEvent即为事件对象,它封装了关于事件的相关信息。10.2.1事件处理的原理【例10-4】编写一个事件响应程序,在窗体中放一个按钮和一个文本域,当单击按钮时,在文本域中添加一行“按钮被点击”。10.2.1事件处理的原理内部类:在一个类内部定义的类。通过内部类可以将逻辑业务上相关的处理组织在一起,并由外部类控制内部类的可见性。任何内部类都编译成独立的class文件。10.2.2利用成员内部类实现事件监听外部类内部类成员内部类:内部类的一种,定义在外部类内部,没有static修饰,具有以下特点:(1)成员内部类的实例自动持有外部类的实例的引用,引用形式为:外部类名.this。(2)内部类可以随意访问外部类的成员。但外部类不能直接访问内部类的成员,必须通过内部类的实例去访问。(3)在成员内部类中不能定义静态成员。10.2.2利用成员内部类实现事件监听外部类内部类【例10-5】利用成员内部类实现事件监听。10.2.2利用成员内部类实现事件监听【例10-5】利用成员内部类实现事件监听。10.2.2利用成员内部类实现事件监听ChatTextButtonActionHandlerTextFieldChangeHandler匿名内部类:定义在外部类内部,但没有名字,它可以继承其他类,也可以去实现接口。因为它没有名字,因而无法定义构造方法,编译器会自动生成匿名内部类的构造方法,并完成构建过程。10.2.3利用匿名内部类实现事件监听【例10-6】用匿名内部类的方式实现事件响应。10.2.3利用匿名内部类实现事件监听使用匿名内部类时注意括号的匹配和书写方式。lambda表达式一个重要的应用场景是替代内部类。JavaSE8规定,有且仅有一个抽象方法(可以有多个非抽象方法)的接口被称作是函数式接口(functionalinterface),函数式接口可以被隐式替换为lambda表达式。ActionListener接口仅含有一个抽象方法,它是函数式接口,当需要ActionListener的接口对象时,可以用lambda表达式对其进行替换,整个事件处理的表达将变得非常简洁。10.2.4利用
lambda表达式实现事件【例10-7】将【例10-6】中的注册事件监听器部分使用lambda表达式进行重写。10.2.4利用
lambda表达式实现事件事件适配器:事件监听器的空实现,它实现了监听器接口,但每个方法都是空实现(方法体内没有任何代码)。当需要事件监听器时,可以选择继承事件适配器,这样就不再需要实现接口中所有的方法,有针对性地重写需要的事件方法即可,简化了事件监听器的实现类。Java中对包含多个方法的监听器接口都提供了对应的适配器。WindowsListener接口的适配器:WindowAdapterMouseListener接口的适配器:MouseAdapterFocusListener接口的适配器:FocusAdapter10.2.5适配器模式实现事件监听【例10-7】为AWT窗口编写“×”按钮的关闭功能。10.2.4适配器模式实现事件监听Swing组件在各种平台上运行时可以保证具有相同的图形界面外观,可以提供本地平台不支持的显示外观。Swing对AWT组件都提供了对应的实现,通常在AWT组件名前加上“J”就变成了对应的Swing组件。10.3Swing组件10.3Swing组件10.4综合实践
—用户管理系统与常用Swing组件的应用(1)选择容器:主界面含有菜单栏,所以选择JFrame作为容器。(2)选择布局管理器:使用JFrame的默认布局BorderLayout。(3)向容器中添加组件:主界面由菜单栏JMenuBar和工具栏JToolBar组成,构建好菜单栏和工具栏之后添加至JFrame。(4)添加事件:主界面中的事件包括菜单项的单击、热键、和菜单项的快捷键,工具按钮的单击以及关闭窗口。(5)设置显示属性:设置JFrame的位置、大小及可见性。10.4综合实践
—用户管理系统与常用Swing组件的应用1.JFrameSwing中简化了界面编程,JFrame较Frame相比,如果用户希望通过单击窗口右上角的“×”按钮时退出程序,无需事件处理,直接调用setDefaultCloseOperation()方法即可。该方法参数有4个选择:JFrame.DO_NOTHING_ON_CLOSE:不执行任何操作。JFrame.HIDE_ON_CLOSE:只隐藏窗口,相当于setVisible(false)。JFrame.DISPOSE_ON_CLOSE:隐藏窗口,并释放窗口及其组件占用的内存资源,相当于dispose(),当最后的可显示窗口被释放后,则关闭程序。JFrame.EXIT_ON_CLOSE:直接关闭应用程序,相当于System.exit(0)。默认情况下,该值被设置为HIDE_ON_CLOSE,只隐藏窗口,不释放占用的内存。JDialog与JFrame相似,有JDialog.DO_NOTHING_ON_CLOSE,JDialog.HIDE_ON_CLOSE,JDialog.DISPOSE_ON_CLOSE三种关闭方式。10.4.1主界面与Swing组件的应用2.Swing菜单(1)JMenuBar、JMenu和JMenuItem10.4.1主界面与Swing组件的应用JMenuBar菜单栏Jmenu菜单JMenuItem菜单项(2)热键热键可以使用户通过键盘选择菜单和菜单项。每一个菜单组件JMenu和菜单项组件JMenuItem都可以设置热键属性mnemonic。10.4.1主界面与Swing组件的应用(2)热键Java中热键字符是通过java.awt.event.KeyEvent类中的不同常量来标识的(可以查看API文档)。为菜单添加热键:setMnemonic()方法10.4.1主界面与Swing组件的应用例如,为“注册”菜单添加热键“N”的方法为:JMenuregisteMenu=newJMenu("注册(N)"); registeMenu.setMnemonic(KeyEvent.VK_N);(2)热键为菜单项添加热键:可以在创建JMenuItem时通过构造方法传入。为菜单或菜单项设置了热键后,系统自动进行事件响应,不需要编程控制,系统会自动将热键关联至菜单或菜单项已注册的事件处理器。10.4.1主界面与Swing组件的应用newJMenuItem("修改用户信息(M)",'M');(3)快捷键JMenuItem还可以设置快捷键属性accelerator(加速器),快捷键一般与Ctrl键、Shift键、Alt键等组合,在不打开菜单的情况下,直接执行菜单项功能,如复制的快捷键是Ctrl+C。10.4.1主界面与Swing组件的应用(3)快捷键设置快捷键:setAccelerator()方法组合键:KeyStroke类创建了基于按键与标识符组合的实例。10.4.1主界面与Swing组件的应用例如,为菜单项“注册用户”设置快捷键Ctrl+N的代码如下:JMenuItemjmiRegiste=newJMenuItem("注册用户");jmiRegiste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,ActionEvent.CTRL_MASK))3.Swing工具栏工具栏是显示图标按钮的控制条,点击工具栏按钮相当于选择菜单项,是为了方便用户而设置的。Swing提供了JToolBar组件创建工具栏,将具有图标的按钮添加至JToolBar形成工具栏。(1)Swing中的按钮(2)向工具栏添加按钮10.4.1主界面与Swing组件的应用4.事件处理菜单项JMenuItem的单击:最简单的方式还是使用ActionListener接口。热键、菜单项的快捷键的响应会自动关联,不需要处理。工具按钮的单击事件:使用ActionListener接口监听。菜单项和工具按钮可以使用相同的监听器。10.4.1主界面与Swing组件的应用10.4.2注册界面与Swing组件的应用父窗口与对话框之间的信息传递计算对话框出现的位置获取父窗口实例的方法不同对话框之间的数据共享对话框出现的位置计算(parentX,parentY)parentWidthparentHeightint
dialogX=parentX+(parentWidth-windowWidth)/2;int
dialogY=parentY+(parentHeight-windowHeight)/2+40;this.setBounds(dialogX,dialogY,windowWidth,windowHeight);windowWidthwindowHeight对话框出现的位置计算//计算对话框的显示位置private
voidsetPosition(JFrameparent){int
parentX=parent.getX();int
parentY=parent.getY();int
parentWidth=parent.getWidth();int
parentHeight=parent.getHeight();int
dialogX=parentX+(parentWidth-windowWidth)/2;int
dialogY=parentY+(parentHeight-windowHeight)/2+40;this.setBounds(dialogX,dialogY,windowWidth,windowHeight);}父窗口实例向对话框的传递public
classMenuextendsJFrame{
privateJMenuItemjmiRegiste;
private
classRegisteHandlerimplementsActionListener{//注册public
voidactionPerformed(ActionEventevents){ newRegisterDialog(Menu.this,"注册用户");}}
public
voidaddEventHandler(){jmiRegiste.addActionListener(newRegisteHandler());}}外部类的实例对象增、删、改、查基于底层的ArrayList系统中的数据共享public
classUserDaoImplForListimplementsUserDao{
privateList<User>users;publicUserDaoImplForList(){ users=newArrayList<User>();}public
voidinsert(Useruser){}publicUserdelete(Stringname){}public
voidupdate(Useruser){}publicUserselectByEmail(Stringemail){}publicList<User>selectAll(){}}系统中的数据共享public
classMenuextendsJFrame{
privateJButtonbtnRegiste;privateUserDaouserDao;publicMenu(){
userDao=newUserDaoImplForList();}private
classRegisteHandlerimplementsActionListener{//注册public
voidactionPerformed(ActionEventevents){ newRegisterDialog(Menu.this,"注册用户",userDao);}}
public
voidaddEventHandler(){jmiRegiste.addActionListener(newRegisteHandler());}}系统中的数据共享//保存按钮的事件监听器private
classButtonSaveHandlerimplementsActionListener{public
voidactionPerformed(ActionEvente){……if(userDao.selectByEmail(email)!=null){//邮箱已注册JOptionPane.showMessageDialog(null,"该邮箱已存在","提示"
,JOptionPane.PLAIN_MESSAGE);userEmail.setText("");userEmail.grabFocus();}else{Useruser=newUser(email,name,sex,hobby);userDao.insert(user);}}表格是GUI程序中的常用组件,表格是多行、多列组成的二维区域。Swing的JTable提供了对表格的支持。10.4.3浏览用户界面与JTable组件的应用MVC:ModelViewController
模型
视图
控制器Model:维护表格数据的各种状态10.4.3浏览用户界面与JTable组件的应用TableModel使用JTable创建表格对象,可以继承Swing的AbstractTableModel抽象类,再重写如下几个方法。intgetColumnCount():返回表格数据的列数。intgetRowCount():返回表格数据的行数。ObjectgetValueAt(introw,intcol):返回row行col列的表格数据。StringgetColumnName(intcol):它返回指定列的列名字符串。10.4.3浏览用户界面与JTable组件的应用public
classUserTableModelextendsAbstractTableModel{privateList<User>users;publicUserTableModel(Listusers){ this.users=users;}}public
intgetRowCount(){ return
users.size();}public
intgetColumnCount(){ return5;}privateList<User>users;//按指定的行、列取出数据publicObjectgetValueAt(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 掐丝珐琅手工活外包合同
- 投标报价书编制外包合同
- 体育训练培训外包合同
- 电话回访服务外包合同
- 咖啡制作服务外包合同
- 金库守库业务外包合同
- 国外设计服务外包合同
- e邮宝业务处理外包合同
- 设备维修保养外包合同
- 高品质机场公寓外包合同
- 档案保密制度六防
- 企业近三年安全生产(施工)记录
- 假发行业营销方案
- 地源热泵打井协议书
- 口腔器械清洗消毒培训
- 2025年全国社区工作者招聘考试公共基础知识真题及答案
- 机械制图的基本知识与技能教学设计-2025-2026学年中职专业课-汽车机械基础-汽车运用与维修-交通运输大类
- PADI潜水OW理论知识课件
- 部编人教版一年级语文下册期末重点知识点复习
- 小儿脑瘫病例书写范文
- 健身房设计方案
评论
0/150
提交评论