java图形用户界面编程-c 图形界面编程
Java的图形用户界面清华大学计算中心1999,104Java的图形用户界面主要内容Java的GUI简介自定义图形设计图形、文字、图象Java的标准组件容器和组件事件处理GUI的布局Java的图形用户界面程序的图形用户界面(GUI)字符界面用字符串、命令行的方式与用户交互图形用户界面:Graphics User Interface用直观的图形来表示数据用直观、方便的GUI标准组件来接收命令GUI组成成分的标准化Java的图形用户界面编程:包Java的图形用户界面图形用户界面的构成图形用户界面的构成容器:布局、安排标准组件用户自定义成分设计&实现图形用户界面的工作创建GUI各组成成分,并安排从属位置关系定义GUI各成分对不同事件的响应,实现与用户的交互功能Java的图形用户界面AWT包GUI的组成用户自定义成分GUI标准组件、事件处理Abstruct Windows Toolkit提供各种构成GUI的标准构件抽象:抽取不同软硬件平台中所实现的窗口的公共特性,针对一个只具有上述公共特性的虚窗口操作依赖于具体平台系统实现:显示效果可能不同Java的图形用户界面从一个简单窗口开始创建GUI应用程序Frame必不可少先来建一个空的窗口应用:注意:一定要处理关闭窗口的事件Java的图形用户界面绘制用户自定义成分用户自定义成分属于构成GUI的非标准部分无法响应用户事件一般仅仅起背景装饰、输出效果突出的作用Java中的用户自定义成分显示文字绘制图形显示图片Java的图形用户界面绘制用户自定义成分(续)使用awt包中的Graphics类的相关方法获得Graphics类的实例:画到哪里使用paint(Graphics g)方法Java程序图形界面的坐标设置原点(0,0)X轴Y轴Java的图形用户界面显示文字字体显示效果类:FontFont mf = new Font(String 字体,int 风格,int 字号);字体:TimesRoman, Courier, Arial等风格:三个常量, , 字号:字的大小(磅数)获取当前使用的字体:getFont()设置当前使用的字体:setFont(Font fn)例:Java的图形用户界面绘制图形及其相关方法从(x1,y1)到(x2,y2)画直线drawLine(x1,y1,x2,y2)均为int以(x,y)为左上角、w为宽度、h为高度画矩形drawRect(x,y,w,h) 均为intfillRect()、clearRect()Java的图形用户界面绘制图形及其相关方法(续)画圆或椭圆drawOval(x,y,w,h)x,y,w,h确定了圆或椭圆的矩形范围画实心圆或椭圆fillOval(x,y,w,h)画多边形drawPolygon(X坐标数组java图形用户界面编程,Y坐标数组,个数)Java的图形用户界面绘制图形及其相关方法(续)例子: Java的图形用户界面paint()与update()某组件的paint()和 update()为系统自动调用的有关图形绘制的方法,不可人为编程调用;但可编程重新定义其操作内容使用repaint()方法可以触发update()方法paint( )当某些操作破坏了显示,需重新绘制时第一次绘制repaint()编程控制1. 擦除并填充成背景色2. 调用paint()update()调用Java的图形用户界面显示图象图形与图象,java支持gif和jpeg格式保存二进制图象的类获取Image对象的方法getImage(图象文件所在的URL)getImage(图象文件所在的URL,图象文件名)Applet类以及中均有方法的定义注意:在application中只能使用Toolkit,而在Applet中,两者均可使用Java的图形用户界面显示图象(续)显示图象的方法drawImage(Image对象,x,y,背景色, ImageObserver);类中定义了此方法ImageObserver为一个接口,java的组件类实现了此接口,此处可理解为观察/显示Image对象容器,编程时一般可使用this表示颜色的类Color:含有各种颜色常量Color(red,green,blue)来创建非缺省色例:Java的图形用户界面显示图象(续)深入使用MediaTracker的使用addImage()、 waitForAll/ID()动画消除闪烁重写(覆盖)update方法利用双缓冲动画要用到多线程技术Java的图形用户界面课下练习(一)利用直线、矩形、圆、椭圆随意组合成一个有意义的图形绘制在Applet中;参照本页右上角的同心圆绘制计算机软硬件体系结构示意图,如最内层为“裸机” 等等,每一层上都标注相应的文字说明网上抓一副你喜欢的图象显示在Applet中Java的图形用户界面GUI标准组件Component:大部分组件类的祖先(除菜单)显示功能:paint(), update(), repaint()显示效果控制:字体、颜色、位置、尺寸图象处理:一般利用Canvas和Container来显示图像事件处理机制(java ):addXXXListener( )removeXXXListener( )Java的图形用户界面GUI标准组件(续)简单构件:人机交互的基本工具(控制)Button,Checkbox,Choice,Label,List等TextComponent(TextArea,TextField)Canvas复杂构件:Container(安放排列其他构件的容器)PanelWindowJava的图形用户界面AWT构件层次关系图Component Container ButtonTextComponentCheckboxTextAreaTextField PanelApplet Window Frame Dialog MenuComponentMenuMenuBarMenuItemJava的图形用户界面GUI基本组件类(一)Checkbox(检测盒)创建时指定检测盒的标签Checkbox cb = new Checkbox(“registered”);获取和设置检测盒的状态(true);boolean b=();CheckboxGroup(单选按钮组)单选按钮组是一组Checkbox的集合首先创建CheckboxGroup,再加入单个按钮例:new Checkbox(“male”, 组名, false);Java的图形用户界面GUI基本组件类(二)List(列表)首先创建List对象,再调用addItem()方法加入List列表的各选项List list1 = new List(2,false);(“class A”);(“class B”);(“class C”);构造函数的参数:(显示项数,是否复选)Java的图形用户界面GUI基本组件类(三)TextArea(String, int, int)TextArea ta1 = new TestArea(10,45);建10行、45列的文本区域TextField (String, int) TextField tf1 = new TextField(30);接受用户的输入:()返回String设置文本区域的显示:(“O”)Java的图形用户界面GUI基本组件类(四)Label(标签)Label myl = new Label(“标签内容”);设置标签内容:(“新内容”);Button(按钮)Button myB = new Button(“Cancel”);Java的图形用户界面Container(容器)排列其中包容的构件定位布局策略 set/getLayout()成组显示其中包容的构件增加组内构件: add( )删除组内构件: remove( )控制是否显示容器及其中组件setVisible(true/false)setVisible()为Component的方法Java的图形用户界面Container(容器)(续)Panel(面板)Applet类Window:无边框、菜单的空白窗口Frame:用于Application含边框、菜单的 独立窗口,与 Applet平级Dialog依赖于 Frame的非 独立窗口Java的图形用户界面布局管理布局管理器用于控制组件在容器中的布局种类:FlowLayout: 组件在一行中从左至右水平排列,排满后折行BorderLayout:北、南、东、西、中CardLayout:每一个组件作为一个卡片,容器仅显示多个卡片中的某一个Java的图形用户界面布局管理(续)GridLayout:以行和列的网格形式安排组件GridBagLayout:使用复杂、功能灵活缺省的布局管理器FlowLayout:缺省的Panel布局管器BorderLayout:缺省的窗口容器的管理器改变缺省布局管理器的方法;例:BorderLayout B=new BorderLayout();(B);Java的图形用户界面利用AWT创建自己的GUIGUI外观设计设计标准构件层次关系:构件层次结构关系树生成标准构件设置复杂构件布局策略:setLayout()向复杂构件中添加组成构件:add()方法构件事件处理Java的图形用户界面例:用构件组成GUI例:AWTComponent程序创建并使用Button、Label、TextField创建并使用List改变缺省布局管理器还缺什么?Java的图形用户界面的事件处理使用单一的类来接受所有类型的事件;使用action(), handleEvent( )以及其他的一些事件处理方法(如鼠标事件、键盘事件、焦点事件)来进行相应事件的事件处理。
缺点:造成长if分支语句组,不利于面向对象的编程Java的图形用户界面 UI对事件处理的改进引入包更加面向对象,易于理解定义了事件的“发生者”和“监听者”对象事件以类层次来表达,取代了中的单一的类,并可以自定义事件类型Java的图形用户界面事件处理机制组件(事件发生者)触发一个相应类型的事件此事件由相应类型的Listener(事件监听者)接收并处理Button 1事件发生者接收事件e,并做处理ActionListener事件监听者触发ActionEvent e点击,Java的图形用户界面几个有用的概念事件 - 在包中定义了若干类型的事件类监听者接口 - 特定类型的Listener接口,用于监听特定类型的事件监听者类 - 是实现了某种监听者接口的类java图形用户界面编程,由编程者定义事件监听者 - 是某个监听者类的对象,由编程者使用new创建Java的图形用户界面实现步骤根据需要定义相应类型的监听者类,在类的定义中完成事件的处理(建议使用inner class定义);创建事件监听者对象;为将会触发事件的组件C注册相应的事件监听者对象(使用C的addXXXListener()方法)。举例:Java的图形用户界面事件与监听者类型XXXListener接口与XXXEventXXX为特定类型常用类型:Action, Focus,Key, Window, MouseEvent vs.Mouse/MouseMotionListener注册与取消:组件包含的新方法addXXXListener()与removeXXXListener()参考:Java的图形用户界面监听者接口中有什么?每种Listener接口均定义了一套abstract方法,编程者必须在监听者类中实现这些方法来做事件处理;例:ActionListeneractionPerformed()WindowListenerwindowOpened/Closing/Closed/Activated/Deactivated/Iconified/Deiconified()Java的图形用户界面使用Listener Adapter由于接口中的方法为abstract方法,所以在监听者类中要实现所有的方法,较为烦琐。
为了简化编程,引入了Adapter。具有两个以上方法的监听者接口均对应一个XXXAdapter类,提供了接口中每个方法的缺省实现。Java的图形用户界面使用Listener Adapter(续)例:class MyWindowListener extends WindowAdapter { public void windowClosing(WindowEvent e) {(0); }}参考:例:(相应鼠标事件)Java的图形用户界面菜单菜单须依附于一个实现了MenuContainer接口的对象:Frame, MenuBar, Menu构建菜单结构:创建菜单的步骤创建菜单条(MenuBar)创建菜单(Menu),加入相应菜单条创建菜单项(MenuItem),加入相应菜单使菜单条依附于拥有它的对象:setMenuBar()编写响应菜单操作的代码(ActionEvent)例:Java的图形用户界面课下练习(二)创建一个Frame,有三个Button和一个TextField,点击Button,在TextField上显示Button信息。在Frame上创建一个TextArea,使之能够记录鼠标在Frame上的进入、点击等情况。
(可使用MouseAdapter和MouseMotionAdapter)。Java的图形用户界面Toolkit toolkit=(); public Color(float r, float g, float b); public Color(int rgb); public Color(int r, int g, int b); 1. 利用MediaTracker的public void addImage(Image image, int id); public void addImage(Image image, int id, int w, int h);方法,以及waitForAll/ID()方法可以等待和监视图片的读入。2. 双缓冲:利用一个Image对象接收画图(利用Image的getGraphics()方法获得Graphics context),再在paint()方法中一次显示。3. 缺省update()方法要清屏,再调用paint();如果重写(覆盖)update()方法,可使之不清屏。