6-java图形界面程序开发.ppt_第1页
6-java图形界面程序开发.ppt_第2页
6-java图形界面程序开发.ppt_第3页
6-java图形界面程序开发.ppt_第4页
6-java图形界面程序开发.ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1,Java图形界面程序设计,ymzhang,2,本章主要内容:,1、AWT和Swing包2、MVC模块视图控制器3、设计小棍游戏的GUI界面4、Applet程序5、图形界面设计6、Graphics类的使用,3,1、让简单的事从容,让困难的事可行,让程序员轻松打造在所有平台上都让人满意的GUI。java1.0的AWT包适合开发applet重量级组件,依赖于底层的操作系统java2.0的Swing包java基础类JFC的一部分,由纯java代码编写轻量级组件,与平台无关,基于AWT可抽换的外观风格常见的可视化工具介绍,4,1、awt和swing的关系,Object,java.lang,java.awt,javax.swing,java.applet,Component,JFrame,Dialog,Frame,Panel,Windows,Container,Applet,顶级窗口类,JDialog,JWindow,JApplet,容器可包含其它容器以特定顺序装入/删除组件,getContentPane()内容嵌板来容纳组件,5,1、awt和swing的关系,组件类,Object,java.lang,java.awt,javax.swing,JComponent,JPopupMenu,JList,AbstractButton,Component,Container,JOptionPane,JTextComponent,JMenuBar,JScrollPane,JLabel,JPanel,JToggleButton,JButton,JMenuItem,JTextArea,JTextField,JCheckBox,JRadioButton,JMenu,JPasswordField,将相关组件放在一个面板,6,2、MVC模块视图控制器,任何可视化组件可总结为三方面:状态(模型)、表示(视图)、做什么(控制器)。,模型,内部状态,控制器,行为监视器,视图,外部显示,状态变化事件,鼠标键盘事件,java方法调用,改变状态,外观,可抽换外观风格,MotifWindowsMetal,7,2、事件驱动编程模型,事件由计算机硬件产生,通过操作系统和应用程序进行过滤,并由监听器来处理。java接口ActionListener抽象方法actionPerformed(ActionEvente)使用模型:创建一个ActionListener接口类,覆写actionPerformed方法;然后把需监听事件的组件注册进去class组件监听类implementsActionListenerpublicvoidactionPerformed(ActionEvente)if(e.getSource()=组件名).;new组件监听类对象需监听的组件对象名.addActionListener(监听对象);,通常把ActionListener写为无名内隐类:ActionListener监听对象=newActionListener()publicvoidactionPerformed(ActionEvente)if(e.getSource()=组件名).;,8,2、布局管理器,java组件的摆放位置,由布局管理器安排默认布局BorderLayoutContainercp=getContentPane();cp.add(“Center”,组件名);流式布局FlowLayoutcp.setLayout(newFlowlayout();cp.add(组件名);表格布局GridLayoutcp.setLayout(newGridLayout(列数,行数);cp.add(组件名);GridBagLayout,主要用于GUI建造工具BoxLayout,可以垂直或水平控制组件位置,9,2、JavaBeans组件编程模型,可视化编程:当你凭视觉将组件从组件盘拖拉至设计面板上,GUI建造工具便会自动为你写代码。通常你需要改变组件属性(MVC),建造工具会存储这些配置。JavaBeans,将类对应为可视化编程组件Bean命名规则:get属性,set属性add事件监听,remove事件监听放入标准的Bean容器内(JAR文件)Bean清单文件类名.mfBeanclasses,10,3、设计小棍游戏的GUI图形界面,设计思路:决定如何用输入、输出和控制组件与用户交互。,顶级窗口组件JFrame,输入小棍数JTextField,输入提示JLabel,取小棍操作按钮JButton,游戏进程跟踪JTextArea,组合面板JPanel,按钮监听ActionListener,11,3、设计小棍游戏的GUI图形界面,算法思路:用户和计算机对弈,先让用户走,假如游戏没有结束,执行计算机的移动。Letusermove.Ifgame:gameisntoverandcomputerturnletthecomputermove.game:howmanysticksareleft.display:reporthowmanysticksareleft.Ifgame:gameisoverStopacceptingmoves.Reportthewinner.,12,3、设计小棍游戏的GUI图形界面,设计窗口,初始化窗口属性。importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassOneRowNimGUIextendsJFrameimplementsActionListener/内隐监听类privateOneRowNimgame;publicOneRowNimGUI(StringTitle)game=newOneRowNim(21);buildGUI();/构造组件并摆放在内容嵌板上setTitle(title);setVisible(true);,13,3、设计小棍游戏的GUI图形界面,构造组件,摆放在窗口中。privateJTextAreadisplay;privateJTextFieldinField;privateJButtongoButton;privatevoidbuildGUI()ContainercontentPane=getContentPane();contentPane.setLayout(newBorderLayOut();display=newJTextArea(20,30);display.setText(“Thereare”+game.getSticks()+”Sticks.n”+”Pickup1,2or3atatime.n”+”Yougofirst.n”);contentPane.add(“Center”,display);,14,3、设计小棍游戏的GUI图形界面,构造组件,摆放在窗口中。inField=newJTextField(10);goButton=newJButton(“TakeSticks”);goButton.addActionListener(this);JPanelinputPanel=newJPanel();inputPanel.add(newJLabel(“Howmanysticksdoyoutake:”);inputPanel.add(inField);inputPanel.add(goButton);contentPane.add(“South”,inputPanel);/buildGUI,15,3、设计小棍游戏的GUI图形界面,覆写监听器的事件响应publicvoidactionPerformed(ActionEvente)if(e.getSource()=goButton)userMove();computerMove();intstickLeft=game.getSticks();display.append(stickLeft+“sticksleft.n”);if(game.gameOver()endGame();/endif事件/endactionPerformed,16,3、设计小棍游戏的GUI图形界面,编写人机对弈的GUI显示privatevoiduserMove()intuserTakes=Integer.parseInt(inField.getText();if(game.takeSticks(userTakes)display.append(“Youtake”+userTakes+”.n”);elsedisplay.append(“Youcanttake”+userTakes+”,tryagain.n”);/userMove,17,3、设计小棍游戏的GUI图形界面,编写人机对弈的GUI显示privatevoidcomputerMove()if(game.gameOver()return;if(game.getPlayer()=2)game.takeSticks(1);/tempstrategydisplay.append(“Itakeonestick.n”);/endifcomputerTake/endcomputerMove,18,3、设计小棍游戏的GUI图形界面,编写游戏结束的GUI显示privatevoidendGame()goButton.setEnabled(false);inField.setEnabled(false);if(game.getWinner()=1)display.append(“Gameover.Youwin.n”);elsedisplay.append(“Gameover.Iwin.n”);/endGame()编写运行的main()publicstaticvoidmain(Stringargs)newOneRowNimGUI(“WelcomtooneRowNimgame”);/endmain(),19,4、applet-运行于web浏览器的小程序,java最初的成功之处就是Applet,运行于浏览器上,可以生成生动美丽的页面,进行友好的人机交互,同时还能处理图像、声音、动画等多媒体数据。没有安装问题:直接嵌入到页面中,由支持Java的浏览器(IE或Nescape)解释执行安全无破坏:Applet被下载到用户的计算机上执行,但处在java的安全监督机制下。自动和HTML集成:与一般的应用程序不同,Applet程序必须嵌入在HTML页面中,才能得到解释执行;同时Applet可以从Web页面中获得参数,并和Web页面进行交互。,20,4、applet和浏览器结合,网页中的applet标记appletviewer是一个运行applet的简化浏览器,方便我们调试applet程序。如何解决不同浏览器的java统一风味?InternetExplorer的ActiveX控制组件Netscape的plug-in插入式组件代价:html码必须提供同时支持以上两者的标记,21,4、Applet类介绍,Applet类是所有Applet应用的基类(java.applet.*)publicvoidresize(intwidth,intheight);/调整Applet运行的窗口尺寸。publicvoidshowStatus(Stringmsg);/在浏览器的状态条中显示指定的信息。publicImagegetImage(URLurl,Stringname);/按url指定的地址和文件名加载图像。publicAudioClipgetAudioClip(URLurl,Stringname);/按url指定的地址和文件名获取声音。publicvoidplay(URLurl);/加载并播放一个url指定的音频剪辑。,22,4、Applet运行控制,Applet类有四种基本方法控制程序运行init()自动调用,负责初始化工作:完成从网页向Applet传递参数,添加用户界面的基本组件等操作。start()系统在调完init()后自动调用start()方法,显示内容。每当用户离开包含该Applet的主页后又再返回时,系统又会再执行一遍start()方法。stop()用户离开Applet所在页面时执行,停止一些耗用系统资源的工作以免影响系统的运行速度,且并不需要人为地去调用该方法。destroy()在浏览器关闭的时候自动执行。收回占用的非内存独立资源。,23,4、小棍游戏GUI改写为applet,编写运行的init()importjavax.swing.*publicclassOneRowNimGUIAppletextendsJApplet.publicvoidinit()newOneRowNimGUI(“WelcomtooneRowNimgame”);/endinit()/endclass当这个applet在浏览器运行时,将打开一个独立的顶层窗口,GUI没有直接嵌入web页.原则:不能将一个顶层窗口添加到另一个顶层窗口,24,4、小棍游戏GUI改写为applet,改写GUI从JFrame到JPanelpublicclassOneRowNimGUIextendsJPanelimplementsActionListener/JPanel子类.publicOneRowNimGUI()/JPanel没有标题game=newOneRowNim(21);buildGUI();/JPanel没有pack(),publicclassOneRowNimGUIextendsJFrameimplementsActionListener/内隐监听类privateOneRowNimgame;publicOneRowNimGUI(StringTitle)game=newOneRowNim(21);buildGUI();/构造组件并摆放在内容嵌板上setTitle(title);setVisible(true);pack();/根据窗口里面的布局及组件确定frame的最佳大小,25,4、小棍游戏GUI改写为applet,改写GUI从JFrame到JPanelprivatevoidbuildGUI()display=newJTextArea(20,30);.add(“Center”,display);.add(“South”,inputPanel);/*JPanel本身就是内容面板,可直接添加组件*/,privatevoidbuildGUI()ContainercontentPane=getContentPane();contentPane.setLayout(newBorderLayOut();display=newJTextArea(20,30);.contentPane.add(“Center”,display);.contentPane.add(“South”,inputPanel);,26,5、图形界面设计,用户必须有效执行输入、输出、控制和引导的任务选择组件:为输入、输出、控制和引导分别选择相应的swing组件选择顶级窗口:一般常用JApplet和JFrame两个重量级组件设计布局:摆列组件以便引人注意和易于使用,顶级窗口组件JFrame,输入小棍数JTextField,输入提示JLabel,取小棍操作按钮JButton,游戏进程跟踪JTextArea,组合面板JPanel,JFrame(Border)displayJTextAreainputJPanel(Flow)promptJLabelinputJTextFieldrunJButton,27,5、监听窗口关闭事件,main()中,应有窗口关闭的处理GUI类对象名.addWindowsListener(newWindowAdapter()/内隐类publicvoidwindowsClosing(WindowEvente)System.exit(0);/endwindowsClosing);/添加窗口监听器适配器类,实现特定接口的抽象方法。对于ActionListener只有一个方法,可以直接实现对于WindowsListener有7种方法,实现接口必须实现所有抽象方法。适配器类使我们可以只改写一种方法,处理特定事件。,28,5、GUI设计问题1-输入,输入域内容必须手工清除添加语句,重置输入域内容例:小棍游戏中userMove()中添加inField.setText(“”);/清除输入域的之前内容用户必须在键盘和鼠标之间切换在组件监听器中添加输入组件监听例:小棍游戏中初始化函数buildGUI()中添加inField.addActionListener(this);/回车键也产生事件原则:尽量减少用户的操作量,29,5、GUI设计问题2-组件管理,当组件过多时,应当分群计算器程序,12个数字按钮可组成一个JPanel在程序中管理这12个按钮可以用数组当组件过多时,要选择适当的布局管理器一般使用Border和Flow,但对计算器的数字按钮,显然GridLayout更适合例:setLayout(newGridLayout(4,3,1,1);/将计算器数字按钮排成4行3列,行列间距1的形式原则:尽量减少组件管理的复杂度原则:适当的布局,可引导用户行为,30,5、GUI设计问题3-组件聚合性,操作过程中相关的组件,应聚合在一起FlowLayout对组件排列的控制最少,且对面板大小敏感通过JPanel的设立,可以嵌套使用布局管理器例:BoxLayout提供多个组件以垂直或水平形式排列例:setLayout(newBoxLayout(jpanel,BoxLayout.Y_AXIS);setLayout(newBoxLayout(jpanel,BoxLayout.X_AXIS);,BorderLayout,East,South,31,5、GUI设计问题4-复选框和单选钮,复选框的使用privateJCheckBoxtitles=newJCheckBox3;privateStringtitleLabels=“1”,”2”,”3”;for(intk=0;ktitles.length;k+)titlesk=newJCheckBox(titlelabelsk);titlesk.addItemListener(this);choicePanel.add(titlesk);ItemListener接口处理组件项目事件,只有一个方法publicvoiditemStateChange(ItemEvente)if(titlesk.isSelected()./改写复选框按钮处理原则:用数组简化复选按钮的实例化和初始化工作,32,5、GUI设计问题4-复选框和单选钮,单选钮的使用privateJRadioButtonoptions=newJRadioButton3;privateStringoptionLabels=“1”,”2”,”3”;privateButtonGroupoptGroup=newButtonGroup();for(intk=0;koptions.length;k+)optionsk=newJRadioButton(optionLabelsk);optionsk.addItemListener(this);choicePanel.add(optionsk);optGroup.add(optionsk);options0.setSelected(true);ButtonGroup的作用是迫使成员互相排斥,33,6绘图Graphics类,尽管有了GUI组件,有时仍然需要直接绘制图形java.awt.Graphics是一个抽象类,其作用是定义一个真正的工具,用来接受图形操作。java的Container,可以引用Graphics对象voidpaint(Graphicsg)GraphicsgetGraphics()paint是系统回调函数,用户不能主动调用。需要进行重绘时,要使用repaint方法,当用户调用repaint方法后,实际上,系统后台调用了paint方法,34,6Graphics类的使用-显示文字,显示文字是Java中最基本的功能,只要使用类Graphics中的drawString()函数就能实现。importjava.awt.Graphics;importjava.applet.Applet;publicclassTestGraphicsextendsAppletprivateStringtext=“HelloWorld”;publicvoidpaint(Graphicsg)g.drawString(text,20,20);/在坐标20,20处显示文本,35,6Graphics类的使用-交互显示,用户可以通过鼠标、键盘来实现互动显示importjava.awt.Graphics;importjava.applet.Applet;publicclassTestGraphicsextendsApplet.publicbooleanmouseDown(Eventevt,intx,inty)/鼠标按下处理函数text=“mousedown”repaint();/鼠标按下时,在坐标20,20处重写提示publicbooleanmouseUp(Eventevt,intx,inty).;publicbooleankeyDown(Eventevt,intx,inty).;publicbooleankeyUp(Eventevt,intx,inty).;,36,6Graphics类的使用-显示图片,Graphics类的drawImage方法用来显示Image对象。为了提高图像的显示效果,许多Applet都采用双缓冲技术:首先把图像装入内存,然后再显示在屏幕上。importjava.awt.Graphics;importjava.

温馨提示

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

评论

0/150

提交评论