




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第12章 GUI初步12.1 介绍(Introduction)为JavaGUI程序设计应用程序接口(API)是面向对象编程最精彩的内容,图形用户界面(GUI)可以通过键盘或鼠标来响应用户的操作。这章首先介绍GUI编程基础,然后用GUI来讲述面向对象编程,特别是要讲框架和组件的关系,包括容器,布局管理器,颜色,字体,边框和图标等。12.2 Swing和AWT前面第8章,稍微介绍了一些面向对象编程的GUI例子,显示GUI组件,使用了诸如Jbutton,Jlabel等GUI组件。为什么这些GUI前会有一个J?为什么不用Button?事实上,在java.awt包中已经有一个名为Button的类。当Java问世的时候,称AWT(Abstract Windows Toolkit)的GUI类就被绑定在类库中。对于开发简单的图形用户界面,AWT是胜任的,但如果开发综合,复杂的GUI工程却力不从心。另外,AWT是依赖于平台的,即AWT组件的样式与它使用的底层平台相似。新版本中,许多AWT的用户界面组件被一个更鲁棒,灵活,通用的Swing组件代替。Swing组件使用Java代码编写,被直接应用在程序上,而不是调用底层的平台服务。但java.awt.Window或java.awt.Panel的子类除外,因为他们必须使用特定平台本地的GUI来绘制。Swing组件很少依赖目标平台,很少使用平台下的本地GUI程序,鉴于此,把它称为轻量级组件,而AWT称为重量级组件。为了和AWT组件进行区分,Swing组件的类命名加前缀J,尽管AWT组件依然被现在版本的Java支持,但最好使用轻量级组件,因为AWT最终会淡出历史舞台,也因此,只介绍Swing组件。12.3 Java GUI与 APIGUI的API包含的类可以被分为3类,组件类,容器类,帮助类。它们的层次关系如图所示。组件类,如Jbutton等用来创建用户界面。容器类,如Jframe,Jpanel和Japplet等用来盛载其他组件。帮助类,如Graphics,Color等用来支持GUI组件。注意:Jframe,Japplet,Jdialog和Jcomponent类和它们的子类被组织在Javax.swing包中,其他的类被组织在AWT包中。12.3.1 Component类Component的实例可以被显示在屏幕上。Component是所有用户界面类的根类(父类),包含Container类。Jcomponent类是所有轻量级组件的根类。Componet和Jcomponent都是抽象类(14章讲解)。现在只需要知道抽象类和类相似,仅仅是不能创建实例就可以了。例如,不可以使用new JComponent()来创建一个Jcomponent对象,但可以使用它非抽象子类的构造方法来创建Jcomponent实例。熟练掌握继承的层次关系非常重要,如下述语句都显示true。12.3.2 Container类Container类的实例可以盛载Component的实例,是GUI组件,它用来盛载其他GUI组件的。Window,Panel,Applet,Frame和Dialog都是AWT组件的容器类。为了配合Swing组件,使用Container,Jframe,Jdialog,Japplet和Jpanel类容易,如下图所述。12.3.3 帮助类如Graphics,Color,Font,FontMetrics,Dimension和LayoutManager等类是帮助类,它们不是Component的子类。它们用来描述GUI组件的特性,属性,如下图所示。注意:帮助类在AWT包中,Swing组件不能替换所有的AWT,它替换的只有AWT的GUI组件类,因此AWT帮助类仍然在GUI编程中用处很大。12.4 Frames框架为了创建用户界面,需要创建一个frame或一个applet(18章介绍)容器来放置用户界面组件。12.4.1 创建Frame使用Jframe类来创建一个框架frame,如下所示。使用Jframe创建一个frame窗口,如下程序。框架frame的可见性默认为false,因此必须使用frame.setVisible(true)来显示框架。语句frame.setSize(400,300),设置框架窗口宽400,高300像素,如果不设置大小,则只显示一个标题栏,运行程序后在屏幕显示如下。Line 7使得frame在屏幕中间显示,line8告诉程序当frame被关闭时终止,没有此语句,程序将不能终止,这种情况下只能在Dos(windows平台)命令提示符下,使用Ctrl+C来终止,在Eclipse中将使用红色终止按钮来终止程序。注意:要在调用居中语句前设置窗口大小,否则无效。12.4.2 在Frame中添加组件使用add方法可以为Frame添加组件,如图所示程序。每一个JFrame都包含一个content pane(内容面板),内容面板是Container的一个实例。如按钮等GUI组件会被放置在frame的content pane中。在Java早期版本,必须使用getContentPane方法来返回frame的content pane,然后调用content pane的add方法为其添加组件,如下所示(教程中示例如此)。这是非常笨重的,从java 5以后的新版本允许直接调用frame的add方法来为content pane添加组件,如下:这个新特性称content-pane授权(给frame),严格的说,是一个组件被添加到frame的content pane。为简单,称把组件添加到frame中。一个JButton对象使用new Jbutton(“OK”);来创建,使用frame.add(jbtOK)被添加到frame的content pane中。方法add(Compunent comp)定义在Container类中,因为JButton是Component的子类,因此Jbutton的实例同样也是Component的实例,从容器中删除组件使用remove方法,使用方式:Container.remove(jbtOK);当运行程序时,窗口会被显示,按钮会总是出现在窗口中间,不管窗口是否重新设置大小,总是占据整个窗口。原因就是组件被content pane的不仅管理器放置在窗口中,content pane的默认的布局管理器会把这个按钮放置在窗口的中央。下节会学习使用其他几种布局管理器,把组件放置在期望的位置。12.5 布局管理器介绍3种布局管理器,FlowLayout,GridLayout和BorderLayout。12.5.1 FlowLayoutFlowLayout是最简单的布局管理器,称流式布局管理器。组件被从左到右,从上到下的,按它被添加的顺序放置在窗口中。当一行满之后,会另起一行。类中包含三个常量,设置组件的对齐方式,FlowLayout.RIGHT, FlowLayout.CENTER, FlowLayout.LEFT。也可以使用分割线来分割组件,如下所示FlowLayout类图:下列程序给出一个流式布局,添加三个标签和三个文本框。为什么使用如上程序来构造一个窗口?原因有三:1. 创建一个GUI应用意味着创建一个窗口框架,很自然会定义成Jframe的子类。2. frame会被扩展出新的组件或方法函数。3. 这个类易于重用,例如可以通过创建多个类的实例来创建多个窗口。同时这种构造程序的方式易读。从今以后,大多数GUI主类会扩展JFrame类,主类的构造方法会构造用户界面。主方法创建一个主类的实例并显示窗口框架。这个例子中FlowLayout布局管理器用来放置组件,如果重新调整窗口大小,组件也会自动被重新安排,如上图所示。如果把line10语句用setLayout(new FlowLayout(FlowLayout.RIGHT,0,0)来替换,所有组件会被左对齐,并且中间没有间隔线。等价语句如下:假设把一个按钮用add方法加入10次,是否会出现10个相同的按钮?答案是不会,只会出现一个。不要忘记在设置布局中使用new,如setLayout(new FlowLayout().12.5.2 GridLayoutGridLayout也称网格布局(矩阵布局),组件按被添加的先后顺序放置在网格中,放置顺序从左到右,从上到下,如下是网格布局类的UML类图。可以设定网格的行和列数,基本原则如下:1. 行数或列数可以为0,但不能都为0.如果一个为0,另外一个不为0,那么非0的维数被设定,0维数由布局管理器动态决定。如,设置0行3列,包含10个组件,那么GridLayout会创建固定的3列,并动态生成4行,最后一行包含一个组件。如果设定3行0列,10个组件,那么固定为3行,动态设定4列,最后一行包含2个组件。2. 如果行和列都不为0,行数为主导参数,即行数被固定,列数自动计算生成。如果设定3行3列,10个组件,那么会设置3行固定,4列动态设定,最后一行包含2个组件。如下列所示程序使用网格布局。如果重新设定框架大小,布局的按钮保持不变,网格布局中所有的组件给出相同的大小。把line10用setLayout(new GridLayout(3,10)来替换,仍然是3行,2列。如果定义4行2列网格或2行2类网格会怎样?自己试验下。前2种布局,添加组件顺序非常重要,因为它决定自己在容器中的位置。12.5.3 BorderLayoutBorderLayout把容器分为5个区域,东南西北中。通过add(Component, index),添加组件,其中index是以下5个常数之一,BorderLayout.EAST,BorderLayout.SOUTH,BorderLayout.WEST,BorderLayout.NORTH或BorderLayout.CENTER,类图如下图所示。组件以合适的大小被放置在相应的区域,南北组件可以水平方向延伸,东西组件可以垂直方向延伸,中间组件可以向水平,垂直方向延伸以填满整个空间。如下程序可以说明BorderLayout的布局,在东南西北中添加5个按钮,标签分别为East,South,West,North和Center。不必要使得组件填满所有的5个区域,如果把East按钮移调,并重新运行程序,会发现中间的按钮会向右延伸并占满East区域。如果add方法中没指明区域,则默认为中间区域,如此添加2个组件,则只有第二个组件会被显示。12.5.4 布局管理器属性布局管理器有动态调整的属性。FlowLayout有alignment,hgap,vgap属性。可以使用setAlignment,setHgap和setVgap方法来设定对齐和垂直,水平分割。GrideLayout有rows,columns,hgap和vgap属性,可以使用setRows, setColumns,setHgap和setVgap方法来设定行数,列数即水平和垂直分割。BorderLayout有hgap和vgap属性,可以使用setHgap和setVgap方法来设置水平和垂直分割。在前面的部分中,因为没有设置布局管理器属性,匿名的布局管理器在发挥作用。如果需要动态的改变属性,那么布局管理器就必须显式被一个变量引用,不能匿名。可以通过变量改变布局管理器的属性值,例如下述代码。12.6 Panels面板和子容器假设想要在一个框架中放置是个按钮和一个文本框,按钮按网格布局,但文本框要放置在分开的一行。单单使用一个容器很难达到预期要求。但可以把容器分成几个部分,每个部分中放置一个panel,每个panel有不同的布局方式。Panel是组织界面组件的一个非常有效的子容器,需要先把组件添加到panel上,然后再把panel添加到frame上。Swing版本的panel是JPanel。Jpanel的默认布局方式为FlowLayout布局,但可以在创建对象时给定它的布局方式,如new JPanel(LayoutManager)。如下方式添加按钮到Panel中。Panel可以被放置在frame中或另外一个panel中,如下把panel添加到frame中。f.add(p);下述代码展示了使用panel作为子容器来创建一个微波炉的用户界面。setLayout方法定义在Container类中。Jpanel是Container的子类,因此可以使用setLayout方法来设置panel的布局方式。为了获得想要的布局,程序使用panel p1,网格布局方式来组织数字按钮,start和stop按钮。面板p2,布局方式为BorderLayout,放置一个文本框在north区域,而面板p1放置center区域。注意:值得注意的是Container类是所有其他GUI组件类的超类,每一个GUI组件都是一个容器,理论上将,可以使用setLayout方法设置按钮上面的布局方式,添加一个组件到按钮上面,因为所有的Container当中的公共方法都被遗传到JButton类中,但在实践上,却不会想到把按钮作为容器。12.7 Color类使用AWT包中的Color类可以为GUI组件设置颜色,颜色是由红绿蓝光的三原色组件构造的,每个组件是一个整型值表达梯度(明亮和灰暗程度),从0-255,这就是所谓的RGB颜色模式。可以使用如下构造方法创建一个颜色对象:r,g,b分别表示红绿蓝颜色的梯度值(不能超过255,否则会出错),如Color color=new Color(128,100,100);可以使用setBackground(Color c)和setForeground(Color c)方法来设置组件类对象的背景颜色和前景颜色。如下设置一个按钮的背景和前景色。另外,可以使用13个标准颜色(颜色常量BLACK,BLUE, CYAN, DARK_GRAY, GRAY, GREEN, LIGHT_GRAY, MAGENTA, ORANGE, PINK, RED, WHITE, YELLOW)定义颜色对象,如下设置按钮前景色:12.8 Font类使用awt包中的Font类设置组件的字体样式。Font类的构造方法:Public Font(String name, int style, int size);可以选择字体名字,如SansSerif,Serif,Monospaced,Dialog或DialogInput,可以选择字体,如Font.PLAIN(0),Font.BOLD(1), Font.ITALIC(2), Font.BOLD+ Font.ITALIC(3),用正整数来设定字体大小,如图所示下例。注意:如果系统支持其他字体,诸如“Times New Roman”,可以使用它来创建一个字体对象。为了找到系统中可用的字体,需要得到一个java.awt.GraphicsEnviroment类的实例,调用它的静态方法getLocalGraphicsEnvironment()。这个类是一个抽象类,描述特定系统的图形环境的,可以使用它的getAllFonts()方法获得当前系统可用的所有字体,如下程序代码。12.9 Swing GUI组件的一般属性已经使用过几个GUI组件(如JFrame,Container, JPanel, JButton, JLabel, JTextField)除了这些组件,还有很多其他的GUI组件,因此了解SwingGUI组件的一般特性非常重要。Component类是所有GUI组件和容器类的根类。所有的Swing GUI组件(除JFrame,JApplet,JDialog)都是JComponent的子类。如图列出Comonent,Container,和Jcomponent类常用的用于操纵属性诸如font,color,size等方法。一个tooltip(提示工具)是当把鼠标移动到组件上时组件上的文本显示,通常描述组件的作用。可以设置JComponent类任何对象的边框。Swing有几种类型的边框,new TitledBorder(String title)创建标题边框,new LineBorder(Color color, int width)创建线框,width是线的粗细。如下图,程序创建一个panel面板p1,上面放置3个按钮和一个面板p2,上面放置2个label标签,按钮jbtLeft的背景颜色设置为白色,按钮jbtCenter的前景色设置为绿色。按钮jbtRight的文本提示“This is the Right button”,标题边框设置在p1和p2上,线框被设置在label标
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广西物流职业技术学院招聘教职人员控制数205人模拟试卷带答案详解
- 2025福建三明机场发展集团有限公司招聘3人模拟试卷有完整答案详解
- 2025贵州贵阳学院高层次人才引进15人考前自测高频考点模拟试题及答案详解(新)
- 2025江苏兴化市招聘教师67人模拟试卷及完整答案详解1套
- 安全培训教师安全职责课件
- 2025年东北农业大学专职辅导员公开招聘16人考前自测高频考点模拟试题及答案详解(网校专用)
- 2025江西吉安市井冈山大学招聘177人考前自测高频考点模拟试题及答案详解(名校卷)
- 2025内蒙古赤峰市克旗银都矿业招聘4人考前自测高频考点模拟试题附答案详解(模拟题)
- 2025年湖南湘西州吉首市石家冲街道卫生服务中心招聘见习生考前自测高频考点模拟试题附答案详解(考试直接用)
- 河北省【中职专业高考】2025年中职高考对口升学(理论考试)真题卷【财经商贸大类】模拟练习
- 2025至2030中国无烟产品行业发展趋势分析与未来投资战略咨询研究报告
- 2025年中国华电集团招聘面试题解析及备考建议手册
- 2025年机器人面试题及答案解析
- 高三第一次月考总结主题班会课件
- 参考活动2 善待身边的人教学设计-2025-2026学年初中综合实践活动苏少版七年级下册-苏少版
- 2025年度江苏省档案管理及资料员基础试题库和答案
- 球墨铸铁管-施工方案(3篇)
- 口腔咨询顾问入门知识培训课件
- 新疆课课件教学课件
- 【2024版】健康知识竞赛题目及答案
- 2025年安徽省安庆市笔试辅警协警预测试题(附答案)
评论
0/150
提交评论