4.1 概述 4.2 AWT 与 Swing组件 4.3 事件处理 4.4 容器与布局管理器 4.5 对话框 4.6 菜单 第4章 Java图形用户界面设计 4.1 概述 4.2 AWT 与 Swing组件 4.3 事件处理 4.4 容器与布局管理器 4.5 对话框 4.6 菜单
学习提要 掌握常用的GUI标准组件及图形界面的设计方法; 掌握JAVA的事件处理机制和常用事件响应代码的编写方法; 掌握布局管理、对话框及菜单的设计方法
4.1 概述 4.1.1 基本概念 (1) GUI—图形用户界面(Graphics User Interface) 使用图形的方式借助菜单、按钮等标准界面元素和鼠标操作,帮助用户和计算机之间进行交互。 (2)AWT——抽象窗口工具集(abstract window toolkit) Java中用来生成图形用户界面的类库是java.awt包,它Java中基本包中最大的一个,定义了所有GUI组件类,以及其它用于构造图形界面的类。Sun公司在JDK1.0中就提供了AWT。 为了实现跨平台特性,AWT类库中的各种操作被定义成在一个并不存在的“抽象窗口”中进行。
GUI设计涉及到的类和接口 AWTEvent Panel Applet Font Java.lang.Object Componet Container Window Frame Graphics MenuComponent 各种布局管理器类 GUI设计涉及到的类和接口
AWT组件的类层次 Component 组件是所有AWT组件的基类,提供了基本的显示和事件处理特征。
(3) Swing GUI组件 在最新的Java EE中,javax.swing包被列入Java的基础类库JFC,其中定义的Swing GUI组件相对于java.awt包的各种GUI组件增加了许多功能。 Swing组件类 Swing包含250多个类(有些是组件,有些是支持类,组件的名字都以 J 开头), Swing提供了40多个组件,是AWT的4倍,用轻量组件(没有本地对等组件)代替了AWT的重量组件(与本地对等组件相关联)。 重量级组件是指组件的属性跟操作系统有关,轻量级组件跟操作系统无关,轻量级组件在不同平台下显示效果一样 。
Swing组件简介(续) Swing包中有4个最重要的类: JApplet、JFrame、JDialog、JComponent 除模仿AWT组件所提供的功能外,几乎所有的Swing替代组件都有其他一些特性,如Swing按钮可以显示图标和文本,AWT按钮只显示文本。
Swing组件简介(续) Swing采用了一种MVC的设计范式,即“模型-视图-控制器”(Model-View-Controller):
视图 (组件外观) 模型 (组件数据) UI代表 (向组件提供外观和感觉) 控制器 (处理事件,更改模型或者视图) MVC结构示意图
(4)设计图形界面的步骤 1)根据需要创建界面元素,设计出界面的物理外观; 2) 定义界面元素对不同事件的响应,实现界面与用户的交互功能。
(5)设计图形界面的一般原则 保持风格的一致性 注重操作的友好性 选用适合主题的色调和风格,简洁明快,重在协调 背景颜色耐看,避免黑、大红、艳绿、明黄 采用统一字体,颜色对比清晰、字号大小合理 布局统一,组件尺寸恰当、外观一致 注重操作的友好性 必要的操作提示与信息反馈 考虑用户的普遍习惯 选用适合主题的色调和风格,简洁明快,重在协调 多浏览国外著名公司的网站 参考大公司开发的专业产品 商业经典色系:蓝色、灰色、蓝白、蓝灰 界面的边界一般设为不可调整大小,以免影响布局
4.1.2 图形用户界面元素 分三类:容器、组件、用户自定义成分。 (1)容器(container) 4.1.2 图形用户界面元素 分三类:容器、组件、用户自定义成分。 (1)容器(container) 是用来组织其他界面成分和元素的单元,如窗体(form、frame)。 主要作用: 用容器可以分解图形界面的复杂性。 特点: 容器有一定的范围、位置、背景,容器里可以包含许多其他的界面元素,并按一定规则来排列所包含的元素,可以被用来完成某种交互功能,容器还可能被包含在其他容器中。
(2)组件(Component) 使用组件的步骤: 创建组件对象→确定属性→布局到容器中→注册事件监听者→重写事件处理方法。 TextField input=new TextField(6); add(input); input.addActionListener(this); public void actionPerformed(ActionEvent e) { if(e.getSource()==input) output.setText(input.getText()+“,欢迎你!”); } 组件是图形界面的最小单位,里面不能再包含其他成分。如:命令按钮、文本域、标签等。组件的作用是完成与用户的一次交互,如接受用户指令、向用户显示文本等。 使用组件的步骤: 创建组件对象→确定属性→布局到容器中→注册事件监听者→重写事件处理方法。
(3)用户自定义图形界面成分 用户自定义成分是指利用Java类库中的类及其方法来绘制符合用户特定要求的图形界面成分,也可以将已经存在的图形、动画等加载到当前程序中来。 1) 绘制图形 Graphics类——绘制直线、各种矩形、多边形、圆和椭圆等。 Point类——表示一个象素点 Dimension类——表示宽和高 Rectangle类——表示一个矩形 Polygon类——表示一个多边形 Color类——表示颜色
2) 显示文字 Java中用一个Font类的对象来表示一种字体显示效果,包括字体类型、字型和字号。 字型常量 Font.BOLD ——粗体 Font.PLAIN ——正常 字型常量 Font.BOLD ——粗体 Font.ITALIC ——斜体 1) 创建字体对象 Font MyFont=new Font(“TimesRoman”,Font.BOLD,12); 2)使用字体对象 g.setFont(MyFont); //Graphics对象 btn.setFont(MyFont); //某个名为btn的按钮对象 可以用getFont()方法返回当前对象使用字体的情况。
3) 控制颜色 Applet中显示的字符串或图形的颜色可以用Color类的对象来控制,每个Color对象代表一种颜色,用户可以直接使用系统定义好的13种颜色常量,也可以通过红、绿、蓝三色比例来创建自己的Color对象。 Color类的构造函数 public Color(int Red,int Green,int Blue); // 每个参数的取值范围在0-255之间。 public Color(float Red, float Green, float Blue); // 每个参数的取值范围在0-1.0之间。 public Color(int RGB); // 指明RGB三色的比例,这个参数的0-7比特代表红色的比例,8-15比特代表绿色的比例,16-23比特代表蓝色的比例。
例: 创建自己的颜色: Color blueColor= new Color(0,0,255); g. g.setColor(blueColor); 利用系统的颜色常量: g.setColor(Color.cyan); GUI控件的颜色设置方法 public void setBackground(Color c); //设置背景颜色 public Color getBackground(); //取得背景颜色 public void setForeground(Color c); //设置前景颜色 public Color getForeground(); //取得前景颜色
4) 显示图象 Java中可以利用Graphics类的drawImage()方法显示图象。显示图象涉及3个方法: 参数1——Image对象,可以用系统为Applet类定义的getImage()方法获得。 参数2、参数3——显示时图象左上角的X.Y坐标 getImage(参数1,参数2 ) 参数1——图象文件所在的URL地址 参数2——图象文件的文件名 getDocumentBase() 获取含有该Applet的HTML文件的URL地址。
例:用户界面使用示例TestGraphics.java import java.awt.*; import java.applet.Applet; public class TestGraphics extends Applet { Image myImage ; Font myFont=new Font("黑体",Font.BOLD,20); Color myColor=new Color(120,25,180); public void init() myImage = getImage(getDocumentBase(), "fys.jpg" ); }
public void paint(Graphics g) { g.drawLine(30,5,40,5); //画线 g.setColor(Color.blue); //设置字体颜色 g.drawRect(40,10,50,20); //画空长方形 g.setColor(Color.red); setBackground(Color.yellow); //设置背静颜色 g.fillRect(60,30,70,40); //画实体长方形 g.setFont(myFont); g.drawString("大家好!",100,200); g.setColor(myColor); g.drawString(g.getFont().toString(),10,250); g.drawImage(myImage, 150, 10, this ); //显示图片 }
5) 实现动画效果 用Java实现动画的原理与放映动画片类似,取若干相关的图象或图片,顺序、连续地在屏幕上先显示,后擦除,循环往复就可以获得动画的效果。 小结: 在设计和实现一个程序的图形用户界面的过程中,绘制用户自定义成分仅完成了部分工作,可以美化用户界面,但无法接收程序运行过程中的用户指令,不能提供与用户的动态交互,还需要通过Java中的事件处理机制来实现。
4.2 AWT 与 Swing组件 常用的GUI标准组件AWT(Swing)介绍 标签(Label)(J Label ) Label (String) Label (String,int)创建一个带初始字符串及指定对齐方式的标签 0= Label .LEFT、 1= Label .RIGHT 、2= Label.CENTER void setAlignment(int) 方法用来设置标签对齐方式。
(JTextfield )(JPasswordField 密码框) 恢复密码显示:input2.setEchoChar((char) 0); 文本域(Textfield) (JTextfield )(JPasswordField 密码框) Textfield有四个构造函数: Textfield( ) Textfield (int) Textfield (String) Textfield(String,int) 带有初始文本及指定长度 主要方法 功能 char getEchoChar( ) 返回回显的字符 void setEchoChar(char) 设置回显字符(密码) void setEditable(Boolean) 设置文本域是否为只读状态 int getColumns( ) 返回文本域的列数 void setText( ) 设置文本 string getText( ) 返回文本
Textfield对事件的响应 事件类型 按回车时,动作事件 修改文本时,文本事件 实现接口 ActionListener TextListener 事件监听者 addActionListener( ) addTextListener( ) 接口的方法体 public void actionPerformed (ActionEvent e) public void textValueChanged (TextEvent e) 获取文本框的对象引用 e.getSource() 获取改变后的文本内容 String con=((TextField)e. getSource()).getText();
多行文本组件(TextArea) (JTextArea) 多行文本组件有五个构造函数: TextArea () //创建一个多行文本框 TextArea (int , int ) //用指定的行数、列数创建 TextArea (String) //用指定的初始文本创建 TextArea (String, int , int ) //用指定的初始文本、行数、列数创建 TextArea ( String ,int, int, int)//用指定的初始文本、行数、列数及滚动条创建 事件响应与TextField相同。 int getColumns( ) 返回多行文本的列数 void insertText(String,int) 在指定位置插入字符串 String getText( ) 返回文本框中的文本 void setText(String) 设置文本框中的文本
按钮(Button) (JButton) 按钮有两个构造函数: Button() 可以改变外观但不改变功能 按钮有两个构造函数: Button() Button(String Lable)//创建一个带标示字符串的按钮 主要方法 功能 void addNotify( ) 创建一个对等的按钮 String getLable( ) 返回按钮的标签 void setLabel(String ) 设置按钮的标签
Button对事件的响应 单击按钮可以引发动作事件(ActionEvent) 所在程序要实现ActionListener接口 注册监听者 addActionListener( ) 在实现接口的方法体中可以用e.getSource()方法获取按钮对象 也可以用e.getActionCommand()方法获取按钮的标签或事先为该按钮设置的命令名 例: Button bt=new Button(“按钮标签”); bt.setActionCommand(“命令名”); public void actionPerformed (ActionEvent e) { if (e. getActionCommand() ==“按钮标签”) …… } 或 e.getSource() 或 命令名
复选框组件(Checkbox)(JCheckbox) 复选框有三个构造函数: Checkbox() //不带显示标签 Checkbox(String) //带一个显示标签 Checkbox(String,boolean)//带显示标签和初始状态 复选框组件有状态属性,为on/off,默认情况下为off 主要方法 功能 void getLable( ) 返回复选框的显示标签 Boolean getState( ) 返回复选框的状态 void setState( ) 设置复选框的状态 void setLabel(String ) 设置复选框的显示标签
Checkbox对事件的响应 事件类型 单击时,选择事件 实现接口 ItemListener 事件监听者 addItemListener( ) 接口的方法体 public void itemStateChanged (ItemEvent e) 获取复选框的对象引用 e.getItemSelectable() 获取复选框状态 Checkbox cb=((Checkbox)e. getItemSelectable()). getState(); 对比按钮: public void actionPerformed (ActionEvent e) { if (e.getSource()) == bt1 …… } 判断事件源对象: public void itemStateChanged(ItemEvent e){ If (e.getItemSelectable()) instanceof Checkbox ……}
单选钮组件 (JRadioButton) 单选钮组件要先用CheckboxGroup()方法构造一个CheckboxGroup对象,再用Checkbox(String, CheckboxGroup ,boolean)方法创建Checkbox对象,如果不同的Checkbox在创建时属于同一个CheckboxGroup ,则组成单选钮组。 单选钮使用的构造函数: Checkbox(String, CheckboxGroup ,boolean)//带显示标签、属于哪个按钮组和初始状态 单选钮组件有状态属性,为true/false,创建时指定。
单选钮组件CheckboxGroup对事件的响应 CheckboxGroup类不是java.awt.*包中的类,它是Object的直接子类,所以按钮组不能响应事件,但是按钮组中的每个按钮可以响应ItemEvent类的事件。由于单选按钮组中的每个单选按钮都是Checkbox对象,它们对事件的响应与复选框对事件的响应相同。
下拉列表组件(Choice)(JComboBox)
Choice() //创建下拉列表(组合框) 创建下拉列表: Choice() //创建下拉列表(组合框) void add (String) 向下拉列表加入一个选项 int countItems( ) 返回下拉列表条目数 int getSelectedIndex() 返回当前选项的索引 String getItem(int ) 返回指定索引处的字符串 void removeAll( ) 删除所有选项 void remove(int) 删除指定位置的选项 void insert(String ,int) 以指定字符串在指定位置加入一个选项 void select(String) 选择指定字符串的选项
下拉列表组件(Choice)对事件的响应 事件类型 单击下拉列表框某个选项时,选择事件 实现接口 ItemListener 事件监听者 addItemListener( ) 接口的方法体 public void itemStateChanged (ItemEvent e) 获取下拉列表框的对象引用 e.getItemSelectable() 获取下拉列表框内容 String selectedItem = ((Choice)e.getItemSelectable( )).getSelectedItem( );
列表组件(List) (JList)
创建列表: List() //创建列表 List(int) //以指定的可见行数创建列表 List(int,boolean) //指定可见行数和是否允许多项选择 String getSelectedItem(int ) 返回选中的字符串 int countItems( ) 返回下拉列表条目数 int getSelectedIndex() 返回当前选项的索引 String getItem(int ) 返回指定索引处的字符串 void removeAll( ) 删除所有选项 void remove(int) 删除指定位置的选项 void addItem(String ,int) 在指定位置加入一个选项 void addItem (String) 向列表末尾加入一个选项 void select(String) 选择指定字符串的选项
列表组件(List)对事件的响应 (注意: 双击事件不能覆盖单击事件) 事件类型 双击某选项时,动作事件 单击某选项时,选择事件 实现接口 ActionListener ItemListener 事件监听者 addActionListener( ) addItemListener( ) 接口的方法体 public void actionPerformed (ActionEvent e) public void itemStateChanged (ItemEvent e) 获取列表框的对象引用 e.getSource() e.getItemSelectable() 获取改变后的文本内容 e.getActionCommand(); 或: ((List)e.getSource()). getSelectedItem( ); String s = ((List)e.getItemSelectable( )).getSelectedItem( );
滚动条组件(Scrollbar) (JScrollbar)
滚动条有三个构造函数: Scrollbar() //创建一个垂直滚动条 Scrollbar (int) //指定方向的滚动条, Scrollbar .HORIZONTAL (水平状) Scrollbar .VERTICAL (垂直状) Scrollbar (int, int, int, int,int)//指定方向、初始值、滚动块大小、最小值、最大值 void setMaximum(int) 设置滚动条的最大值 void setOrientation(int) 设置滚动条的方向 void setValue(int) 设置滚动条的当前值
滚动条组件(Scrollbar)对事件的响应 事件类型 改变滑块位置时,调整事件AdjustmentEvent 实现接口 AdjustmentListener 事件监听者 addAdjustmentListener( ); 接口的方法体 public void adjustmentValueChanged(AdjustmentEvent e) 获取滚动条的对象引用 e.getAdjustable( ) 获取滚动后的数值 e.getValue( )
4.3 事件处理 4.3.1 基本概念 事件处理三要素:事件源、事件类型、事件监听者 事件源:图形用户界面的每个可能产生事件的组件。 4.3 事件处理 4.3.1 基本概念 事件处理三要素:事件源、事件类型、事件监听者 事件源:图形用户界面的每个可能产生事件的组件。 事件源可以注册监听者对象,并向其发送事件对象。 事件类型: Java的所有事件都封装成一个类,这些事件类被集中在java.awt.event包中,所有的事件类都继承了AWTEvent类的一个方法getsSource(),该方法返回所发生事件的对象,即事件源。 事件监听者:不同类型的事件发生后,由事件监听者接收事件并调用相应的事件处理方法。 监听者对象:实现了监听者接口的类的实例,具有监听和处理某类事件的功能。
Java的委托事件模型
JAVA的事件处理机制 JDK1.1开始引入了委托事件模型,不同的事件源可产生不同种类的事件,不同的事件由不同的监听者处理。事件发生后,事件源将事件对象发给已经注册的所有监听者;监听者对象随后会根据事件对象内封装的信息,决定自己该如何响应这个事件。
AWTEvent类体系结构图 EventObject AWTEvent ActionEvent TextEvent AdjustmentEvent ComponentEvent ItemEvent WindowEvent ContainerEvent InputEvent PaintEvent FocusEvent MouseEvent KeyEvent
事件处理过程: 一般说来,每个事件类都有一个监听者接口与之对应,而事件类中的每个具体事件类型都有一个具体的抽象方法与之相对应,当具体事件发生时,这个事件将被封装成一个事件类的对象作为实际参数传递给与之对应的具体方法,由这个具体方法负责响应并处理发生的事件。 例如:与ActionEvent类事件对应的接口是ActionListener,这个接口定义了抽象方法: public void actionPerformed(ActionEvent e);
凡是要处理ActionEvent事件的类都必须: 1)实现ActionListener接口 2)重写actionPerformed()方法 在重写的方法体中,常需要调用参数e的有关方法,如调用e.getSource()查明ActionEvent事件的事件源,然后采取相应的措施处理该事件。 事件适配器(Adapters): 定义Listener时可以继承Adapters类,这样只需要重写自己需要的方法,其他方法不必实现,可以减少不必要的工作量。
4.3.2 动作事件(ActionEvent )的处理 能够触发动作事件的动作有: 点击按纽 双击一个列表框中的选项 选择菜单项 在文本框中输入回车 动作事件对应的事件类是ActionEvent类,其主要方法有: (1) public String getActionCommand( )—获得引发事件的项目信息 例:public void actionPerformed(ActionEvent e) { if ( e.getActionCommand( ) == ″按钮标签″ ) … }
(2) public int getModifiers( )—当动作是同时与功能键配合使用时,获得引发事件的组合键信息,如:ALT_MASK 动作事件对应的事件监听器是 ActionListener, 其主要方法是: actionPerformed(ActionEvent e) —发生动作事件时被调用 实现动作事件的操作过程是: 1)注册动作事件监听器 addActionListener(ActionListener) 2) 实现ActionListener接口的方法: actionPerformed(ActionEvent e)
4.3.3 文本事件(TextEvent)的处理 TextEvent类只包含一个事件,即代表文本区域中文本变化的事件TEXT-VALUE-CHANGED,在文本区域中改变文本内容。例如,删除字符、键入字符都将引发这个事件。这个事件比较简单,不需要特别判断事件类型的方法和常量。 Java中用于文本处理的基本组件有两种:单行文本框TextField和多行文本区域TextArea,它们都是TextComponent的子类。
例 TextComponentEvent.java import java.applet.*; import java.awt.*; import java.awt.event.*; public class TextComponentEvent extends Applet implements TextListener,ActionListener { TextField tf; TextArea ta; public void init() tf = new TextField(45); ta = new TextArea(10,45); add(tf); add(ta); tf.addActionListener(this); tf.addTextListener(this); }
public void textValueChanged(TextEvent e) { if(e.getSource()==tf) ta.setText(((TextField)e.getSource()).getText()); } public void actionPerformed(ActionEvent e) ta.setText("");
4.3.4 选择事件(ItemEvent)的处理 ItemEvent类只包含一个事件,即代表选择项的选中状态发生变化的事件ITEM-STATE-CHANGED。 引发这类事件的动作包括: (1) 改变列表类List对象选项的选中或不选中状态。 (2) 改变下拉列表类Choice对象选项的选中或不选中状态。 (3) 改变复选按钮类Checkbox对象的选中或不选中状态。 (4) 改变检测盒菜单项CheckboxMenuItem对象的选中或不选中状态。
ItmeEvent类的主要方法有: (1) public ItemSelectable getItemSelectable( ) 此方法返回引发选中状态变化事件的事件源,包括List对象、Choice对象、Checkbox对象等。 (2) public Object getItem( ) 此方法返回引发选中状态变化事件的具体选择项,例如用户选中的Choice中的具体item,通过调用这个方法可以知道用户选中了哪个选项。 (3) public int getStateChange( ) 此方法返回具体的选中状态变化类型,它的返回值在ItemEvent类的几个静态常量列举的集合之内: ① ItemEvent.SELECTED: 代表选项被选中。 ② ItemEvent.DESELECTED: 代表选项被放弃不选。
例 TestChoice.java import java.applet.*; import java.awt.*; import java.awt.event.*; public class TestChoice extends Applet implements ItemListener { Choice size; Button btn; public void init() size = new Choice(); size.add("10"); size.add("14"); size.add("18"); add(size); btn = new Button("效果"); add(btn); size.addItemListener(this); }
public void itemStateChanged(ItemEvent e) { Font oldF; String s; Choice temp; Font oldF; String s; int si; if(e.getItemSelectable( ) instanceof Choice) oldF = btn.getFont(); temp = (Choice)(e.getItemSelectable()); s = temp.getSelectedItem(); si = Integer.parseInt(s); btn.setFont(new Font(oldF.getName(),oldF.getStyle(),si)); }
4.3.5 调整事件(AdjustmentEvent)的处理 AdjustmentEvent类只包含一个事件——ADJUSTMENT-VALUE-CHANGED事件。 与ItemEvent事件引发的离散状态变化不同,ADJUSTMENT-VALUE-CHANGED是GUI组件状态发生连续变化的事件,引发这类事件的具体动作有: (1) 操纵滚动条(Scrollbar)改变其滑块位置。 (2) 操纵用户自定义的Scrollbar对象的子类组件,改变其滑块位置。
AdjustmentEvent类的主要方法有: (1) public Adjustable getAdjustable( ) 这个方法返回引发状态变化事件的事件源,能够引发状态变化事件的事件源都是实现了Adjustable接口的类。 (2) public int getAdjustmentType( ) 这个方法返回状态变化事件的状态变化类型,其返回值在AdjustmentEvent类的几个静态常量所列举的集合之内。 AdjustmentEvent.BLOCK-DECREMENT: 代表点击滚动条下方引发块状下移的动作。 AdjustmentEvent.BLOCK-INCREMENT: 代表点击滚动条上方引发块状上移的动作。 AdjustmentEvent.TRACK:代表拖动滚动条滑块的动作。
AdjustmentEvent.UNIT-DECREMENT: 代表点击滚动条下三角按钮引发最小单位下移的动作。 AdjustmentEvent.UNIT-INCREMENT: 代表点击滚动条上三角按钮引发最小单位上移的动作。 通过调用getAdjustmentType( )方法并比较其返回值,就可以得知用户发出的哪种操作引发了哪种连续的状态变动。 (3) public int getValue( ) 调用getValue( )方法可以返回状态变化后的滑块对应的当前数值。滑块是可以连续调整的,调整将引发AdjustmentEvent事件,getValue( )方法可以返回调整后滑块对应的最新数值。
例 TestSlider.java import java.applet.*; import java.awt.*; import java.awt.event.*; public class TestSlider extends Applet implements AdjustmentListener { Scrollbar mySlider; TextField sliderValue; public void init() setLayout(new BorderLayout()); mySlider = new Scrollbar(Scrollbar.HORIZONTAL,0,100,0,Integer.MAX_VALUE); mySlider.setUnitIncrement(1); mySlider.setBlockIncrement(50); add("South",mySlider); mySlider.addAdjustmentListener(this); sliderValue = new TextField(30); add("Center",sliderValue); }
public void adjustmentValueChanged(AdjustmentEvent e) { int value; if(e.getAdjustable() == mySlider) value = e.getValue(); sliderValue.setText(new Integer((int)value).toString()); sliderValue.setBackground(new Color(value)); }
4.3.6 鼠标事件处理 触发鼠标事件的事件源通常是一个容器,当鼠标进入、离开、在容器中单击鼠标、拖动鼠标等,都会发生鼠标事件。鼠标事件对应的事件类是MouseEvent类,主要包含如下方法: public int getX( )——发生鼠标事件的X坐标 public int getY( )——发生鼠标事件的Y坐标 public int getButton( )—— 返回鼠标事件发生在哪个按键上 public int getClickCount()—— 返回鼠标点击事件的点击次数 public boolean isPopupTrigger()——返回鼠标事件是否为弹出菜单的触发器。
鼠标事件对应的事件监听器有两个: MouseListener(或MouseAdapter)对应鼠标事件, MouseMontionListener(或MouseMontionAdapter)对应鼠标移动事件, MouseListener(或MouseAdapter)的主要方法: MouseClicked(MouseEvent e)单击鼠标时的处理方法 MouseEntered(MouseEvent e)鼠标进入时的处理方法 MouseExited(MouseEvent e) 鼠标离开时的处理方法 MousePressed(MouseEvent e)鼠标按钮按下时的处理方法 MouseReleased(MouseEvent e)鼠标按钮松开时的处理方法
MouseMontionListener(或MouseMontionAdapter)的主要方法: MouseMoved(MouseEvent e) 鼠标移动时的处理方法 MouseDragged(MouseEvent e)拖动鼠标时的处理方法 实现鼠标事件的过程: 1)注册MouseListener监听器addMouseListener(),当事件源所在的类已经实现MouseListener接口时,参数可用this,否则需要创建或继承一个MouseListener。 2) 实现MouseListener接口的5个主要方法。 鼠标移动事件的实现与此类似。
例:鼠标响应 ResponseToMouse .java import java.applet.*; import java.awt.*; import java.awt.event.*; public class ResponseToMouse extends Applet implements MouseListener, MouseMotionListener { String s="shubiao "; public void init() { this.addMouseListener(this); this.addMouseMotionListener(this); } public void mouseClicked(MouseEvent e) if(e.getClickCount()==1) showStatus("您在("+e.getX()+","+e.getY()+")单击了鼠标左键。"); else if(e.getClickCount()==2) showStatus("您在("+e.getX()+","+e.getY()+")双击了鼠标。");
public void mouseEntered(MouseEvent e) { showStatus("鼠标进入Applet。"); } public void mouseExited(MouseEvent e) showStatus("鼠标离开Applet。"); public void mousePressed(MouseEvent e) s="您按下了鼠标。。。。。。。"; repaint(); } public void mouseReleased(MouseEvent e) s=“您松开了鼠标。"; public void mouseMoved(MouseEvent e) showStatus("您移动了鼠标,新位置在("+e.getX()+","+e.getY()+")。"); public void mouseDragged(MouseEvent e) showStatus("您拖动了鼠标。");
4.3. 7 键盘事件处理 在具有键盘焦点的组件中按下或释放键盘等操作时,都会发生键盘事件。键盘事件对应的事件类是KeyEvent类,Java.awt.event.KeyEvent主要方法有: getKeyCode( )— 获得按下或释放的键代码 getKeyText( )— 获得按下或释放的键的字符串 键盘事件对应的事件监听器为:KeyListener 或KeyAdapter。 KeyListener的主要方法: keyPressed(KeyEvent e)——按下键时的处理方法 keyReleased(KeyEvent e)——释放键时的处理方法 keyTyped(KeyEvent e)——按下非系统键时的处理方法
4.3.8 窗口事件处理 有Window及其扩展(Frame、Dialog)等才能激发窗口事件。窗口事件对应的类为WindowEvent,监听器为WindowListener(或WindowAdapter),其主要方法有: windowOpened(WindowEvent e)——打开窗口 windowClosed(WindowEvent e)——关闭窗口 windowClosing(WindowEvent e)—窗口正在被关闭 windowActivated(WindowEvent e)——激活状态的事件处理 windowDeactivated(WindowEvent e)——无效状态的事件处理
WindowEvent类的主要方法—— public window getWindow(); 返回引发当前事件的具体窗口,与getSource()方法返回的是相同的事件引用,但getSource()返回类型是Object,而getWindow()返回的是具体的Window对象。 实现窗口事件的操作过程一般用到适配器,步骤: 1)注册 WindowListener 监听器 addWindowListener (),参数用WindowAdapter; 2)实现WindowAdapter接口的若干方法。
4.4 容器和布局管理器
4.4.1 AWT和Swing容器 (1)面板(Panel)(JPanel) Panel属于无边框容器,无边框容器包括Panel和Applet,其中Panel是Container的子类,Applet是Panel的子类。 创建面板: Panel() //用默认的布局管理器(FlowLayout) 创建 面板 Panel(LayoutManager layout) //用指定的布局管理器(FlowLayout)创建面板
(2) 窗口(Frame) (JFrame) Frame是独立于浏览器的可独立运行的主窗口,通常用于开发桌面应用程序。 Frame拥有边界和标题栏设置,大小、内容可以调整。 Frame是容器,里面需要加入组件,也可以加入菜单,可以在上面绘图。 Frame的创建 Frame()——创建一个没有窗口标题的窗口框架 Frame(String)——创建一个指定窗口标题的窗口框架
Frame的主要方法 方法 功能 void setIconImage(Image ) 设置窗口的图标 Image getIconImage( ) 获得窗口的图标 MenuBar getMenuBar( ) 获得窗口的菜单栏 void setTitle(String ) 设置窗口的标题 String getTitle( ) 获得窗口的标题 Boolean isResizable( ) 如果窗口大小可变返回真值 void setMenuBar(MenuBar ) 设置窗口的菜单栏 void remove(MenuComponent) 从窗口中去掉指定的菜单栏 void dispose( ) 清除窗口对象
4.4.2 布局管理器 每一个容器组件都有一个默认的布局管理方式,也可以用setLayout方法来设置其他布局管理器。一旦确定了布局管理方式,容器组件就可以用add方法加入组件。 布局管理器用来确定组件在容器中的位置和大小,AWT中定义了布局管理器接口LayoutManager的实现类来实现此功能。
LayoutManager的实现类: (1) FlowLayout布局管理器 FlowLayout BorderLayout GridLayout GridBagLayout CardLayout null LayoutManager的实现类: (1) FlowLayout布局管理器 FlowLayout是一种最简单的布局管理,是Panel的默认布局。它以流式自左向右、自上而下地放置容器中的组件,其默认方式为居中对齐方式,也可以手工设置左对齐或右对齐。
创建默认的FlowLayout布局管理器: FlowLayout() 以指定的对齐方式创建: FlowLayout(int) FlowLayout(int,int,int) FlowLayout.LEFT FlowLayout.RIGHT FlowLayout.CENTER 对齐方式 组件行间距 组件列间距
(2) BorderLayout布局管理器 BorderLayout是Frame和Dialog的默认布局。它将整个容器分为东、西、南、北、中5个部分,加入组件时需要指明放置的位置。 创建默认的BorderLayout布局管理器: BorderLayout() 以指定的行、列间距创建BorderLayout布局管理器: BorderLayout(int,int) 组件行间距 组件列间距
BorderLayout的主要方法 int getHgap( ) 返回组件间距 int getVgap( ) 返回列间距 void setHgap(int) 设置组件间距 void setVgap(int) 设置列间距
(3) GridLayout布局管理器 GridLayout布局将容器划分成m行x n列大小相同的格子,组件放在格子中。 GridLayout(int,int) 以指定的行数、列数、行间距、列间距创建布局: GridLayout(int,int,int,int)
GridLayout的主要方法 int getHgap( ) 返回组件间距 int getVgap( ) 返回列间距 void setHgap(int) 设置组件间距 void setVgap(int) 设置列间距 int getRows( ) 获取网格的行数 int getColumns( ) 获取网格的列数 void setRows(int) 设置网格的行数 void setColumns(int ) 设置网格的列数
import java.applet.*; import java.awt.*; import java.awt.event.*; public class TestGridLayout extends Applet { public void init() setLayout(new GridLayout(5,6)); //GridLayout布局策略5行6列30网格 for(int i=0;i<5;i++) for(int j=0;j<6;j++) // if((int)(Math.random()*100)>=0) if((int)(Math.random()*100)>=50) add(new Button(Integer.toString(i*6+j))); //随机加入按钮 else add(new Label()); //随机加入空白 }
(4) GridBagLayout布局管理器 通过设置和组件有关的GridContaints对象的属性来分配每个组件,然后调用GridBagLayout的setContaints方法将组件与GridContaints对象关联,最后将组件加入容器中。
GridContaints对象的常用属性 (1)gridwidth, gridheight 这两个参数决定组件所占空间单元的行数和列数,默认值为1。 (2)fill 当组件显示区域比其尺寸大时,该参数确定怎样重新定义组件大小,其默认值为: GridBagContaints.NORE (不重新定义大小) 还可以为: GridBagContaints.Horizontal (水平方向拉伸填满) GridBagContaints.Vertical (垂直方向拉伸填满) GridBagContaints.BOTH (两个方向拉伸填满) (3)weightx, weighty 指定分配多余空间的方式
(4) CardLayout布局管理器 CardLayout布局将容器中的组件象扑克牌一样排列,每次只能显示最上面的一张。 以指定的行间距、列间距创建GridLayout布局: CardLayout(int,int) 将组件(通常是Panel)以CardLayout加入时,需要指定一个名字,如:add(“ONE”, Panel)
CardLayout的主要方法 int getHgap( ) 返回组件间距 int getVgap( ) 返回列间距 void setHgap(int) 设置组件间距 void setVgap(int) 设置列间距 void first( ) 显示第一个加入布局的组件 void last( ) 显示最后一个加入布局的组件 void next( ) 显示当前组件的下一个组件 void previous( ) 显示当前组件的前一个组件
(5) null 布局管理器 null 布局管理器将主动权交给用户,由用户使用坐标系统来放置每个组件,即调用组件的setBounds()方法来设置位置和大小。 如: this.setLayout(null); Label L1=new Label(“test”); L3.setBounds(new Rectangle(108, 2, 98, 37)); Add(L3); X 、y 坐标、长、宽
4.5 对话框 4.5.1 对话框类 (Dialog)(JDialog ) Dialog用来显示或者提示输入信息,与用户进行交互。 4.5 对话框 4.5.1 对话框类 (Dialog)(JDialog ) Dialog用来显示或者提示输入信息,与用户进行交互。 Dialog是一个容器组件,上面可以放置各类组件。
Dialog与Frame的区别: (1) Dialog不能自动实现菜单容器类; (2) Dialog依赖于其他窗口,当所依赖的窗口最小化时,对话框自动消失;当其所依赖的窗口恢复时,对话框也自动恢复; (3) Dialog有模式(model)和非模式两种,模式对话框只让应用程序响应对话框内的事件,而不能响应其他窗体中的事件,非模式对话框可以响应其他窗体中的事件。
对话框组件的创建 (1) Dialog(Frame,boolean)——以指定父窗体和指定模式创建对话框 (2) Dialog(Frame,String,boolean)——以指定父窗体、指定标题和指定模式创建对话框 boolean isModel( ) 获取对话框的模式,true=模式 Boolean isResizable( ) 如果对话框可变大小,返回true void setTitle(String ) 设置对话框的标题 String getTitle( ) 获得对话框的标题 String paramString 返回对话框的参数字符串 void setSize( ) 设置对话框的大小 void setVisible( ) 显示或隐藏对话框
4.5.2 文件对话框(FileDialog)(JFileChooser) FileDialog是Dialog的子类, 文件对话框主要用于打开和保存文件时让用户选择文件名,一般文件对话框是由操作系统提供的标准对话框。 文件对话框的属性变量 (1) FileDialog.LOAD——打开文件对话框 (2) FileDialog.SAVE——保存文件对话框
文件对话框的创建 (1) FileDialog (Frame)——创建指定父窗体的对话框 (2)FileDialog (Frame,String)——创建指定父窗体和标题的对话框 (3)FileDialog (Frame,String,int)——创建指定父窗体、标题和模式的对话框。当模式为FileDialog.LOAD时即打开文件对话框,当模式为FileDialog.SAVE时即保存文件对话框。
文件对话框的主要方法 String getDirectory( ) void setDirectory(String ) 设置文件的路径 返回用户选定文件所在的路径 void setDirectory(String ) 设置文件的路径 String getFile( ) 返回用户选定文件的名称 Int getMode() 返回对话框的模式 void setFile(String ) 设置文件名称
4.5.3 颜色对话框 例: 颜色对话框是有模式对话框,可以用 javax. swing. JColorChooser类的静态方法来创建: public static Color showDialog( Component parentComponent, String title, Color initialColor) 例: Color newColor=JColorChooser.showDialog(this,"选择颜色", Color.red);
4.5.4 JOptionPane框对话 ( 1) 消息对话框 是有模式对话框,可以用 javax. swing. JOptionPane类的静态方法showMessageDialog()来创建: public static void showMessageDialog( Component parentComponent, String message, String title, int messageType) 例: JOptionPane. showMessageDialog ( this,"上课不能睡觉!", "警告对话框", JOptionPane. WARNING_MESSAGE);
可供选择的messageType 选项值: ERROR_MESSAGE INFORMATION_MESSAGE WARNING_MESSAGE QUESTION_MESSAGE PLAIN_MESSAGE
(2) 确认对话框 确认对话框是有模式对话框,可以用 javax. swing. JOptionPane类的静态方法 showConfirmDialog()来创建: public static int showConfirmDialog( Component parentComponent, Object message, String title, int optionType, int messageType) 例: JOptionPane. showConfirmDialog( this,"大家看清楚了吗?", "确认对话框", JOptionPane.YES_NO_OPTION );
可供选择的optionType 选项值: DEFAULT_OPTION YES_NO_OPTION YES_NO_CANCEL_OPTION OK_CANCEL_OPTION
(3)输入对话框 输入对话框是有模式对话框,可以用 javax. swing. JOptionPane类的静态方法 showInputDialog()来创建: public static String showInputDialog ( Component parentComponent, Object message, String title, int messageType) 例: String name=JOptionPane. showInputDialog(null, “请输入你的名字”, “输入对话框", JOptionPane.INFORMATION_MESSAGE );
对话框可能的返回值: YES_OPTION NO_OPTION CANCEL_OPTION OK_OPTION CLOSED_OPTION
4.6 菜 单 菜单栏(MenuBar) (JMenuBar) 菜单组件 菜单(Menu) (JMenu) 4.6 菜 单 菜单栏(MenuBar) (JMenuBar) 菜单组件 菜单(Menu) (JMenu) 菜单项(MenuItem) (JMenuItem) 一般菜单栏放置在Frame窗口中,只要调 用setMenuBar()方法即可。 菜单栏 菜单 菜单项
1. 菜单栏MenuBar (1)创建菜单栏: MenuBar() (2) MenuBar的主要方法 void add(Menu) 将指定菜单加入菜单栏 int countMenu( ) 返回菜单栏中的菜单数 Menu getMenu(int) 返回指定位置上的菜单 void remove(int) 删除指定位置上的菜单 void remove(MenuComponent) 删除指定的菜单组件
2. 菜单Menu (1)用指定标签创建菜单: Menu(String) (2) Menu的主要方法 void add(MenuItem) 增加一个菜单项 void add(String) 增加一个带指定标签的菜单项 void addSeparator() 加分隔线 int countItems( ) 返回菜单的菜单项数 int getItem(int) 返回指定位置上的菜单项 void remove(int) 删除指定位置上的菜单 void remove(MenuComponent) 删除指定的菜单组件
3. 菜单项MenuItem (1)用指定标签创建菜单项: MenuItem(String) (2) MenuItem的主要方法 void disable( ) 使菜单项无效 void enable() 使菜单项有效 void setEnabled(boolean) 设置菜单项是否有效 String getLabel( ) 获取菜单项的标签 boolean isEnabled () 返回菜单项是否有效 void setLabel(String ) 设置菜单项的标签
4. 子菜单项CheckboxMenuItem(带勾) (1)用指定标签创建一个可选菜单项: CheckboxMenuItem(String) (2)用指定标签和初始状态创建一个可选菜单项: CheckboxMenuItem(String, boolean ) (3) MenuItem的主要方法 void getState(boolean ) 设置子菜单项的状态 void setState(boolean ) 返回子菜单项的状态
5. 快捷菜单PopupMenu (1)用指定标签创建菜单: PopupMenu(String) (2) PopupMenu的主要方法 void show(Component, int, int) 在指定组件的指定位置显示快捷菜单