图形用户界面与事件处理.ppt_第1页
图形用户界面与事件处理.ppt_第2页
图形用户界面与事件处理.ppt_第3页
图形用户界面与事件处理.ppt_第4页
图形用户界面与事件处理.ppt_第5页
已阅读5页,还剩134页未读 继续免费阅读

下载本文档

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

文档简介

1,第13章 图形用户界面与事件处理,Java的GUI类简介 Java事件处理 布局管理器 Swing组件的使用,2,13.1 Java的GUI类简介,Java有两组GUI类:AWT(Abstract Windowing Toolkit)类及改进的Swing类。 AWT类是原始的Java GUI类,在java.awt包中; Swing类对AWT类进行了扩充,在javax.swing包中。,3,13.1 Java的GUI类简介,Swing类的名称与AWT类的名称类似,但其名称由字母J开头。 GUI的类层次:,4,13.1 Java的GUI类简介,带有GUI组件的框架:,5,13.1 Java的GUI类简介,常用的GUI组件(1),6,13.1 Java的GUI类简介,常用的GUI组件(2),7,13.1 Java的GUI类简介,AWT类简介 要创建GUI窗口,就需要编写一个继承自Frame的子类,并进行实例化,然后调用父类方法setVisible使其可见。 如果想在GUI窗口中增加一个按钮,则可实例化Button类,然后调用Frame子类实例的add方法添加到窗口中。,8,13.1 Java的GUI类简介,AWT类简介 定义AWTFrameWithButton类,9,13.1 Java的GUI类简介,AWT类简介 此框架存在两个问题: 首先,按钮填充了整个空间,外观有些奇怪; 其次,此框架无法检测到按钮,单击按钮时,没有任何反应。,10,13.1 Java的GUI类简介,Swing类简介 对前面的AWTFrameWithButton类进行修改: 引入javax.swing包,而不是引入 java.awt包; 扩充Jframe类,而不是扩充Frame类; 按钮名称以字母J开头。 将语句 this. add(closeButton); 改为 this.getContentPane().add(closeButton);,11,13.1 Java的GUI类简介,Swing类简介 SwingFrameWithButton类的定义,12,13.1 Java的GUI类简介,Swing类简介 Swing的组件和容器层次 顶层容器:JFrame、JDialog、JApplet。其他组件都必须放在顶层容器上才能显现出来。 中间层容器:作用是容纳其他组件,分为一般用途和特殊用途两类。一般用途的有JPanel、JScrollPane、JSplitPane、JTabbedPane、JToolBar五类;特殊用途的有JInternalFrame、JRootPane两类。,13,13.1 Java的GUI类简介,Swing类简介 Swing的组件和容器层次 原子组件:是在图形用户界面中和用户进行交互的组件。根据功能不同,可将其分为三类: 不可编辑信息的组件:JLabel、JProgressBar、JToolTip; 输入信息的组件:JButton、JCheckBox、JRadioButton、JComboBox、JTextField、JList、JMenu、JSlider、JSpinner、JTexComponent等; 提供格式化信息并允许用户选择的组件: JColorChooser、JFileChooser、JTable及JTree组件。,14,13.1 Java的GUI类简介,三层容器举例,15,13.1 Java的GUI类简介,三层容器举例,16,13.2 事件处理,基本概念事件 用户与系统交互而产生的键盘或鼠标动作称为事件。 事件除了可以由用户单击鼠标等操作生成外,也可以由程序代码或系统生成。 不同事件的类型由不同的类表示。在java.awt.event包中定义了很多事件类,例如,ActionEvent、ItemEvent、MouseEvent、KeyEvent等。,17,13.2 事件处理,基本概念事件源 产生事件的组件称为事件源。 例如,单击按钮产生的事件由ActionEvent类表示,称为ActionEvent事件,按钮就是事件源。,18,13.2 事件处理,基本概念事件监听器 事件监听器也称为事件监听者,是当一个事件发生时被通知的对象,它负责接收对象,并进行处理。 Java中的每种事件类都有一个对应的接口(称为事件监听器接口),接口中声明了一个或多个抽象的事件处理方法,凡是需要接收并处理事件对象的类,都需要实现相应的接口。,19,13.2 事件处理,基本概念,20,13.2 事件处理,委托事件处理机制 对于每一种要处理的事件,都要定义监听类(监听器),这个监听类应实现相应的监听器接口; 事件源必须注册事件监听器,以便监听器可以接收特定事件的通知。 事件源发生的事件对象只被传递给已经注册的事件监听器。,21,13.2 事件处理,委托事件处理机制 注册监听器(Registering Listeners)的方法如下: addActionListener(ActionListener yourListener); addMouseListener(MouseListener yourListener); addWindowListener(WindowListener yourListener);,22,13.2 事件处理,委托事件处理机制 例如,要响应 Jbutton的单击事件,则需要对此类型的事件进行注册,需要调用Jbutton的addActionListener( )方法。 此方法需要一个参数,这个参数是实现了 ActionListener 接口的类对象。 ActionListener 接口只包含一个方法,即actionPerformed方法。,23,13.2 事件处理,委托事件处理机制 定义一个类(如ButtonHandler类)实现ActionListener接口,并在类中实现接口中定义的actionPerformed方法。,24,13.2 事件处理,委托事件处理机制 使用addActionListener( )方法将ButtonHandler类的对象注册到按钮上。,25,13.2 事件处理,委托事件处理机制,26,13.2 事件处理,实现监听器接口的方法 一般可以通过以下三种方法实现监听器接口: 在已有的类中实现接口; 单独定义一个类实现接口; 创建内部类实现接口。,27,13.2 事件处理,实现监听器接口的方法 在已有的类中实现接口,28,13.2 事件处理,实现监听器接口的方法 在已有的类中实现接口,29,13.2 事件处理,实现监听器接口的方法 单独定义一个类实现接口,30,13.2 事件处理,实现监听器接口的方法 单独定义一个类实现接口,31,13.2 事件处理,实现监听器接口的方法 创建内部类实现接口,32,13.2 事件处理,处理鼠标事件举例 编写程序检测鼠标的拖动(即按住鼠标键并同时移动鼠标的操作)以及鼠标进入和离开窗口的情况。 处理过程:因拖动鼠标而引发的MouseEvent 事件对象可以由实现了MouseMotionListener 接口的类处理。 MouseMotionListener 接口中声明了mouseDragged()和mouseMoved()两个抽象方法,分别用于处理鼠标的拖动和移动。,33,13.2 事件处理,处理鼠标事件举例 为了处理其他鼠标事件,必须实现MouseListener接口。 该接口声明了mouseEntered()、mouseExited()、mousePressed()、mouseReleased()和mouseClicked()五个抽象方法。,34,13.2 事件处理,处理鼠标事件举例,35,13.2 事件处理,处理鼠标事件举例,36,13.2 事件处理,处理鼠标事件举例,37,13.2 事件处理,处理鼠标事件举例,38,13.2 事件处理,处理鼠标事件举例,39,13.2 事件处理,处理鼠标事件举例,40,13.2 事件处理,扩充适配器类 如果一个类实现一个接口,就需要实现接口中的所有方法。 为了方便,Java为那些声明了多个方法的Listener接口提供了一个对应的适配器(Adapter)类。 例如,MouseListener 对应的适配器类为 MouseAdapter, 在适配器类中实现了相应接口中的全部方法,只是方法的内容为空。,41,13.2 事件处理,扩充适配器类 这样,在创建新类时,可以不实现接口,而是只继承某个适当的适配器类,并且覆盖所关心的事件处理方法。,42,13.2 事件处理,使用多个GUI组件 在使用多个组件时,使用事件实例的getSource()方法确定发生的事件来自哪个组件。 例,编写具有3个按钮的窗口,点击第一个按钮在文本框中显示“Hello World”,点击第二个按钮清除文本框中的内容,点击第三个按钮则关闭窗口。,43,13.2 事件处理,使用多个GUI组件,44,13.2 事件处理,使用多个GUI组件,45,13.2 事件处理,使用多个GUI组件,46,13.2 事件处理,使用多个GUI组件,47,13.2 事件处理,使用多个GUI组件,48,13.2 事件处理,使用多个GUI组件,49,13.3 布局管理器,为了使生成的图形用户界面具有良好的平台无关性,Java语言提供了布局管理器来管理组件在容器中的布局,而不使用直接设置组件的位置和大小的方式。 本节介绍常用的布局管理器FlowLayout、BorderLayout、GridLayout、GridBagLayout及CardLayout的使用。,50,13.3 布局管理器,FlowLayout FlowLayout布局方式是将组件一排一排地依次放置; 当容器被重新设置大小后,则布局也会随之发生改变:各组件的大小不变,但相对位置会发生变化。,51,13.3 布局管理器,FlowLayout FlowLayout类有三种构造方法: public FlowLayout(); public FlowLayout(int align); public FlowLayout (int align, int hGap, int vGap);,52,13.3 布局管理器,FlowLayout应用举例,53,13.3 布局管理器,FlowLayout应用举例,54,13.3 布局管理器,FlowLayout应用举例,55,13.3 布局管理器,BorderLayout BorderLayout提供了更复杂的布局控制方法,它包括5个区域:North、South、East、West和Center。 当容器的尺寸发生变化时,各组件的相对位置不变,但中间部分组件的尺寸会发生变化,南北组件的高度不变,东西组件的宽度不变。,56,13.3 布局管理器,BorderLayout BorderLayout类有以下两个造方法: public BorderLayout() public BorderLayout(int hgap, int vgap),57,13.3 布局管理器,BorderLayout 如果容器使用了BorderLayout布局方式,则用add()方法往容器中添加组件时必须指明添加的位置,例如, add(BorderLayout.SOUTH, new JButton(“West”); add(BorderLayout.NORTH, new JButton(“North”);,58,13.3 布局管理器,BorderLayout举例,59,13.3 布局管理器,GridLayout GridLayout布局方式可以使容器中的各组件呈网格状分布。 将容器划分为很多行(row)和列(column),初始行和列都从0开始。 容器中各组件的高度和宽度相同,当容器的尺寸发生变化时,各组件的相对位置不变,但各自的尺寸会发生变化。,60,13.3 布局管理器,GridLayout GridLayout类的构造方法有: public GridLayout(int rows, int columns) public GridLayout(int rows, int columns, int hGap, int vGap),61,13.3 布局管理器,GridLayout举例,62,13.3 布局管理器,GridLayout举例,63,13.3 布局管理器,GridBagLayout GridBagLayout将组件放置在网格中,这一点类似于GridLayout。 所不同的是,GridBagLayout不仅能设置组件摆放的位置,还能设置该组件占多少行、多少列,并可以按任意顺序放置,是一种非常灵活的布局管理器。,64,13.3 布局管理器,GridBagLayout GridBagConstrains对象描述组件在GridBagLayout中的放置方式。,65,13.3 布局管理器,GridBagLayout举例,66,13.3 布局管理器,GridBagLayout举例,67,13.3 布局管理器,GridBagLayout举例,68,13.3 布局管理器,GridBagLayout举例,69,13.3 布局管理器,GridBagLayout举例,70,13.3 布局管理器,GridBagLayout举例,71,13.3 布局管理器,CardLayout CardLayout布局方式可以帮助用户处理两个或更多的组件共享同一显示空间。 共享空间的组件之间的关系就像一摞牌一样,它们摞在一起,只有最上面的组件是可见的。,72,13.3 布局管理器,CardLayout CardLayout类有两种构造方法: public CardLayout() 组件距容器左右边界和上下边界的距离为缺省值0个象素。 public CardLayout(int horizontalGap, int verticalGap) 组件距容器左右边界和上下边界的距离为指定值。,73,13.3 布局管理器,CardLayout CardLayout可以象换牌一样处理这些共享空间的组件: public void show(Container parent, String name) public void next(Container parent) public void previous(Container parent) public void first(Container parent) public void last(Container parent),74,13.3 布局管理器,CardLayout举例,75,13.3 布局管理器,CardLayout举例,76,13.3 布局管理器,CardLayout举例,77,13.3 布局管理器,CardLayout举例,78,13.3 布局管理器,CardLayout举例,79,13.3 布局管理器,CardLayout举例,80,13.4 Swing组件的使用,SwingConstant接口 SwingConstant接口中定义了很多常量用来表示位置、朝向信息。 这些常量都是static int型的。 Swing组件通过实现这个接口就可以使用它们来确定位置了。,81,13.4 Swing组件的使用,SwingConstant接口,82,13.4 Swing组件的使用,标签类 JLabel JLabel类提供的常用构造方法: JLabel()创建空标签 JLabel(String text)创建带有文本的标签 JLabel(String text int horizontalAlignment) 创建带有文本的标签,并指定其水平排列方式 JLabel(Icon image)创建带有图标的标签 JLabel(Icon image, int horizontalAlignment) 创建带有图标的标签,并指定其水平排列方式,83,13.4 Swing组件的使用,菜单 Swing下拉菜单至少由3个类的实例组成: JMenuBar(菜单栏) JMenu(菜单) JMenuItem(菜单项),84,13.4 Swing组件的使用,菜单 菜单栏、菜单及菜单项的示例,85,13.4 Swing组件的使用,菜单 将前面的SwingFrameAndComponent类改写为SwingFrameWithMenus类,用下拉菜单替代按钮来显示和清除消息及关闭窗体。,86,13.4 Swing组件的使用,菜单举例:SwingFrameWithMenus类定义,87,13.4 Swing组件的使用,菜单举例:SwingFrameWithMenus类定义,88,13.4 Swing组件的使用,菜单举例:SwingFrameWithMenus类定义,89,13.4 Swing组件的使用,菜单举例:SwingFrameWithMenus类定义,90,13.4 Swing组件的使用,工具栏 JToolBar,91,13.4 Swing组件的使用,按钮类 按钮类的继承层次 AbstractButton抽象类是众多按钮类的基类; 子类有JButton、JToggleButton、JMenuItem; JToggleButton表示有两个选择状态的按钮,它有两个子类JCheckBox、JRadioButton,分别用来实现多选按钮和单选按钮; JMenuItem有三个子类JCheckBoxMenuItem、JRadioButtonMenuItem、JMenu,用来在菜单中加入多选按钮、单选按钮和一般的菜单项。,92,13.4 Swing组件的使用,按钮类 AbstractButton,93,13.4 Swing组件的使用,按钮类 AbstractButton,94,13.4 Swing组件的使用,按钮类JCheckBox、JRadioButton JCheckBox、JRadioButton是两种状态按钮,可为用户提供是/否或真/假选择。 用户可以从成组使用的复选框中选择一项或多项,但在成组使用的单选按钮中一次只能选择一个单选按钮。,95,13.4 Swing组件的使用,按钮类JCheckBox、JRadioButton 创建按钮:JCheckBox及JRadioButton的常用构造方法 JCheckBox(String text, boolean selected) JRadioButton(String text, boolean selected),96,13.4 Swing组件的使用,按钮类JCheckBox、JRadioButton 使用ButtonGroup对按钮分组 ButtonGroup的典型用途是包含单选按钮的逻辑组。 通过使用ButtonGroup的add方法,可将按钮添加到组中。,97,13.4 Swing组件的使用,按钮类JCheckBox、JRadioButton 常用事件 在单击组件时发生动作事件。 当选项发生改变时发生选项事件。处理选项事件的类必须实现ItemListener接口。 ItemListener接口中只有一个方法: Void itemStateChanged(ItemEvent e),98,13.4 Swing组件的使用,单选按钮使用举例,99,13.4 Swing组件的使用,单选按钮使用举例,100,13.4 Swing组件的使用,单选按钮使用举例,101,13.4 Swing组件的使用,单选按钮使用举例,102,13.4 Swing组件的使用,复选框使用举例,103,13.4 Swing组件的使用,复选框使用举例,104,13.4 Swing组件的使用,复选框使用举例,105,13.4 Swing组件的使用,复选框使用举例,106,13.4 Swing组件的使用,组合框/下拉列表框 组合框JComboBox与JRadioButton类一样,只允许用户在一组可能的选项中选择一项。 组合框有两种不同的格式: 默认状态是不可编辑的模式,包括一个按钮和一个下拉列表; 另一种是可编辑的模式,多了一个文本区域,用户可以在此文本区域内填入列表中不包括的内容。,107,13.4 Swing组件的使用,组合框/下拉列表框 创建一个JComboBox对象: String comboBoxItem = “Java“, “C“, “C+“,“VB“,“Lisp“,“Prolog“; JComboBox comboBox = new JComboBox(comboBoxItem);,108,13.4 Swing组件的使用,组合框/下拉列表框 每次点击JComboBox对象,选中不同于当前选中项时,就会产生项事件; 当新选择的项与已选择的项相同时,不会产生项事件。,109,13.4 Swing组件的使用,组合框/下拉列表框 通过调用JComboBox的getSelectedItem方法来获得当前选中项。 方法的返回类型是Object,必须将它转换为正确的类型。,110,13.4 Swing组件的使用,组合框/下拉列表框 例如,项是String对象,则使用下面的语句: textField.setText(comboBox.getSelectedItem().toString(); 也可以调用getSelectedIndex方法来获得已选中项的位置。列表中第一项的位置是0。,111,13.4 Swing组件的使用,组合框/下拉列表框举例,112,13.4 Swing组件的使用,组合框/下拉列表框举例,113,13.4 Swing组件的使用,组合框/下拉列表框举例,114,13.4 Swing组件的使用,文本 Swing提供六种文本组件,还有一系列支持的类和接口。,115,13.4 Swing组件的使用,文本 文本组件可分为三类: 单行文本:包括JTextField、JPasswordField、JFormattedTextField; 多行单一风格文本:JTextArea,它可以显示和编辑多行文本,通常用来让用户输入任意长度的无格式文本或显示无格式的帮助信息; 多行风格化文本:包括JEditorPane、JTextPane,可以显示和编辑多行多种式样的文本,甚至可以嵌入图像或其他组件。,116,13.4 Swing组件的使用,文本框JTextField JTextField的构造方法如下: JTextField()创建空的文本框。 JTextField(String text)创建具有指定文本的文本框。 JTextField(int columns)创建具有指定列的文本框。 JTextField(String text, int columns)创建具有指定文本、指定列的文本框。,117,13.4 Swing组件的使用,文本框JTextField JTextField的常用方法: String getText()获取文本框中的当前文本。 void setTextField(String t)设置文本框中的当前文本。 int getLength()返回当前文本中的字符个数。 String getText(int offs, int len)返回给定字段所包含的文本。 void selectAll()选择文本框中所有文本。,118,13.4 Swing组件的使用,文本框JTextField JTextField的常用方法: int getSelectionStart()获取文本框中选定的文本起始点。 void setSelectionStart(int selectionStart)设置文本框中选定的文本起始点。 int getSelectionEnd()获取文本框中选定文本结束位置的下一个位置。 void setSelectionEnd(int selectionEnd)设置文本框中选定文本结束位置的下一个位置。,119,13.4 Swing组件的使用,文本框JTextField JTextField的常用方法: void select(int selectionStart, int selectionEnd)选择文本框中的一部分文本,selectionStart指定被选择文本的开始位置,selectionEnd指定被选择文本结束位置的下一个位置。 void setEditable(boolean b)设置是否能够编辑文本框中的内容,参数b的值为true表示能够编辑,否则不能编辑。,120,13.4 Swing组件的使用,密码框 JPasswordField 密码框 JPasswordField继承自JTextField,是一种特殊的文本框。 常用方法: char getPassword()返回包含在密码框内的文本。 void setEchoChar(char c)设置密码框的回显字符。参数c是用于屏蔽密码框内容的密码字符。缺省情况下为星号。 例如,如果希望在密码框中显示点号,则调用setEchoChar()方法。,121,13.4 Swing组件的使用,二维表 Java使用JTable类对象显示和编辑二维表,JTable 并不存储数据,只是给出数据的视图。 带有滚动框的典型表,122,13.4 Swing组件的使用,二维表 有两种方式来创建JTable类对象: 一种方式是直接使用JTable类的构造方法, 另一种方式是定义自己的TableMode类作为AbstractTableMode类的子类。,123,13.4 Swing组件的使用,二维表 使用JTable类的构造方法创建二维表的步骤: (1) 在String数组或Vector中声明列名 String columnName=“书号“,“书名“,“作者“,“价格“; 或 Vector columnName=“书号“,“书名“,“作者“,“价格“;,124,13.4 Swing组件的使用,二维表 使用JTable类的构造方法创建二维表的步骤: (2)在二维Object数组或Vector中初始化并存储数据 Object data = “9787807310907-001“,“笑傲江湖“, “金庸“, 36.0, “9787807310907-002“,“笑傲江湖“, “金庸“, 36.0, “7101003044-001“,“史记“, “司马迁“, 50.0, “9787508619439-001“,“谁动了我的奶酪“, “斯宾塞约翰逊“, 27.0, “7020024750-001“,“围城“, “钱钟书“, 38.0 “9787544253956-001“,“富爸爸 穷爸爸“, “罗伯特T清崎“, 26.0 ;,125,13.4 Swing组件的使用,二维表 使用JTable类的构造方法创建二维表的步骤: (3)用数据和列名生成JTable类对象。有两个JTable方法可以直接接收数据: JTable(Object rowData, Object columnNames) JTable(Vector rowData, Vector columnNames),126,13.4 Swing组件的使用,二维表 使用JTable类的构造方法创建二维表的步骤: (4)

温馨提示

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

评论

0/150

提交评论