java图形生成界面.ppt_第1页
java图形生成界面.ppt_第2页
java图形生成界面.ppt_第3页
java图形生成界面.ppt_第4页
java图形生成界面.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

主要内容1简单GUI程序2事件处理机制 第8讲GUI 1 简单GUI程序 Java1 0的出现带来了抽象窗口工具箱 AWT 设计目标是希望构建一个通用的GUI 使得利用它编写的程序能够运行在所有的平台上 以实现Sun公司提出的口号 一次编写 随处运行 在Java1 2中 Sun公司推出了新的用户界面库 Swing 相对AWT来说 Swing功能更强大 使用更方便 它的出现使得Java的图形用户界面上了一个台阶 但是 Swing并没有代替AWT 在Java1 1中 AWT事件处理模型有了根本改变 Swing使用的仍然是Java1 1的事件处理模型 第一个图形用户界面 在Java中 顶层窗口称为框架 在AWT库中 对应于框架的类是Frame 在Swing库中 相应的类是JFrame JFrame类扩展了Frame类 大部分AWT组件在Swing中都有等价的组件 它们在表示形式上差一个 J 框架是一个容器 我们可以在这个容器中放入其他一些图形用户界面组件 如按钮 菜单等 从而组成一个功能完善的程序 1 显示一个空框架importjavax swing publicclassFirstFrame publicstaticvoidmain String args SimpleFrameframe newSimpleFrame 设置用户关闭框架时的响应动作frame setDefaultCloseOperation JFrame EXIT ON CLOSE classSimpleFrameextendsJFrame publicSimpleFrame 设置框架大小setSize WIDTH HEIGHT publicstaticfinalintWIDTH 300 publicstaticfinalintHEIGHT 200 运行结果 1 2框架外观 JFrame类的继承层次图 Component类是所有GUI对象的祖先 Window类是Frame类的父类 JFrame类直接从Frame继承而来 对于框架外观的操作比较重要的方法如下 setIconImage 窗口最小化 在Java中称为图标化 时 把一个Image对象用作图标 setTitle 设置窗口中标题栏的文字 setResizable 设置用户是否可以改变框架大小 dispose方法 关闭窗口 并回收该窗口的所有资源 setLocation 设置组件的位置 setBounds 重新设置组件的大小和位置 框架外观的设置设置具有以下特征的框架 它的高度和宽度为整个屏幕的1 3 自定义窗口的标题和图标 窗口的大小不可变 程序代码见FrameSizeSet java 运行结果如下 图标 标题 最大化按钮失效 FrameSizeSet javaimportjava awt importjavax swing publicclassFrameSizeSet publicstaticvoidmain String args FrameSizeframe newFrameSize frame setDefaultCloseOperation JFrame EXIT ON CLOSE frame show classFrameSizeextendsJFrame publicFrameSize 设置标题setTitle 框架尺寸 获得屏幕的相关尺寸Toolkittk Toolkit getDefaultToolkit DimensionscreenSize tk getScreenSize intscreenHeight screenSize height intscreenWidth screenSize width 设置框架的尺寸 大小不可调setSize screenWidth 3 screenHeight 3 setResizable false 设置图标Imageimg tk getImage icon gif setIconImage img 在框架中显示信息 JFrame窗格 RootPane LayeredPane GlassPane和ContentPane 如果需要将一些图形用户界面元素加入到框架中 我们需要在面板组件 JPanel 中进行绘制 然后将该面板组件加入到框架的内容窗格 ContentPane 中 相应的代码如下 得到JFrame的内容窗格对象ContainercontentPane getContentPane Componentc 将组件加入到内容窗格中contentPane add c 面板JPanel类本身是容器 它可以容纳其他图形用户界面元素 如按钮 菜单等 为了在面板中进行绘制 需要重载JComponent类的paintComponent方法 classMyPanelextendsJpanel publicvoidpaintComponent Graphicsg super paintComponent g 相关的绘制代码 paintComponent方法是自动执行的 当窗口需要被重新绘制时 如用户缩放窗口 或还原已最小化的窗口时 系统就会自动调用该方法 在框架中显示信息程序代码见HelloWorld java 运行结果如下 HelloWorldimportjavax swing importjava awt publicclassHelloWorld publicstaticvoidmain String args TextFrameframe newTextFrame frame setDefaultCloseOperation JFrame EXIT ON CLOSE frame show classTextFrameextendsJFrame publicTextFrame setTitle HelloWorld setSize WIDTH HEIGHT 将panel加入到frameTextPanelpanel newTextPanel ContainercontentPane getContentPane contentPane add panel publicstaticfinalintWIDTH 300 publicstaticfinalintHEIGHT 200 classTextPanelextendsJPanel publicvoidpaintComponent Graphicsg super paintComponent g g drawString Hello World x y publicintx 100 publicinty 100 采用 宋体 显示字符串 你好 Java 字体风格为加粗 倾斜 大小为20点 FontSetimportjava awt importjava awt font importjavax swing publicclassFontSet publicstaticvoidmain String args FontFrameframe newFontFrame frame setDefaultCloseOperation JFrame EXIT ON CLOSE frame show classFontFrameextendsJFrame publicFontFrame setTitle 设置字体 setSize WIDTH HEIGHT 将panel加入到frameFontPanelpanel newFontPanel ContainercontentPane getContentPane contentPane add panel publicstaticfinalintWIDTH 300 publicstaticfinalintHEIGHT 200 classFontPanelextendsJPanel publicvoidpaintComponent Graphicsg super paintComponent g 设置字体Fontf newFont 宋体 Font BOLD Font ITALIC 20 g setFont f 显示文本g drawString 你好 Java x y publicintx 75 publicinty 100 简单图形的绘制直线 弧 多边形的绘制 importjava awt importjavax swing publicclassSimpleDraw publicstaticvoidmain String args DrawFrameframe newDrawFrame frame setDefaultCloseOperation JFrame EXIT ON CLOSE frame show classDrawFrameextendsJFrame publicDrawFrame setTitle 简单图形绘制 setSize WIDTH HEIGHT 将panel加入到frameDrawPanelpanel newDrawPanel ContainercontentPane getContentPane contentPane add panel publicstaticfinalintWIDTH 300 publicstaticfinalintHEIGHT 200 classDrawPanelextendsJPanel publicvoidpaintComponent Graphicsg super paintComponent g intx1 50 inty1 50 intx2 50 inty2 150 intradius 100 半径intstartAngle 90 起始角度intarcAngle 180 弧的角度g drawLine x1 y1 x2 y2 画线g drawArc x1 radius 2 y1 radius radius startAngle arcAngle 画弧Polygonp newPolygon x1 150 y1 50 radius 2 inti for i 0 i 6 i p addPoint int x1 radius Math cos i 2 Math PI 6 int y1 radius Math sin i 2 Math PI 6 g drawPolygon p 画六边形 2事件处理机制 2 1事件处理原理 如果用户在用户界面执行了一个动作 这将导致一个事件的发生 事件是描述发生了什么的对象 在Java中 定义了各种不同类型的事件类 用来描述各种类型的用户操作 事件是由事件源产生的 事件的产生者称为事件源 例如 在Button组件上点击鼠标会产生以这个Button为源的一个事件 ActionEvent 事件源拥有自己的方法 我们通过它向其注册事件监听器 事件监听器是一个类的实例 这个类实现了一个特殊的接口 称为Lintenerinterface 当事件源产生了一个事件以后 事件源就会发送通知给相应的事件监听器 监听器对象根据事件对象内封装的信息 决定如何响应这个事件 我们可以通过以下方法来注册监听器对象 eventSourceObject addEventListener eventListenerObject 以按钮类对例 MyActionListenerlistener JButtonbutton newJButton 提交 button addActionListener listener 监听器对象listener所属的类MyActionListener必须实现相应的接口 以响应事件 publicclassMyActionListenerimplementsActionListener publicvoidactionPerformed ActionEventevent 相应的响应操作 2 2处理按钮点击事件 创建按钮 JButtonMyButton newJButton Java 通过Container类的Add方法 将组件加入到该容器中 classMyPanelextendsJPanel publicMyPanel JButtonMyButton newJButton Java add MyButton 为按钮设置监听器 指定的监听器必须实现ActionListener接口的actionPerformed方法 publicvoidactionPerformed ActionEventevent 例 点击按钮采用内部类ButtonAction充当事件监听器 在面板中放置两个按钮 当用户点击其中一个按钮时 面板中显示对应的操作 例如 如果点击 按钮一 显示 您点击的是 按钮一 程序代码见ButtonClick java 运行结果如下 ButtonClick javaimportjava awt importjava awt event importjavax swing publicclassButtonClick publicstaticvoidmain String args ButtonFrameframe newButtonFrame frame setDefaultCloseOperation JFrame EXIT ON CLOSE frame show classButtonFrameextendsJFrame publicButtonFrame setTitle ButtonClick setSize WIDTH HEIGHT 将panel加入到frameButtonPanelpanel newButtonPanel ContainercontentPane getContentPane contentPane add panel publicstaticfinalintWIDTH 300 publicstaticfinalintHEIGHT 200 classButtonPanelextendsJPanel publicButtonPanel 创建按钮JButtonButton1 newJButton 按钮一 JButtonButton2 newJButton 按钮二 将按钮加入paneladd Button1 add Button2 创建监听器ButtonActionButtonAction1 newButtonAction 按钮一 ButtonActionButtonAction2 newButtonAction 按钮二 注册监听器Button1 addActionListener ButtonAction1 Button2 addActionListener ButtonAction2 publicvoidpaintComponent Graphicsg super paintComponent g 显示用户的点击操作g drawString 您点击的是 ButtonText 90 120 privateclassButtonActionimplementsActionListener publicButtonAction Stringtext clicktext text publicvoidactionPerformed ActionEventevent ButtonText clicktext repaint privateStringclicktext publicStringButtonText 2 3捕获窗口事件 JFrame对象是窗口事件 WindowEvent 的事件源 我们要指定一个监听器对象 MyWindowListenerlistener frame addWindowListener listener 监听器对象要实现WindowListener接口 WindowListener接口中共有七个方法 它们分别对应七个窗口事件 publicinterfaceWindowListener voidwindowOpened WindowEvente voidwindowClosing WindowEvente voidwindowClosed WindowEvente voidwindowIconified WindowEvente voidwindowDeiconified WindowEvente voidwindowActivated WindowEvente voidwindowDeactivated WindowEvente WindowListener接口实现方法一 定义一个类来实现WindowListener接口 在感兴趣的方法中添加我们需要的代码 然后让其他方法为空即可 classQuitWindowimplementsWindowListener publicvoidwindowClosing WindowEvente System exit 0 voidwindowOpened WindowEvente voidwindowClosed WindowEvente voidwindowIconified WindowEvente voidwindowDeiconified WindowEvente voidwindowActivated WindowEvente voidwindowDeactivated WindowEvente WindowListener接口实现方法二 Java为每个具有多个方法的AWT监听器接口提供了一个适配器类 适配器类实现了监听器接口的所有方法 但是却不做任何实际工作 与WindowListener接口对应的WindowAdapter类实现了以上七个空方法 我们只需要通过扩展适配器类来实现我们感兴趣的方法 classQuitWindowextendsWindowAdapter publicvoidwindowClosing WindowEvente System exit 0 例 捕获窗口事件捕获窗口的关闭事件 程序代码见WindowClosing java WindowClosing javaimportjavax swing importjava awt event publicclassWindowClosing publicstaticvoidmain String args SimpleFrameframe newSimpleFrame 设置用户关闭框架时的响应动作frame addWindowListener newWindowAdapter publicvoidwindowClosing WindowEvente System exit 0 显示该框架frame show classSimpleFrameextendsJFrame publicSimpleFrame 设置框架大小setSize WIDTH HEIGHT publicstaticfinalintWIDTH 300 publicstaticfinalintHEIGHT 200 2 4AWT事件层次结构图 AWT事件类的继承关系图 AWT将事件分为两类 语义 Semantic 事件ActionEvent 对应按钮点击 菜单选择 列表框选择 在文本域中按回车键等 AdjustmentEvent 用户调整滚动条 ItemEvent 用户从一组选择框或者列表项中进行选择 TextEvent 文本域或者文本框中的内容发生改变 低级 Low Level 事件ComponentEvent 组件大小改变 移动 显示或者隐藏 KeyEvent 键盘上的一个键被按下或者释放 MouseEvent 鼠标按键被按下 释放 鼠标移动或者拖动 FocusEvent 组件获得焦点或者失去焦点 WindowEvent 窗口被激活 屏蔽 最小化 最大化或关闭 ContainerEvent 添加或者删除一个组件 2 5焦点事件 如果某个组件能够接收用户按键 那么该组件就拥有焦点 拥有焦点的组件在显示形式上与其他组件有一些差别 文本域内会显示光标 按钮四周会显示一个由虚线组成的矩形框 可以捕获丢失的焦点事件来进行输入的合法性检查 如果输入不合法 通过调用requestFocus方法把焦点重新移回到该文本域 提示用户重新输入 publicvoidfocusLost FocusEventevent passText为需要进行合法性检查的文本域if event getComponent passText 2 6键盘事件 KeyListener接口中有三个方法 publicvoidkeyPressed KeyEvente publicvoidkeyReleased KeyEvente publicvoidkeyTyped KeyEvente Java对于用户按键的处理过程 当前键盘状态为小写状态 要输入一个大写字母 A 我们的操作过程为 先按住Shift键不放 再按下A键 然后松开 整个过程Java会产生五个事件 按下Shift键 为VK SHIFT调用keyPressed方法 按下A键 为VK A调用keyPressed方法 键入字符 A 为字符 A 调用keyTyped方法 松开A键 为VK A调用keyReleased方法 松开Shift键 为VK SHIFT调用keyReleased方法 例 捕获键盘事件用户每次按下键盘上的某个键 程序捕获键盘输入 并显示在面板中 内容包括 虚拟键码 键的名称和字符 例如 当前键盘状态为小写状态 用户按下 A 键 显示的值依次为 65 A a 程序代码见KeyPress java 运行结果如下 KeyPress javaimportjava awt importjava awt event importjavax swing publicclassKeyPress publicstaticvoidmain String args KeyFrameframe newKeyFrame frame setDefaultCloseOperation JFrame EXIT ON CLOSE frame show classKeyFrameextendsJFrame publicKeyFrame setTitle KeyPress setSize WIDTH HEIGHT 将panel加入到frameKeyPanelpanel newKeyPanel ContainercontentPane getContentPane contentPane add panel publicstaticfinalintWIDTH 300 publicstaticfinalintHEIGHT 200 classKeyPanelextendsJpanelimplementsKeyListener publicKeyPanel addKeyListener this 注册监听器publicbooleanisFocusTraversable returntrue 允许面板获得焦点publicvoidpaintComponent Graphicsg super paintComponent g if KeyVirtualCode 1 输出虚拟键码g drawString 虚拟键码 100 80 elseg drawString 虚拟键码 KeyVirtualCode 100 80 g drawString 键名称 KeyText 100 110 输出键的名称g drawString 字符 KeyChar 100 140 输出字符 publicvoidkeyPressed KeyEventevent 得到虚拟键码 KeyVirtualCode event getKeyCode publicvoidkeyReleased KeyEventevent KeyVirtualCode event getKeyCode 得到键的名称KeyText event getKeyText KeyVirtualCode if isChar KeyChar isChar false repaint publicvoidkeyTyped KeyEventevent 得到字符 KeyChar event getKeyChar isChar true publiccharKeyChar publicintKeyVirtualCode 1 publicStringKeyText publicbooleanisChar false 2 7鼠标事件 MouseListener接口 mousePressed 鼠标键被按下时调用 mouseReleased 鼠标键被释放时调用 mouseClicked 合并上述两个事件为一次鼠标点击事件 这三个方法的参数是MouseEvent 通过getX和getY方法 能够得到鼠标点击时的鼠标指针的x和y坐标 通过getClickCount方法 可以区别是单击操作 还是双击操作 MouseMotionListener接口 mouseMoved 鼠标移动 mouseMoved 用户拖动鼠标 鼠标指针形状的设置 setCursor Cursor getPredefinedCursor Cursor HAND CURSOR 例13 利用鼠标进行绘图点击窗口中的空白处 得到一张 笑脸 的图像 点击已存在的图像 图像在 笑脸 和 哭脸 之间切换 用鼠标可以对图像进行拖动操作 在窗口左上角 显示当前鼠标光标的位置 程序代码见MouseDraw java 运行结果如下 MouseDrawimportjava awt importjava awt event importjava util importjavax swing publicclassMouseDraw publicstaticvoidmain String args MouseFrameframe newMouseFrame frame setDefaultCloseOperation JFrame EXIT ON CLOSE frame show classMouseFrameextendsJFrame publicMouseFrame setTitle 利用鼠标画图 setSize WIDTH HEIGHT 将panel加入到frameMousePanelpanel newMousePanel ContainercontentPane getContentPane contentPane add panel publicstaticfinalintWIDTH 300 publicstaticfinalintHEIGHT 200 classMousePanelextendsJPanel publicMousePanel faces newArrayList 初始化链表facetypes newArrayList current null 初始化当前图像位置StringimageName smile gif 加载图像smileimg Toolkit getDefaultToolkit getImage imageName imageName cry gif cryimg Toolkit getDefaultToolkit getImage imageName MediaTrackertracker newMediaTracker this tracker addImage smileimg 0 tracker addImage cryimg 1 try tracker waitForID 0 tracker waitForID 1 catch InterruptedExceptionexception 得到图像的高度和宽度imageWidth smileimg getWidth this imageHeight smileimg getWidth this 注册监听器addMouseListener newMouseHandler addMouseMotionListener newMouseMotionHandler publicvoidpaintComponent Graphicsg super paintComponent g 显示当前光标位置Stringtext 鼠标指针位置 mousex mousey g drawString text 10 10 显示图像for inti 0 i faces size i 得到图像位置intx int Rectangle faces get i getX inty int Rectangle faces get i getY 得到图像类型text String facetypes get i if text equals smile g drawImage smileimg x y null elseg drawImage cryimg x y null 查找某个点是否在链表faces中的某个矩形内部publicRectanglesearch Pointpt for inti 0 i faces size i Rectanglerect Rectangle faces get i if rect contains pt returnrect returnnull 将以点pt为中心 以图像大小为高度和宽度的矩形加入链表faces中publicvoi

温馨提示

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

评论

0/150

提交评论