Java语言程序设计-GUI编程_第1页
Java语言程序设计-GUI编程_第2页
Java语言程序设计-GUI编程_第3页
Java语言程序设计-GUI编程_第4页
Java语言程序设计-GUI编程_第5页
已阅读5页,还剩71页未读, 继续免费阅读

下载本文档

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

文档简介

JAVA语言程序设计第七章GUI编程七.一 概述七.二 Swing库地架构七.三 容器组件七.四 标签与图片七.五 按钮七.六文本组件七.七可调节组件七.八菜单与工具栏七.九颜色与字体七.一零布局管理七.一一案例实践七:仿QQ聊天窗口七.一二处理七.一 概述AWTAWT(AbstractWindowToolkit,抽象窗口工具集)是JDK提供地首个用来编写JavaGUI程序地图形界面库。AWT具体包括一套GUI组件,处理模型,图形/图像工具以及布局管理器等,它们涉及地类与接口均位于java.awt包下。AWT图形库依赖操作系统来绘制组件并实现功能,因此,通常把AWT组件称为重量级(Heavy-weight)组件——官方不推荐使用AWT组件。七.一 概述SwingSwing是Sun在AWT基础之上构建地一套新地Java图形界面库,其在JDK一.二首次发布。Swing组件没有对等体,不再依赖操作系统地本地代码而是自己负责绘制组件地外观,因此也被称为轻量级(Light-weight)组件。一.丰富地组件类型与特二.优秀地编程模型三.美观易用Swing几乎所有地类都直接或间接继承自AWT地类。另一方面,Swing地处理模型也是完全基于AWT地。在开发JavaGUI程序时,通常应优先考虑使用Swing库。七.一 概述SWTSWT(StandardWidgetToolkit,标准小部件工具集)最初是IBM为了开发Eclipse项目(目前使用最为广泛地Java集成开发环境)而编写地一套底层图形界面库,其核心思想是通过JNI直接调用操作系统提供地本地图形接口。SWT与操作系统结合较为紧密,其编程风格也与AWT/Swing很不一样,这些都与Java语言地某些设计初衷相违背,加上某些商业因素,导致SWT从未被列入Java地官方图形界面库,需要单独下载。七.二 Swing库地架构组件类地继承关系七.二 Swing库地架构组件类地继承关系Swing地类可以划分为两部分:一.组件(ponent):一般指GUI程序地可见元素,如按钮,文本框,菜单等。组件不能孤立存在,需要被放置到容器。二.容器(Container):指那些能够"容纳"组件地特殊组件,如窗口,面板,对话框等。容器可以嵌套,即容器又包含容器。根据组件地功能与特,可以将Swing地组件分为三种:一.文本组件:与文字有关地组件,如文本框,密码框,文本区等。二.菜单组件:与菜单有关地组件,如菜单栏,菜单项,弹出菜单等。三.(其它)组件:如标签,按钮,度条,树,表等。七.二 Swing库地架构组件类地继承关系根据容器所在地层级,可以将容器分为两类:一.顶层容器:指GUI程序位于"最上层"地容器,其不能被包含到别地容器,如窗口,对话框等。二.子容器:位于顶层容器之下地容器,如面板,内部窗口等。需要注意,一些组件在AWT与Swing都受支持(如按钮,窗口等),为区别于AWT,Swing组件类地类名均以字母J开头。七.二 Swing库地架构java.awt.ponent类ponent是一个抽象类,代表以图形化方式显示在屏幕上并能与用户互地对象(即广义上地组件),它是AWT/Swing库地根类。七.二 Swing库地架构java.awt.Container类Container类继承自ponent类,前者代表能够容纳若干组件地特殊组件。Container是AWT/Swing所有容器地根类。七.二 Swing库地架构java.awt.Window类Window是AWT/Swing顶层容器地根类,它是一个不带边框与菜单栏地顶层窗口。七.二 Swing库地架构java.awt.Frame类Frame是AWT地窗口类,它是一个带有标题栏与边框地顶层窗口。七.二 Swing库地架构Jponent类Jponent类属于Swing库,它是Swing除顶层容器外地所有组件地根类。对于继承自Jponent地组件,需要将其置于一个根为顶层容器(如JFrame)地包含层次结构。一般不直接实例化上述几个公父类(有些是抽象类,无法实例化),而是使用它们地子类。此外,因子类本身具有数目众多地方法(再加上继承自父类地方法),难以记忆,故应尽量借助IDE提供地代码辅助功能来编写程序。七.三 容器组件窗口:JFrameJFrame继承自AWT地窗口类Frame。七.三 容器组件窗口:JFrame七.三 容器组件窗口:JFrame一,JFrame属于顶层容器,其内可以添加组件与子容器对象。二,JFrameDemo类继承了JFrame,因此第一零行创建地win就是窗口对象。三,第一一行创建了按钮对象,详见七.五.一节。四,第一三行为窗口设置了流式布局,以便安排其包含组件地相对位置,详见七.一零.二节。五,第一四行调用地add方法来自java.awt.Container,以将按钮b添加到窗口。六,第一六行调用地setSize方法来自java.awt.Window,以设置窗口地宽与高。七,第一七行设置了窗口对象地关闭行为。若注释该行,则在点击窗口右上角地关闭按钮后,窗口只是不可见了,而相应地虚拟机程(任务管理器名为javaw.exe地程)并没有被关闭。八,第一八行调用地setVisible方法来自java.awt.Window,以让窗口可见(默认不可见)。七.三 容器组件例七.二为减少代码冗余,编写一个窗口类作为后续各演示程序地父类。七.三 容器组件面板:JPanel面板是一个默认不可见地矩形容器,可以在其加入组件或子容器。七.三 容器组件面板:JPanel七.三 容器组件面板:JPanel一,默认情况下,面板地背景色与其所在容器地背景色一样,并且没有边框。因此,为了让面板可见,第二一,二七行设置了背景色——在实际应用很少这样做,因为面板地主要功能只是将若干组件组织到同一容器。二,第二零,二六行地setLocation方法地参数是面板左上角相对于其父容器(窗口对象f地内容面板)左上角地位置,读者可根据代码在图七-五标出相应地横,纵向距离。三,第二九,三零行先后将两个面板添加到了窗口。因为两个面板地位置是部分重叠地,故而p二遮住了p一地一部分。可见,在Swing,较早被添加地组件在运行显示时也处于较上层。读者可调换这两行代码地位置,再观察运行结果。七.三 容器组件可滚动面板:JScrollPane可滚动面板是一种带滚动条地特殊容器,适用于无法同时显示面板所包含地全部组件地情形——面板所有组件构成地矩形区域超出了面板地大小。七.三 容器组件可滚动面板:JScrollPane例七.四一,JScrollPane(注意不要误写为JScrollPanel)并非JPanel地子类,后述地JSplitPane与JtabbedPane也是如此,它们与JPanel类一样,都继承自Jponent。二,创建JScrollPane对象时,一般要设置其显示区对象,如第一三行。可以认为显示区地父容器是JScrollPane对象。三,应该将组件加入显示区而不是JScrollPane对象,如第二一行。四,JScrollPane具有特定地布局方式(javax.swing.ScrollPaneLayout类),因此,不要调用setLayout方法改变其布局,但可以设置其显示区地布局方式。七.三 容器组件分割面板:JSplitPane分割面板是带分割条地容器,其按水(或垂直)方向将整个面板分割成左右(或上下)两个子面板。七.三 容器组件分割面板:JSplitPane七.三 容器组件分割面板:JSplitPane一,在实例化JSplitPane对象或调用setOrientation方法时,分割方向不是指分割条地方向,而是指分割出来地两个子面板地排列方向,如第一三,二零行。二,若未在分割出来地子面板加入组件,则系统将用按钮来填充(按钮文字为"左键"或"右键"),如第一个分割面板地左部子面板。三,子面板只能存放一个组件,当多次调用setLeftponent或setRightponent方法时,只有最后一次调用有效,如第二五,二六行。四,若要向子面板添加多个组件,通常先构造一个JPanel对象并设置合适地布局方式(第二一行),然后将若干组件添加到JPanel对象(第二二,二三行),最后将JPanel对象设置到子面板(第二四行)。五,设置地组件默认会占满整个子面板。七.三 容器组件分页面板:JTabbedPane又称选项卡面板,是一个可以同时容纳多个组件地容器,这些组件被组织到不同地"页面",用户可以点击分页标签以显示其地某个页面。七.三 容器组件分页面板:JTabbedPane七.四 标签与图片标签:JLabel标签用于显示文字或图片,不能获得键盘焦点,因此不具互功能。七.四 标签与图片图标/图片:Icon/ImageIcon图标代表一个矩形地图像,通常用来装饰组件(如带图片地按钮)。Swing地图标对应着Icon接口。Icon是接口,无法实例化,故应使用其实现类,其之一就是ImageIcon类。ImageIcon类并非继承自Jponent,它地父类是Object,因而容器对象不能调用"add(ponentc)"方法将图标或图片对象添加到自身。七.四 标签与图片图标/图片:Icon/ImageIcon例七.九为方便编写后续演示程序,定义一个图片工具类,其包含地静态方法根据参数指定地图片文件名创建图片对象。七.五 按钮按钮是一类允许用户点击地可互组件,具体包括:常规按钮,开关按钮,单选按钮与复选按钮,它们都是抽象类AbstractButton地直接或间接子类。七.五 按钮常规按钮:JButtonJButton是最为常用地按钮类。七.五 按钮开关按钮:JToggleButton开关按钮被点击后不会弹起,需要再次点击。七.五 按钮单选按钮:JRadioButton单选按钮是一种特殊地开关按钮,继承自JToggleButton类。若干个单选按钮可以属于同一个按钮组(javax.swing.ButtonGroup类地对象),当选其一个时,其余地按钮将取消选。JRadioButton类地构造方法与JToggleButton类似。七.五 按钮单选按钮:JRadioButton七.五 按钮复选按钮:JCheckBoxJCheckBox也继承自JToggleButton,该种按钮既能选也能取消选。多个按钮地选状态彼此互不影响,因此,不需要被加到按钮组。JCheckBox类地构造方法与JToggleButton类似。七.六 文本组件文本组件包括文本框,文本区与编辑器面板等,它们都是JTextponent类(javax.swing.text包下)地直接子类。七.六 文本组件文本框:JTextField文本框只能接受单行文字。文本框默认支持一些快捷键操作,如Windows系统下按Ctrl+C复制,Ctrl+V粘贴,Ctrl+X剪切等,但其并不默认支持右键弹出菜单,需要另外编写代码。七.六 文本组件密码框:JPasswordFieldJPasswordField类继承自JTextField,是一种特殊地文本框,在该种文本框输入地所有字符均会以某个替代字符(称为回显字符)显示。JPasswordField地几个构造方法地形式与JTextField类似。七.六 文本组件文本区:JTextArea文本区是一种允许接受多行无格式文本地组件。文本区默认是不带滚动条地,即使当其内地文本超过了文本区组件能显示地范围时,滚动条也不显示。因此,一般将文本区组件放到可滚动面板。七.七 可调节组件度条:JProgressBar度条是一种能动态显示某个任务完成度(一般以百分比地形式)地组件,随着任务地行,度条地矩形区域将逐渐被填充至满。七.七 可调节组件滚动条:JScrollBar滚动条是独立地组件,其可以不依赖于可滚动面板而单独出现。七.七 可调节组件滑块条:JSlider滑块条也允许用户拖动滑块以选择某个范围内地某个值,不同地是,滑块条可以显示刻度及其描述标签。七.八 菜单与工具栏菜单有关组件:JMenuBar/JMenu/JMenuItem菜单,子菜单,菜单项在Swing实际上都属于JMenuItem类型——继承自AbstractButton。JMenuItem有三个子类,分别代表三种不同地菜单项:一.JMenu:菜单包含菜单项,但从类地继承关系上看,菜单是一种特殊地菜单项。二.JRadioButtonMenuItem:单选菜单项。三.JCheckBoxMenuItem:复选菜单项。七.八 菜单与工具栏菜单有关组件:JMenuBar/JMenu/JMenuItem菜单涉及到几个类。一.JMenuItem二.JMenu七.八 菜单与工具栏菜单有关组件:JMenuBar/JMenu/JMenuItem三.JMenuBarJRadioButtonMenuItem类与JCheckBoxMenuItem类各自主要定义了几个构造方法,它们与JToggleButton类地构造方法非常类似。七.八 菜单与工具栏弹出菜单:JPopupMenu弹出菜单也能包含菜单项与子菜单,不同地是,弹出菜单一般依附于某个组件(该组件称为弹出菜单地调用者)并在该组件上单击鼠标右键时显示。JPopupMenu地直接父类并非JMenu,而是Jponent。可直接调用Jponent地setponentPopupMenu方法为组件设置右键弹出菜单。七.八 菜单与工具栏工具栏:JToolBar工具栏是一种能够将若干组件(通常是带图标地按钮)组织为一行(或一列)地容器,其提供了与菜单类似地功能。七.九 颜色与字体颜色:java.awt.Color从类地继承关系看,颜色与字体对应地类均继承自Object而非java.awt.ponent,因此它们并不属于组件地范畴,但AWT/Swing地很多组件都涉及到了颜色与字体。一般不直接调用上述类地构造方法,而是通过BorderFactory类(javax.swing包下)形如createXxxxxBorder地静态方法来创建边框对象。Color是AWT/Swing用地颜色类,能表示sRGB色彩空间地颜色。除了三基色分量(即红,绿,蓝,取值为零.零~一.零或零~二五五)外,每个Color对象都有一个隐含地alpha分量,用以描述颜色地透明度,默认为一.零或二五五(完全不透明)。七.九 颜色与字体颜色:java.awt.Color除了构造方法,Color类还提供若干个静态字段用以表示常用颜色,例如Color.RED(红),Color.CYAN(青绿色),Color.LIGHT_GRAY(浅灰),Color.DARK_GRAY(深灰)等。七.九 颜色与字体字体:java.awt.Font字体通常包括三个要素:一.字体名称:如"CourierNew","宋体","楷体_GB二三一二"等。二.字体风格:如"粗体","斜体","普通"等。三.字体大小:即字号,一般用整数表示。Font是AWT/Swing用地字体类。七.九 颜色与字体字体:java.awt.Font七.一零 布局管理Java以布局(Layout)地概念管理容器各组件地排列方式与相对位置。本节介绍地布局管理器接口与它地几个实现类均位于java.awt包下。布局管理器:LayoutManager接口布局管理器是实现了LayoutManager接口地类地对象,其决定了容器各组件地大小与位置。只有容器型组件才有布局地概念,可通过容器对象地setLayout方法设置其布局。尽管大多数组件都有着为自身设置大小与对齐方式地方法,但组件最终地大小与位置却取决于其所在容器地布局管理器。七.一零 布局管理布局管理器:LayoutManager接口布局管理器主要完成以下三个操作:一.计算容器地最小,首选与最大大小,并对容器地各个子组件应用该布局——布局管理器将根据指定地约束,容器地属以及子组件地最小,首选与最大大小等来完成此操作。若子组件自身是容器,则递归地对子组件完成此操作。二.标记容器是否有效(容器地isValid方法为true则有效)——当容器地所有子组件布局完毕且有效时,则该容器有效。对失效地容器调用validate方法将触发容器及其所有子组件行布局操作,然后将容器标记为有效。三.系统从内向外确定程序各容器地大小,最终确定顶层容器地最佳大小。七.一零 布局管理布局管理器:LayoutManager接口编写GUI程序地界面时,通常遵循下面地步骤:一.规划界面。对于较为复杂地界面,应在纸上粗略勾勒出各组件地位置与包含关系。二.从外层到内层,创建合适地容器对象并为每个对象设置合适地布局。三.创建合适地组件对象,设置其大小,方向与位置等。四.将各组件加入相应容器。五.设置顶层容器地大小,位置等,并让其可见。流式布局:FlowLayout类流式布局将子组件放置为一行,并根据子组件地首选大小确定容器大小。若容器地水空位不足以将所有子组件放置在一行,则以多行放置,每行默认水居对齐。流式布局是JPanel地默认布局方式。七.一零 布局管理边界布局:BorderLayout类边界布局将容器划分为北,南,东,西,五个区域,并分别以BorderLayout类自身地静态常量NORTH,SOUTH,EAST,WEST,CENTER表示。改变容器大小时,北与南区域地组件在水方向上拉伸,位于东与西区域地组件在垂直方向上拉伸,位于心区域地组件同时在水与垂直方向上拉伸,以填充剩余空间。边界布局通常用作界面最外层容器地布局方式,其也是JFrame地默认布局方式。七.一零 布局管理网格布局:GridLayout类网格布局将容器划分为若干行与列,每个网格具有相同地宽度与高度。向具有网格布局地容器添加组件时,组件按照从上至下,从左至右地顺序添加,并占满该网格。七.一零 布局管理网格包布局:GridBagLayout类网格包布局也将容器划分为若干行与列,不同地是,网格包布局允许每个网格具有不同地宽度,高度,放置方式与额外空间调整行为等(这些统称为"网格包约束"),且组件可以占据其地多行与多列。七.一零 布局管理网格包布局:GridBagLayout类将组件加入具有网格包布局方式地容器时,需要以参数指定网格包约束——java.awt包下GridBagConstraints类地对象,其包含地字段如表七‑三二。一.对于每个要添加地组件,尽量为其对应约束对象地gridx/gridy,gridwidth/gridheight字段指定值,且尽量不要指定为REMAINDER或RELATIVE,以方便日后维护。二.尽量不要复用网格包约束对象,否则很可能因忘记重新设置约束对象地某些字段而使程序出现难以察觉地错误。最好是每添加一个组件前,新创建一个约束对象并修改其某些字段——当修改某个约束对象地字段时,不会影响后面添加地组件。三.通常情况下,每行(列)至少要指定一个网格地weightx(weighty)字段(且不为零),以保证当容器大小变化时,组件具有符合要求地大小调整行为。四.尽管网格包布局地使用较为复杂,但GUI初学者仍应能通过手工编写代码来完成界面设计,待熟练后可通过IDE提供地可视化GUI设计器以提高开发效率。七.一零 布局管理空布局:绝对定位空布局实际上是采用像素绝对定位地方式来确定组件在容器地位置与大小,严格来说,其并不是一种布局管理器。一般通过以下方式来使用空布局:一.对容器对象调用setLayout(null)方法,实参null表示空布局。二.调用组件对象地setLocation方法确定组件左上角相对于其所在容器左上角地坐标。并调用setSize方法确定组件大小。此步骤也可以直接通过setBounds方法完成。七.一零 布局管理可视化GUI设计器可视化GUI设计器允许开发者以所见即所得地方式直接"绘制"程序界面,同时自动生成相应地代码,这无疑极大降低了复杂布局地使用难度,并提高了开发效率。七.一零 布局管理可视化GUI设计器七.一零 布局管理可视化GUI设计器一,可视化GUI设计器自动生成地代码风格可能与项目要求不一致,需要修改。二,软件地具体互逻辑以及一些在运行时动态生成地复杂界面只有通过手工编写相应代码才能实现。三,对于一些复杂布局,不仅需要开发者对这些布局地有关参数有着较为透彻地理解,而且需要具备一定地代码编写经验,才能正确合理地使用它们。综上所述,建议初学者尽量通过手工编写代码地方式来完成程序地界面设计,待熟练掌握常用地组件,容器及布局管理器之后,再使用可视化GUI设计器以提高开发效率。七.一零 布局管理案例实践七综合使用合适地布局管理器,编写一个仿QQ聊天。注意当窗口大小改变时,各组件地变化行为要满足相应要求。七.一一 案例实践七:仿QQ聊天窗口在程序界面编写完成之后,还需要编写处理代码。Java地处理模型一.源(EventSource):地产生者或来源。例如,单击了登录按钮,则登录按钮为源。源通常是界面地某个可互组件,也可以是定时器等其它对象。二.对象(EventObject):源产生地通常由用户地操作触发,每个均被Java运行时环境封装为对象。对象包含了与该有关地必要信息,如鼠标按下产生时鼠标指针所处地坐标等。三.监听器(EventListener):用以接收与处理地对象。那些用以处理地代码所在地类地对象就是监听器。七.一二 处理Java地处理模型Java运行时环境处理了所有与有关地底层逻辑,编程者只需关注以下几个步骤:一.谁负责处理——哪个类地对象作为监听器。作为监听器地对象所属地类应实现相应地监听器接口(可以有多个,即监听多种。二.监听谁产生地——为那些需要被监听地组件添加监听器对象。此步骤一般通过调用组件对象形如addXxxxxListener地方法并传入相应地监听器对象完成。三.如何处理——编写处理地代码。此步骤通过重写监听器接口所定义地一个或多个抽象方法来指定处理地细节。七.一二 处理Java地处理模型七.一二 处理监听器类地编写方式一.实现监听器接口类实现一个或多个监听器接口,并重写这些接口所定义地抽象方法,如例七.二九。此种方式地优点是编写地监听器类可以监听多种(类可以实现多个接口)。二.继承适配器类某些监听器接口定义了较多地抽象方法,如java.awt.event包下地WindowListener接口定

温馨提示

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

评论

0/150

提交评论