Java基础实践教程-GUI编程_第1页
Java基础实践教程-GUI编程_第2页
Java基础实践教程-GUI编程_第3页
Java基础实践教程-GUI编程_第4页
Java基础实践教程-GUI编程_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

10.1

AWT和Swing概述10.2布局管理器10.3常用的Swing组件10.4事件处理10.1AWT和Swing概述GUI又称图形用户接口,是指采用图形化方式显示的计算机操作用户界面。在Java语言中提供了以下三个核心包用来做GUI开发。(1)java.awt包:它是由SUN公司最早推出的一套针对GUI编程的类库,需要使用本地操作系统提供的图形库,因此它不跨平台,属于重量级组件,目前主要用于提供字体和布局管理器。(2)java.swing包:它是由纯Java语言实现的GUI工具包,可跨平台,属于轻量级组件。Swing组件中包含了AWT(AbstractWindowToolkit,抽象窗口工具包)包中所有的功能,并扩展了更丰富的组件级功能,基本可以满足所有的GUI开发需求。(3)java.awt.event包:它基于事件处理机制提供了丰富的事件接口和类,可实现图形界面与用户的交互功能。java.awt包中提供的GUI开发工具的类库如图10-1-1所示。从图10-1中可以看到,AWT包主要包含了两大相对独立的类库,即菜单类和非菜单类。其中,组件又包含了容器类和控件类。菜单类的根父类是MenuComponent类,它是一个抽象类,直接继承自Object类,实现了Serializable接口。该类里面提供了菜单名、字体等属性的查询和设置方法以及与事件处理相关的方法。在MenuComponent类的子类中提供了更多关于菜单的操作,如MenuBar类和Menu类提供了增加和移除菜单等功能。AWT组件类的根父类为Component类,它也直接继承自Object类,可实现ImageObserver、MenuContainer和Serializable接口。该类也是一个抽象类,主要提供了访问和设置组件对象的基本属性功能、关联和管理事件处理的基本方法等。AWT中容器类的父类是Container类,AWT的常用容器都直接或间接继承自该类。Container类主要提供了针对容器属性的增加、删除、查询和修改的基本功能以及绘画等功能。控件类主要包括按钮、标签和复选框等控件,它们的父类是Component类,其功能方法与Component类基本一致。java.swing包是纯Java组件,使得应用程序在不同的平台上运行时具有相同的外观和行为。它包含了AWT组件的所有GUI工具,因此是开发商用软件GUI的主要工具。本章重点介绍Swing组件的用法。Swing组件在Java基础包和Java扩展包中都有类库,其中大部分组件类位于扩展包中。Swing组件的主要成员如图10-1-2所示。由图10-1-2可知,Swing组件的逻辑架构及命名与AWT组件有很多相似之处,也存在一些差别。在命名上,Swing中的类名在原有AWT组件类名上添加了字母J,并进行了类库扩展。Swing的根父类是java.awt.Container类,也就是AWT包中容器类的父类,因此Swing组件与AWT组件是一脉相承的。与AWT明显不同的是,Swing从java.awt.Container类中派生出组件类和顶级容器类,而组件类包含了菜单类、中间容器类和控件类。这里需要注意的是,组件类不依赖本地平台,它们是轻量级组件,而顶级容器类均需要依赖本地平台,它们属于重量级组件。容器类的JWindow、JFrame和JDialog类被称为顶级容器或顶级窗口,通常作为一个界面或对话框的根容器,其中,最常用的是JFrame和JDialog两个类。对比而言,Swing包的中间容器类用于在根容器中创建一个子窗口,它不能单独存在,因此称为中间容器,如JPanel、JScrollPane等面板。Swing包的常用容器有JFrame(窗口)、JDialog(对话框)、JOptionPane(对话框)、JInternalFrame(内部窗口)、JPanel(面板)、JScrollPane(滚动面板)、JSplitPane(分隔面板)、JTabbedPane(选项卡面板)和JLayeredPane(层级面板)。Swing包的常用控件有JLabel(标签)、JButton(按钮)、JRadioButton(单选按钮)、JCheckBox(复选框)、JToggleButton(开关按钮)、JTextField(文本框)、JPasswordField(密码框)、JTextArea(文本区域)、JComboBox(下拉列表框)、JList(列表框)、JProgressBar(进度条)和JSlider(滑块)。Swing包的常用菜单有MenuBar(菜单栏)、JPopupMenu(弹出菜单)和JMenuItem(菜单项)。此外,Swing包中的常用组件还有JTable(表格)、JFileChooser(文件选择器)、JColorChooser(颜色选择器)、JTree(树)和JToolBar(工具栏)。由于使用Swing设计GUI离不开顶级容器,因此首先介绍常用的顶级容器JFrame的使用方法。JFrame类位于javax.swing包里面,继承自java.awt.Frame,它使用public修饰,可以直接创建对象。JFrame类提供了四种重载构造方法,如表10-1-1所示。10.2布局管理器10.2.1FlowLayoutFlowLayout(流式布局管理器)是Java布局管理器中最简单的布局管理器。所谓流式,就是它里面的控件像水流一样,从左到右按顺序水平排列,直到达到容器的右边界,然后自动跳转到第二行的左侧起始位置。组件在水平排列时存在三种对齐方式——左对齐、居中对齐和右对齐,分别使用FlowLayout类的三个静态常量表示,即FlowLayout.LEFT、FlowLayout.CENTER和FlowLayout.RIGTH。如果没有显式设置,排列方式默认为居中对齐。此外,FlowLayout还可以指定组件在每行中的控件与容器方向开始边对应以及控件与容器方向结束边对应。因此,FlowLayout共提供了五种对齐方式。FlowLayout类的构造方法如表10-2-1所示。除了通过构造方法指定组件对齐方式和间距之外,也可以通过FlowLayout类中的方法来设置,可用的方法如表10-2-2所示。10.2.2BorderLayout中国传统建筑讲究“坐北朝南,东西对称”,它描述了房屋的方位信息。其实BorderLayout(边界布局管理器)与之非常相似。BorderLayout将窗体划分为东、西、南、北、中,分别对应BorderLayout类中的静态常量BorderLayout.EAST、BorderLayout.WEST、BorderLayout.SOUTH、BorderLayout.NORTH和BorderLayout.CENTER。组件可以指定放在任意一个区域。BorderLayout的构造方法和常用方法如表10-2-3所示。10.2.3GridLayoutGridLayout(网格布局管理器)用来创建具有指定行数和列数的网格布局,每个网格的尺寸大小完全相同,每个网格中只能放置一个组件。在窗体中添加组件时,组件是按照网格布局的网格编码依次放入的。其中最先存放组件的是第一行第一列的网格,然后由左向右依次存放,当前一行存满之后转向下一行,从最左端开始继续存放组件。GridLayout添加组件的逻辑与FlowLayout相似,不同的是前者的组件会填充满每个网格,而后者不会自动填充满。GridLayout的典型应用就是数字键盘。GridLayout类的构造方法和常用方法如表10-2-4所示。10.2.4GridBagLayoutGridBagLayout与GridLayout有些类似,但较之更灵活复杂。它不要求组件的大小相同,允许一个组件跨越一个或者多个单元格。该单元格被称为显示区域。每个组件的显示区域按从左到右、从上到下依次排列。组件之间可以垂直、水平对齐,或沿它们的基线对齐。为了能够灵活地管理每个组件,GridBagLayout还使用到了GridBagConstraints工具类。该类封装了若干个针对组件的约束属性。由GridBagLayout管理的每个组件都关联了一个GridBagConstraints实例,以指定该组件的位置信息、对齐方式等。GridBagConstraints类常使用无参的构造方法创建对象,它的常用属性如表10-2-5所示。需要注意的是,如果希望组件的尺寸随着容器尺寸的改变而改变,则需同时设置GridBagConstraints对象的weightx、weighty属性和fill属性。在使用GridBagLayout布局文件时,通常采用如下几个步骤:(1)使用GridBagLayout无参构造方法创建网格袋布局管理器,并设置它管理某个容器;(2)创建GridBagConstraints有参构造方法创建它的对象并设置相应的属性,或直接调用GridBagConstraints有参构造方法将属性值作为形参传入;(3)调用GridBagLayout的setConstraints方法将组件与一个GridBagConstraints对象进行绑定,该方法的声明语法格式如下:(4)在容器中添加已绑定过的组件。10.2.5CardLayoutCardLayout(卡片布局管理器)允许容器内的界面可以像幻灯片一样左右切换。CardLayout将加入容器的所有组件看成一叠卡片,每个卡片只对应一个组件,每次只有最上面的那个组件才可见。这就好比叠在一起的扑克牌,每次只有最上面的一张扑克牌才可见。CardLayout的构造方法和常用方法如表10-2-6所示。这里需要注意的是,java.awt包内的布局管理器都重写了Object的toString方法,用以返回布局管理器的类名称和最基本的设置参数。例如,CardLayout的toString方法源代码如下:它返回了CardLayout类名以及组件垂直和水平间隙的大小。ActionListener接口中有一个抽象方法actionPerformed,其声明的语法格式为:这个方法不需要编程人员自己调用,而是在程序运行中,当用户单击了窗体里面任意一个与ActionListener接口对象关联的按钮时,JVM将自动调用这个方法并执行里面的代码。这里通过setActionListener方法将调用它的按钮与形参中的ActionListener接口的实现类关联在一起。setActionListener方法声明的语法格式如下:该方法是JButton继承自AbstractButton类中的方法。在程序运行时,当单击了某个按钮时,该按钮被单击的事件Event就会被送入actionPerformed方法的形参中,通过getSource方法得到被单击的按钮对象。然后判断这个按钮对象是哪一个按钮,再执行相应的操作。整个过程其实就是一个事件监听和事件处理的过程,其中,事件源就是被单击的按钮,事件就是鼠标单击,事件处理就是JVM自动调用actionPerformed方法执行里面的逻辑。10.2.6不使用布局管理器在创建一个窗体后,如果设置该窗体的布局为null,就显式地声明了这个窗体不使用布局管理器。此时可以通过设置窗体中组件的坐标位置来确定它们的空间位置。这时用到的主要方法包括setLocation、setSize和setBounds。10.3常用的Swing组件10.3.1中间容器JPanel和JScrollPane中间容器JPanel属于面板的一种。面板通过javax.swing.JComponent类继承了java.awt.Container类。面板与JFrame的不同主要表现在:面板不能单独存在,必须放在其他的容器中;同时面板没有移动、缩放和关闭图标;此外,在一个程序界面中JFrame只能有一个,但可以在一个容器中设置多个面板。常用的面板还有JScrollPane,它与JPanel的区别主要表现在:JPanel是一个无边框的容器,可以设置布局管理器,添加多个组件;而JScrollPane是一个带有滚动条的容器,它只能添加一个组件,如果需要在JScrollPane中添加多个组件,可以先嵌入一个JPanel面板,然后在内置的JPanel中添加。1.JPanelJPanel的构造方法包含四种重载形式,如表10-3-1所示。2.JScrollPaneJScrollPane的构造方法和常用方法如表10-3-2所示10.3.2标签JLabel(标签)用来显示用户不可修改的信息,包括文本信息和图形信息,它常用于标注其他组件的功能。JLabel通过直接父类javax.swing.JComponent继承了java.awt.Container类,因此具有Container类中的所有方法。JLabel类提供了六种构造方法,如表10-3-3所示。标签的对齐方式是由SwingConstants类的静态常量确定的,部分静态常量的功能描述如表10-3-4所示。除了在构造方法中指定对齐方式、文本和图标之外,也可以在JLabel的方法中设置。JLabel常用的方法如表10-3-5所示。10.3.3文本组件文本组件用于接收用户输入的纯文本信息或向用户展示纯文本信息。文本组件的父类是javax.swing.text.JTextComponent,它提供了文本组件常用的操作方法,如表10-3-6所示。常用的文本组件有JTextField(文本框)和JTextArea(文本域)。它们的功能和方法非常类似,区别在于文本框只能输入和显示单行文本信息,而文本域可以输入和显示多行文本信息。1.文本框文本框的构造方法和常用方法如表10-3-7所示。2.文本域文本域的构造方法和常用方法如表10-3-8所示。JFrame容器的setDefaultCloseOperation方法,该方法用于设置窗体的关闭按钮被单击时采取的策略。JFrame窗体关闭按钮被单击时的响应策略有四种,如表10-3-9所示10.3.4按钮JButton(按钮)继承自javax.swing.AbstractButton。JButton类的构造方法和常用方法如表10-3-10所示。10.3.5选择框Swing中常用的选择框包括JRadioButon、JCheckBox和JComboBox。顾名思义,单选框是多选一,最多选一项;复选框是多选多,可以选多项;下拉列表框也是多选一,它将所有选项折叠收藏在一起,通过单击出现下拉式的选择列表。1.单选框单选框通过父类javax.swing.JToggleButton间接继承了javax.swing.AbstractButton。它的构造方法如表10-3-11所示。JRadioButton本身并不会实现多选一的互斥功能,而是需要通过javax.swing.ButtonGroup类将它们组成一组。其中,ButtonGroup类是一个不可见的组件,不需要把它添加到容器中,只需要在逻辑上把JRadioButton添加到ButtonGroup中即可。2.复选框复选框同样通过父类javax.swing.JToggleButton间接继承了javax.swing.AbstractButton。它的构造方法如表10-3-12所示。3.下拉列表框下拉列表框也被称作组合框,它通过父类javax.swing.JComponent继承了java.awt.Container,由此可知下拉列表框具有容器的一些性质。JComboBox的构造方法和常用方法如表10-3-13所示。10.3.6菜单Swing包中提供了丰富的菜单组件,其中最常用的是下拉式菜单和弹出式菜单。1.下拉式菜单下拉式菜单包括三种组件:JMenuBar(菜单栏)、JMenu(菜单)和JMenuItem(菜单项)。其中,菜单栏可以认为是菜单的容器,用来管理菜单,而不直接参与用户交互功能,通常水平放置在顶级容器的顶部;菜单用来管理菜单项,可以认为是菜单项的容器,它可以是单一层次的结构,也可以是多层次的结构;菜单项是菜单系统中最基本的组件,当用户单击菜单项时,通常会实现一定的功能。菜单栏提供了一个无参的构造方法。它常用的操作方法如表10-3-14所示。JMenu提供了四种构造方法,它的构造方法和常用方法如表10-3-15所示。JMenuItem提供了六种构造方法,如表10-3-16所示。创建和添加一个下拉式菜单,一般遵循以下步骤:(1)创建JMenuBar对象,将其添加到JFrame窗体顶部。(2)创建若干JMenu对象,将其添加到JMenuBar中。(3)若菜单有二级菜单,则创建二级JMenu对象,添加到对应的上级JMenu中。多级菜单也有类似的嵌套关系。(4)创建JMenuItem菜单项,将其添加到对应的JMenu中。2.弹出式菜单弹出式菜单也非常常用,它默认是隐藏的,当使用鼠标右键单击窗体空白处时就会显示出一个悬浮式的菜单,即弹出式菜单。在Swing中使用JPopupMenu类和JMenuItem类创建弹出式菜单。JPopupMenu类通过其父类javax.swing.JComponent间接继承了java.awt.Container,因此JPopupMenu具有容器的一些特性。它提供了两种构造方法,它的构造方法和常用方法如表10-3-17所示。10.3.7表格表格是一个多行、多列的二维显示区,在Java语言的Swing包中使用JTable来表示。JTable通过它的父类javax.swing.JComponent间接继承了java.awt.Container类。通常,使用表格遵循以下步骤:(1)创建一个JTable对象。(2)创建一个JScrollPane对象(指定表格及水平和垂直滚动条)。(3)将表格添加到滚动面板。(4)将滚动面板添加到JFrame的内容窗格中。10.3.8对话框对话框是在桌面上带有标题栏、输入框和按钮的一个临时窗口,也称为对话窗口。对话框的主要用途是实现人机对话,其应用场景体现为:系统通过对话框提示用户输入与任务有关的信息,如提示用户输入要打开文件的名字及路径;改变对象的属性、窗口等环境设置,如设置文件的属性、设置显示器的颜色和分辨率、设置桌面的显示效果;提供用户可能需要的信息等。在Swing中对话框是独立存在的。与JFrame不同的是,对话框没有菜单、最大按钮及最小按钮。常用的Swing对话框包括JDialog对话框和JOptionPane对话框两种。1.JDialog对话框JDialog对话框属于Swing包的顶级容器,它继承自java.awt.Dialog类。JDialog对话框分为两种形式:模态对话框和非模态对话框。其中,模态对话框的特点是用户必须先响应完对话框之后才可与其他窗口交互,非模态对话框允许在处理对话框的同时与其他窗口交互。JDialog对话框提供了丰富的构造方法,其中比较常用的构造方法如表10-3-18所示。2.JOptionPane对话框JOptionPane对话框是Swing内部已实现好的,以静态方法的形式提供调用,能够快速方便地弹出让用户提供值或向其发出通知的标准对话框。JOptionPane常用的静态方法如表10-3-19所示,这些方法都有重载的形式,这里只给出方法名及功能描述。其中,消息类型是showMessageDialog类的静态常量,不同的消息类型会默认使用不同的图标。常用的消息类型包括:10.4事件处理GUI要响应用户的单击、滑动和输入文本等交互需求,离不开事件处理机制。在Java语言中的事件处理采取“委派事件模型”。就像单击按钮事件一样,当单击事件发生时,产生事件的按钮会把单击“信息”传递给“事件的监听者”ActionListener处理,调用该监听者内的方法执行相应的操作。在这个过程中涉及几个重要的概念,具体介绍如下:(1)事件对象(Event):它通常是用户的一个操作,实际上就是java.awt.event事件类库里某个类所创建的对象。(2)事件源(EventSource):它通常是一个产生事件的对象,如窗口、按钮和下拉菜单等。(3)监听器(Listener):它本质上是一个接口的实现类对象,需要与事件源绑定在一起,负责监听事件源上产生的事件,如果有事件发生,其内部对应的方法就会被自动调用执行。(4)事件处理器:监听器对象对接收的事件对象进行相应处理的方法。事件处理机制就是基于上述几个重要概念,具体逻辑关系如图10-4-1所示。事件处理机制的具体实现过程如下:(1)需要待交互的组件通过调用add***Listener方法将组件与监听器的实例绑定在一起

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论