面向对象java程序设计之GUI与事件驱动编程.ppt_第1页
面向对象java程序设计之GUI与事件驱动编程.ppt_第2页
面向对象java程序设计之GUI与事件驱动编程.ppt_第3页
面向对象java程序设计之GUI与事件驱动编程.ppt_第4页
面向对象java程序设计之GUI与事件驱动编程.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、第十讲 GUI与事件驱动编程,Java程序的用户界面 Swing组件概述 Swing顶层容器 Swing中间容器 ,文本命令行又称控制台(console)交互方式。 图形用户界面(GUI):AWT/Swing在图形用户界面中也可结合命令行方式。 浏览器:Browser在J2EE规范中得到较好支持(JSP/Servlet)。 Applet:GUI + Browser,10.1 Java程序的用户界面,表示层 vs 业务逻辑层3-tier(n-tier):数据层业务逻辑层表示层。不管你选用什么方式的用户界面,它也仅仅是用户界面! 同一业务逻辑层应能适配不同的表示层。 同一业务逻辑层应能适配不同的数

2、据层。,一个GUI系统的基本组成 提供最基本的GUI控件 按钮、标签、文本字段、检查框、. 能将基本GUI控件组织为包容层次的容器组件 顶层容器、中间容器、容器中可容纳其他容器、. 负责管理容器中组件布局的组件 边界布局管理器、流布局管理器、. 事件传播与处理模式 事件处理模式、各种事件监听器、. 其他高级特征 不同的观感风格、特定功能组件(文件选择器、颜色选择器)、.,GUI交互方式,Java的GUI历程 AWT(Abstract Window Toolkit):抽象窗口工具箱。 在JDK 1.0和1.1中作为GUI开发工具。 JFC Swing:新一代轻量型、可移植的GUI。 在JDK 1

3、.1中作为插件。 在JDK 1.2中作为核心部分。JFC(Java Foundation Classes)的API分为5大类:AWT、Java 2D、Accessibility、Drag其子类定义了返回类型更具体的方法。 例如ComopnentEvent定义了: Component getComponent();一些子类还定义了返回更详细的事件信息。 例如MouseEvent返回的信息包括:int getClickCount() 返回鼠标单击的次数Point getPoint() 返回鼠标事件发生的位置String getMouseModifiersText(int modifiers)返回鼠

4、标修饰键的描述(Alt、Ctrl、Shift、.),底层事件 vs 语义事件底层事件(low-level event):表示窗口系统发生的事情或底层的输入。 直接由用户输入产生的鼠标与键盘事件是底层事件。 组件、容器、输入焦点、窗口事件等也是底层事件。组件事件:跟踪组件位置、大小、可见性的变化。容器事件:反映容器中组件的添加与删除。焦点事件:组件是否获得或失去键盘输入焦点。窗口事件:反映窗口(画框或对话框)的基本状态。语义事件(semantic event):底层事件之外的其他事件。 包括动作事件、选项事件、列表选择事件等。动作事件:单击按钮可产生;文本字段按回车也可产生。 语义事件未必一定由

5、底层事件产生。例如,表格模型事件可能是由数据库接收到新数据产生。只要有可能,就应监听语义事件而不是底层事件! 从而应用程序的健壮性与可移植性更高。例如,按钮的动作事件既可单击产生,也可由键盘输入产生。,事件处理的线程事件处理代码在一个单独线程(event-dispatching thread)中执行。 从而保证事件处理程序可在下一处理程序开始之前执行完毕。组件绘制代码也在event-dispatching thread中执行。 这意味着执行事件处理代码时,GUI被冻结。 即既不会重新绘制,也不会响应鼠标或键盘输入。事件处理程序设计原则: 事件处理代码应能尽快地执行完毕,否则你的程序感觉起来性能

6、很差! 如果事件处理时真的需要执行长时间操作,启动另一线程或将请求转发给另一线程。,Swing的事件处理模型,如何实现事件处理程序(event handler)每一个事件处理程序需要3个代码片段: 声明事件处理类时,要么指定实现一个监听器接口,要么继承一个实现了监听器接口的类。例如:public class MyClass implements ActionListener . 将事件处理类的一个实例注册到一个或多个组件作为监听器。例如:someComponent.addActionListener(instanceOfMyClass); 实现监听器接口指定的方法。例如:public void

7、 actionPerformed(ActionEvent evt) . / 对动作事件进行处理的代码,事件处理程序的实现技术,当鼠标在窗口中点击的时候,窗口标题栏将出现所点位置的坐标信息,方法一:实现MouseListener接口 import java.awt.event.*; /载入MouseListener类所在的包 import javax.swing.*; /载入JFrame所在的包 public class ImplementMouseListener implements MouseListener JFrame f; public ImplementMouseListener

8、() f=new JFrame(); /新建一窗口 f.setSize(300,150); f.show(); f.addMouseListener(this); /为窗口增加鼠标事件监听器 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e

9、) public void mouseClicked(MouseEvent e) f.setTitle(点击坐标为 (+e.getX()+, +e.getY(); public static void main(String args) new ImplementMouseListener (); ,继承MouseAdapter类 import java.awt.event.*; /载入MouseAdapter所在的包 import javax.swing.*; public class ExtendMouseAdapter extends MouseAdapter JFrame f; pub

10、lic ExtendMouseAdapter () f=new JFrame(); f.setSize(300,150); f.show(); f.addMouseListener(this); f.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); public void mouseClicked(MouseEvent e) f.setTitle(点击坐标为 (+e.getX()+, +e.getY()+); public static void main(String args) new ExtendMouseAdapter(); ,9.5 Sw

11、ing的特点和概念,16,方法三:使用匿名内部类 import java.awt.event.*; import javax.swing.*; public class UseInnerClass JFrame f; public UseInnerClass () f=new JFrame(); f.setSize(300,150); f.show(); f.addMouseListener(new MouseAdapter() public void mouseClicked(MouseEvent e) f.setTitle(点击坐标为 (+e.getX()+, +e.getY()+); )

12、; /为窗口添加鼠标事件监听器语句结束 f.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); );/为窗口添加窗口事件监听器语句结束 public static void main(String args) new UseInnerClass (); ,9.5 Swing的特点和概念,使用事件适配器大多数事件监听器接口定义了多个方法。 例如MouseListener接口定义了5个方法:mousePressed()、mouseReleased()、mouse

13、Entered()、mouseExited()、mouseClicked() 但事件处理程序通常只需重定义其中的一、两个方法。 导致需要将其他未用到的方法重定义一个空方法体。Swing为多于一个方法的事件监听器提供了事件适配器。 事件适配器是一个类而不是一个接口。 它为相应的事件监听器接口的每一方法提供了空方法体实现。 程序员的事件处理程序可继承事件适配器。 这样做比实现事件监听器更方便。 当然,前提是单继承的指标没有其他用途!,所有Swing组件支持的事件监听器Comopnent类定义了这些事件监听器:组件事件监听器、焦点事件监听器、键盘事件监听器、鼠标事件监听器、鼠标移动监听器 其他Swi

14、ng组件支持的事件监听器不同的类定义了不同的事件监听器:动作事件监听器、插入符(caret)事件监听器、文档事件监听器、可取消编辑(undoable edit)事件监听器、选项事件监听器、列表选择事件监听器、窗口事件监听器、.,使用事件监听器,JButtonactionchangeitem JCheckBoxactionchangeitem JColorChooserchange JComboBoxactionitem JDialogwindow JEditorPanecaret+document+undoableEdit+hyperlink JFileChooser action JFram

15、ewindow JInternalFrameinternalFrame JListlistSelectionlistData JMenumenu JMenuItemactionchangeitemmenuKeymenuDragMouse JPasswordFieldactioncaretdocument+undoableEdit JPopupMenupopupMenu JProgressBarchange JRadioButtonactionchangeitem JSliderchange JTabbedPanechange JTablelistSelectiontableModel tabl

16、eColumnModelcellEditor JTextAreacaretdocumentundoableEdit JTextFieldactioncaretdocumentundoableEdit JTextPanecaretdocumentundoableEdithyperlink JToggleButtonactionchangeitem JTreetreeExpansiontreeWillExpand treeModeltreeSelection JViewportchange(用于scrollpane),GUI组件这些组件(component)又称widget。下图由4个组件组成:,

17、10.3 Swing组件概述,Swing组件的分类,顶层容器(top-level container) 中间容器(intermediate container) 原子组件(atomic component),注意这里表示包容关系 而不是继承关系,顶层容器作用:为其他GUI组件的绘制提供位置。常用顶层容器包括:JFrame、JDialog和JApplet。每一个顶层容器都间接地包含了一个中间容器。 称为内容窗格(content pane)。 大多数应用程序不必关心顶层容器与其内容窗格之间的东西。内容窗格直接或间接包含窗口中所有可见的组件。 一个例外是菜单条位于内容窗格外的特殊位置。 被包含的GU

18、I组件通过各种add()方法添加到容器中。,中间容器其目的仅仅是为了更方便地定位其他GUI组件。常用中间容器包括JPanel、JScrollPane和JTabbedPane。 这些中间容器提供了视觉效果或可交互性。,原子组件其目的不是为了容纳其他GUI组件。 它本身就是一个向用户表达信息的完整实体。Swing提供了大量原子组件:JButton、JComboBox、JTextField、JTable、.,JComponent类及其用法,除顶层容器外,所有J*组件均由JComponent类派生JComponent类描述了Swing组件的最基本语义。JComponent类继承Container类。

19、Container类描述对添加或删除子组件的技术。Container类又继承Component类。 Component类描述对布局绘制和事件驱动的支持。 JComponent类常用的属性 外观属性:边框(Border)、前景色(Foreground)、背景色(Backgroud)、是否透明(Opaque)、字体(Font)等 状态属性:工具提示(ToolTipText)、是否可用(Enable)、可见(Visable) 布局属性:大小(Size)、对齐方式(Alignment)、高度(Heigh)、宽度(Width)等,顶层容器Swing提供了3种常用的顶层容器类: JFrame、JDialo

20、g和JApplet。 另一种JWindow较少使用。每一GUI组件都须加入一个以顶层容器为根的包容层次。 从而该组件才有机会在屏幕上显示出来。每一个顶层容器都有一个内容窗格。 内容窗格(content pane)包含了顶层容器中的所有可见组件。在顶层容器中还允许加入一行菜单条。 菜单条位于顶层容器之中,但位于内容窗格之外。,10.4 Swing顶层容器,顶层容器、内容窗格与菜单条,省略号中的东西,画框,对话框,当一个窗口依赖另一个窗口时,使用对话框当主窗口被缩小为图标时,依赖窗口自动消失。 JDialog必须依赖于JFrame存在。 对话框可以定义为模态的(Modal)一个模态对话框可见时,它

21、会阻塞程序中所有其他窗口的用户交互。 两种常用的对话框由JOptionPane提供的对话框是模态的。 JOptionPane仅仅是一个容器而已,它自动创建一个JDialog 并将自己添加到该JDialog的内容窗格中。要获取一个非模态对话框就必须直接使用JDialog。 直接使用JDialog的用法与使用JFrame非常类似!,使用JOptionPane对话框由JOptionPane提供的对话框具有较好的可定制特性: 允许指定不同的标题与消息文本 支持使用不同的提示图标 允许指定不同的按钮标签文字 允许指定几种不同的按钮模式(Yes、No、Cancel等) 以各种参数不同的重载方法实现!大多数

22、操作都被定义为类方法。 使用时非常方便(不必创建对象实例)。功能最强大的是showOptionDialog()方法。 showMessageDialog()方法通过调用该方法实现。 showConfirmDialog()方法也通过调用该方法实现。,int n = JOptionPane.showOptionDialog(frame, 你需要喝咖啡吗??, 小问题, / 决定有几个按钮,不过当有options时由options / 决定按钮个数 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,/ 决定使用什么图标 null,/ 不使

23、用定制图标 options,/ 按钮的文字 options2);/ 初始选中的按钮(用户直接按回车键选择的按钮),常用的中间容器(通用容器) 面板:JPanel通常用于将组件组织起来,方便布局。支持所有类型的布局管理器,易于添加边框。顶层容器的内容窗格通常以JPanel的实例实现。 滚动窗格:JScrollPane为大型的或可增长的组件在周边提供一个滚动条。 分割窗格:JSplitPane在一固定大小空间显示两个组件,用户可调整两个组件的大小比例。 带标签窗格:JTabbedPane包含多个组件,但某一时刻仅显示其中一个。用户通过点击标签或轻易在这些组件之间作切换。 工具条:JToolBar在

24、一行或一列中包含一组组件(通常是按钮) 。支持用户用鼠标将工具条拖动到不同的方位。,10.5 Swing中间容器,不常用的中间容器(专用容器) 内部画框:JInternalFrame与普通画框非常类似,但出现在另一窗口之中而不是一个独立窗口。 内部画框不可作为一个包容层次的根!内部画框通常放置在桌面窗格中。 再由桌面窗格作为一个JFrame的内容窗格。 分层窗格:JLayeredPane为定位组件提供了第三维(深度)。程序员可指定每一组件的位置与大小。分层窗格的子类JDesktopPane主要用于包含和管理内部画框。 根窗格:JRootPane为顶层容器提供屏幕上看不见的支持。,10.6 原子

25、控件,Java提供的原子控件简单原子控件:标签、按钮、检查框、广播按钮、组合框、列表、文本组件、微调、滑杆、边框、复合原子控件:表格、菜单、文件选择器、. 使用原子控件编程应了解:各种原子控件的基本用途 用户与原子控件进行交互时通常涉及原子控件的属性通常要为原子控件注册何种类型的事件,及如何编写事件处理程序,原子控件具有原子性这些GUI组件的主要目的是表现自己,有时还接收信息。 它们不会再容纳其他GUI组件,自然还不存在布局问题。 尽管某些基本控件由其他控件组合而成,但其组合不可改变。所有原子控件都是JComponent的子类。 所以都支持工具提示、边框装饰等Swing特性。 所以也继承了Co

26、ntainer和Component中的方法。 所以也有许多方法语法上可用、但语义上不可用。,简单原子控件,布局管理器与一个容器相关联调用setLayout()方法建立关联。,某些容器的构造方法也可建立关联。,布局管理器并不绘制组件组件由其容器负责绘制。 绘制前,容器向布局管理器请示每一组件的位置及大小。 布局管理器调用每一组件的定位与大小设置方法。setBounds()、setLocation()、setSize(),布局管理器与容器,使用布局管理器的基本原则通常只在创建JPanel或往内容窗格中添加组件时才使用布局管理器。 不要改变其他Swing组件内部使用的专用布局管理器。如果容器中的某一组件需要占用大量的空间,则 考虑使用BorderLayout或GridBagLayout。如果容器中的几个组件要按原次序放在紧凑的一行中,则 考虑使用默认的FlowLayout或BoxLayout。如果容器中的几个组件要在不同行列显示同样大小,则 考虑使用GridLayout。如果容器中的几个组件在一行或一列中显示且大小有变化,则 考虑使用BoxLayout。如果容器中的大量组件需要复杂布局,则 考虑使用GridBagLayout或利用多层JPanel组织组件。,Applet的特点是运行在浏览器中的一种小程序。 也可运行

温馨提示

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

评论

0/150

提交评论