Download presentation
Presentation is loading. Please wait.
1
第6章回顾 Applet Applet方法 Java Applet也称为小应用程序,嵌入在网页中运行
init( ) ----完成对Applet实例的初始化 repaint()--->update(g)--->paint(g) drawString(String s, int x, int y) drawLine(int x1, int y1, int x2, int y2) drawImage(4个参数) 如何从html文件将参数传递给applet?
2
第7章 图形用户界面的设计与实现 7.1 图形用户界面核心概念 7.2 容器与布局管理 7.3 常用GUI标准组件 7.4 鼠标和键盘事件
第7章 图形用户界面的设计与实现 7.1 图形用户界面核心概念 7.2 容器与布局管理 7.3 常用GUI标准组件 7.4 鼠标和键盘事件 7.5 菜单的使用 7.6 对话框的使用
3
容器---可以容纳GUI部件(按某种布局) ----窗体 、面板
图形用户界面核心概念 7.1 图形用户界面核心概念---示例 GUI部件 容器---可以容纳GUI部件(按某种布局) ----窗体 、面板 部件---部署在容器中,实现某种交互。 ----文本框、按纽、标签等
4
方法1: Frame f = new Frame(“标题“)
图形用户界面核心概念 ♣ 创建窗体 方法1: Frame f = new Frame(“标题“) 方法2: class MyFrame extends Frame …. Frame f = new MyFrame(“标题“)
5
♣ 创建GUI部件 创建文本框、按钮、标签 TextField x=new TextField(10);
图形用户界面核心概念 ♣ 创建GUI部件 创建文本框、按钮、标签 TextField x=new TextField(10); Button b=new Button(“ok”); Label dis=new Label(“hint…”);
6
布局设置 setLayout(new FlowLayout())
图形用户界面核心概念 ♣ 将部件加入窗体容器 布局设置 setLayout(new FlowLayout()) 加入部件 add(部件对象1); add(部件对象2); …..
7
♣ 处理事件 事件处理 ------委托事件处理模型 事件源----发生事件 事件监听者---处理事件 ----符合相应接口要求
图形用户界面核心概念—事件处理 ♣ 处理事件 事件处理 委托事件处理模型 事件源----发生事件 事件监听者---处理事件 ----符合相应接口要求
8
图形用户界面核心概念—事件处理 事件委托处理—图
9
button.addActionListener(ActionListener a);
图形用户界面核心概念—事件处理 ♣ 委托事件处理---过程 (1)给事件源对象注册监听者 button.addActionListener(ActionListener a); (2)给监听者编写事件处理代码 public void actionPerformed(ActionEvent e) { …… }
10
---要其actionPerformed中方便访问事件处理相关对象
图形用户界面核心概念 ♣ 谁作为监听者合适? ---要其actionPerformed中方便访问事件处理相关对象 (1)事件源对象的容器类作为监听者 addActionListener(this); (2)用内嵌类实现 addActionListener(new Process()); (3)用匿名内嵌类实现 addActionListener(new ActionListener() {…..} );
11
♣ 演练例子 提示: 颜色由三色构成: red ,green,blue (0-255) new Color(red,green,blue)
图形用户界面核心概念 ♣ 演练例子 编程改变Applet背景的颜色, 在Applet中安排一个按钮,每次点击按钮随机换一种新颜色。 提示: 颜色由三色构成: red ,green,blue (0-255) new Color(red,green,blue) 用setBackground(Color)设置背景
12
图形用户界面核心概念 ♣ 作业 编写一个窗体应用程序,在窗体中安排一个标签和一个按钮,在标签上显示按钮的点击次数。标签初始显示0,以后每点击一次按钮,标签上显示的数值增1。
13
区分事件源 编写一个窗体应用程序,在窗体中安排两个文本框,一个标签,两个标记为“+”和“*”的按钮,从两个文本框输入两个数,点击“+”按钮将文本框中两个数进行加法运算,结果显示在标签中;点击“*”按钮将文本框中两个数进行减法运算,结果显示在标签中。
14
---ActionEvent对象提供方法
图形用户界面核心概念—事件处理 ♣ 在动作事件处理代码中区分事件源 ---ActionEvent对象提供方法 getSource() 用来获取事件源对象。 getActionCommand() 结果为字符串,用来获取按钮事件对象的命令名
15
♥ 关键代码 public void actionPerformed(ActionEvent e) {
int x1=Integer.parseInt(f1.getText()); int x2=Integer.parseInt(f2.getText()); if ( e.getActionCommand().equals(“+”) ) res.setText(""+(x1+x2)); else res.setText(""+(x1*x2)); }
16
♣ 上机练习 设有一批英文单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签显示单词,另有“上一个”、“下一个”两个按钮实现单词的前后翻动。
17
7.2 布局管理 FlowLayout(流式布局) BorderLayout(边缘或方位布局) GridLayout(网格布局) CardLayout(卡片式布局) GridBagLayout(网格块布局)
18
布局管理---FlowLayout(流式布局)
从上到下、左到右排放,放不下再换至下一行 -----不会改变控件的大小。 按照参数要求安排部件间的纵横间隔和对齐方式 public FlowLayout() 居中对齐方式,组件纵横间隔5个像素。 public FlowLayout(int align, int hgap, int vgap) 3个参数分别指定对齐方式、纵、横间距 public FlowLayout(int align) 参数规定对齐方式,组件纵横间距默认5个像素。
19
布局管理---BorderLayout(边缘或方位布局)
将容器内部空间分为东(East)、南(South)、西(West)、北(North)、中(Center)五个区域
20
BorderLayout(边缘或方位布局)
布局管理 BorderLayout(边缘或方位布局) 控件的大小随容器大小改变。 按照参数要求安排部件间的纵横间隔和对齐方式 public BorderLayout() 各组件之间的纵横间距为0 public BorderLayout(int hgap, int vgap) 2个参数分别指定纵、横间距 加入组件 add(方位名字符串, 组件)
21
GridLayout布局 把容器的空间分为若干行乘若干列的网格区域 组件按从左向右,从上到下的次序被加到各单元格中
布局管理 GridLayout布局 把容器的空间分为若干行乘若干列的网格区域 组件按从左向右,从上到下的次序被加到各单元格中 组件的大小将调整为与单元格大小相同。
22
GridLayout构造方法 public GridLayout() 所有组件在一行中。
布局管理 GridLayout构造方法 public GridLayout() 所有组件在一行中。 public GridLayout(int rows,int cols) 通过参数指定布局的行和列数。 public GridLayout(int rows,int cols,int hgaps,int vgaps) 指定划分的行列数以及组件间的水平和垂直间距。
23
GridLayout布局—加入组件 add(组件名) public void init() {
布局管理 GridLayout布局—加入组件 add(组件名) public void init() { this.setLayout(new GridLayout(3, 3, 10, 10)); for (int i = 1; i <= 9; i++) this.add(new Button("Button #" + i)); }
24
CardLayout布局 构造方法 组件加入 加入的部件叠成卡片的形式 public CardLayout()
布局管理 CardLayout布局 加入的部件叠成卡片的形式 构造方法 public CardLayout() 显示组件将占满整个容器,不留边界。 public CardLayout(int hgap,int vgap) 容器边界分别留出水平和垂直间隔,组件占中央。 组件加入 add(字符串, 组件名) 其中,字符串用来标识卡片名称。
25
CardLayout布局---卡片翻动 show(容器,字符串):显示指定名称的卡片 first(容器) :显示第一块卡片
布局管理 CardLayout布局---卡片翻动 show(容器,字符串):显示指定名称的卡片 first(容器) :显示第一块卡片 last(容器) :显示最后一块卡片 next(容器) :显示下一块卡片
27
常用GUI标准组件
28
Component类(抽象类) Color getBackground() : 获取部件的背景色
常用GUI标准组件 Component类(抽象类) Color getBackground() : 获取部件的背景色 Font getFont() : 获取部件的显示字体 Graphics getGraphics(): 获取部件的Graphics属性对象 void repaint(int x,int y,int width,int height) : 对部件的特定区域进行重新绘图 void setBackground(Color c) : 设置部件的背景 void setEnabled(boolean b) : 是否让部件功能有效,在无效情况下部件变灰 void setFont(Font f) : 设置部件的显示字体 void setSize(int width,int height) : 设置部件的大小 void setVisible(boolean b) : 设置部件是否可见 void setForeground(Color c) : 设置部件的前景色 void requestFocus() : 让部件得到焦点 void add(PopupMenu popup) :给部件加入弹出菜单
29
文本框(TextField) 文本框只能编辑一行数据 构造方法有四种: TextField():构造一个单行文本输入框。
常用GUI标准组件 文本框(TextField) 文本框只能编辑一行数据 构造方法有四种: TextField():构造一个单行文本输入框。 TextField(int):指定长度的单行文本输入框。 TextField(String):指定初始内容的单行文本输入框。 TextField(String, int):指定长度、指定初始内容。 tf1 = new TextField(); tf2 = new TextField("", 20); tf3 = new TextField("Hello!"); tf4 = new TextField("Hello", 30);
30
文本框(TextField) 常用方法: setEchoChar(‘*’) 设置回显字符 getText() :获取输入框中的数据
setText() :往输入框写入数据 isEditable():判断输入框是否可编辑。
31
文本框(TextField)---事件 ActionEvent事件----在文本框按回车键时引发
常用GUI标准组件 文本框(TextField)---事件 ActionEvent事件----在文本框按回车键时引发 注册:addActionListener(); 接口:ActionListener 方法: public void actionPerformed(ActionEvent e) TextEvent事件---对文本输入部件数据更改操作 (添加、修改、删除) 注册: addTextListener() 接口:TextListener 方法: public void textValueChanged(TextEvent e)
32
♣ 练习:验证密码域只能输入数字字符 public void textValueChanged(TextEvent e) { String s = pass.getText(); char last=s.charAt(s.length()-1); if (! Character.isDigit(last)) { hint.setText("只能是数字,重输:"); pass.setText(""); } }
33
文本域(TextArea) 特点1:可以编辑多行文字 构造方法有四种: TextArea():构造一个文本域。
常用GUI标准组件 文本域(TextArea) 特点1:可以编辑多行文字 构造方法有四种: TextArea():构造一个文本域。 TextArea(int, int):构造一个指定长度和宽度的文本域。 TextArea(String):构造一个显示指定文字的文本域。 TextArea(String, int, int):按指定长度、宽度和默认值构造多行文本域。 特点2:在已有内容的基础上补充新数据 append(String s):将字符串添加到文本域的末尾 insert(String s,int index):将字符串插入到文本域的指定位置
34
常用GUI标准组件 ♣ 思考练习 在图形界面中,安排一个文本框和文本域。将文本框键入的字符同时显示在文本域中,也既同步显示。
35
1. 选择事件 (ItemEvent)类 public ItemSelectable getItemSelectable()
常用GUI标准组件 1. 选择事件 (ItemEvent)类 public ItemSelectable getItemSelectable() public Object getItem() public int getStateChange() 返回值: ItemEvent.SELECTED : 代表选项被选中。 ItemEvent.DESELECTED :代表选项被放弃不选。
36
2.复选按钮 (Checkbox) ⑴ 举例 : Checkbox backg = new Checkbox("背景色 "); ⑵ 常用方法
常用GUI标准组件 2.复选按钮 (Checkbox) ⑴ 举例 : Checkbox backg = new Checkbox("背景色 "); ⑵ 常用方法 boolean getState() : 获取复选按钮的选中状态,返回true代表按钮被选中 void setState(boolean value) :设置复选按钮的状态,vlaue为true表示选中。 ⑶ 事件响应 itemStateChanged(ItemEvent e)方法 通过 e.getItemSelectable()获得事件源对象引用 调用 getState()获取事件 源对象的状态。
37
常用GUI标准组件 例7-11 一个简单的多选题练习程序
38
常用GUI标准组件 例7-11 一个简单的多选题练习程序 import java.awt .*; import java.applet .*; import java.awt.event.* ; public class FuXuan extends Applet implements ActionListener { String question[]={"Java test question1\n A. choice1\n B.choice2\n C.choice3" ,"Java test question2\n A. good\n B. bad\n C. luck"}; String ch[]={"A","B","C"}; String answer[]={"AB","BC"}; Checkbox cb[]=new Checkbox[3]; Label hint; TextArea content; int bh=0; Button ok,next, previous;
39
setLayout(new BorderLayout());
常用GUI标准组件 public void init() { setLayout(new BorderLayout()); content =new TextArea(10,50); add("Center",content); content.setText(question[bh]); Panel p=new Panel(); p.setLayout(new GridLayout(2,1)); Panel p1=new Panel(); for (int i=0;i<ch.length;i++ ) { cb[i] = new Checkbox(ch[i]); p1.add(cb[i]); }
40
p.add(p1); Panel p2=new Panel(); ok=new Button(" 确定 ");
常用GUI标准组件 p.add(p1); Panel p2=new Panel(); ok=new Button(" 确定 "); p2.add(ok); hint=new Label(" 对错提示"); p2.add(hint); next=new Button(" 下一题 "); p2.add(next); previous=new Button(" 上一题 "); p2.add(previous); p.add(p2); add("South",p); next.addActionListener(this); previous.addActionListener(this); ok.addActionListener(this); }
41
例7-11(续4)解答判定 public void actionPerformed(ActionEvent e) {
if (e.getSource()==ok) { String s=""; for (int i=0;i<ch.length;i++ ) if (cb[i].getState()) s=s+cb[i].getLabel(); if (s.equals(answer[bh])) hint.setText("对"); else hint.setText("错");
42
例7-11(续5)//翻动试题 } else if (e.getSource()==next) {
常用GUI标准组件 例7-11(续5)//翻动试题 } else if (e.getSource()==next) { if (bh<question.length-1) bh++; content.setText(question[bh]); } else { if (bh>0) bh--; } } }
43
3. 单选按钮(CheckBoxGroup) 使用复选框组,可以实现单选框的功能。例如:
常用GUI标准组件 将按钮组合 3. 单选按钮(CheckBoxGroup) 使用复选框组,可以实现单选框的功能。例如: CheckboxGroup style = new CheckboxGroup() ; Checkbox p = new Checkbox("普通 ", true, style); Checkbox b = new Checkbox("黑体 ", false, style); Checkbox i = new Checkbox("斜体 ", false, style); 【注意】把CheckboxGroup加入容器时必须将每个Checkbox对象逐一加入容器,不能使用CheckboxGroup对象一次性加入。
44
事件编程处理 每个单选按钮要单独注册监听者
常用GUI标准组件 事件编程处理 每个单选按钮要单独注册监听者 在事件处理代码中通过CheckboxGroup的对象的getSelectCheckbox()方法可获取当前被选中的选项按钮对象,要设置选项按钮i为选中状态可通过方法setSelectedCheckbox(i)。 选项按钮的其他方法: getLabel()方法可获取选项按钮的标识 getState()可判选项按钮对象是否选中。 setState()设置某个单选按钮为选中状态。
45
例7-12 用单选按钮控制画笔的颜色 import java.awt .*; import java.applet .*;
常用GUI标准组件 例7-12 用单选按钮控制画笔的颜色 import java.awt .*; import java.applet .*; import java.awt.event.* ; public class ChangeColor extends Applet implements ItemListener { String des[]={"红色","兰色","绿色","白色","灰色"}; Color c[]={Color.red,Color.blue,Color.green ,Color.white,Color.gray}; Color drawColor=Color.black;
46
CheckboxGroup style = new CheckboxGroup();
常用GUI标准组件 public void init() { CheckboxGroup style = new CheckboxGroup(); for (int i=0;i<des.length;i++ ) { Checkbox one=new Checkbox(des[i],false,style); one.addItemListener(this); add(one); }
47
/* 根据drawColor的颜色绘制文字 */
常用GUI标准组件 /* 根据drawColor的颜色绘制文字 */ public void paint(Graphics g) { g.setColor(drawColor); g.setFont(new Font("变色字", Font.BOLD,24)); g.drawString("变色字",80,80); }
48
根据选择的按钮设置drawColor的颜色值
常用GUI标准组件 根据选择的按钮设置drawColor的颜色值 public void itemStateChanged(ItemEvent e){ Checkbox temp=(Checkbox)e.getItemSelectable(); for (int i=0;i<des.length ; i++) { if (temp.getLabel()==des[i]) { drawColor=c[i]; repaint(); break; } } } }
49
4.下拉列表(Choice) “多选一”控件 下拉列表是作为一个整体加入到容器,各个列表元素不是独立的操作对象。
常用GUI标准组件 4.下拉列表(Choice) “多选一”控件 下拉列表是作为一个整体加入到容器,各个列表元素不是独立的操作对象。 下拉列表也是产生ItemEvent类的选择事件 对下拉列表的选项值的判定处理有两种方法可供选择:一种是根据选项在列表中的序号,即通过getSelectedIndex()方法;另一种是通过getSelectItem()方法获取列表项对应的字符串 。
50
select(int index)和select(String item):强制将某列表项定为选中状态;
常用GUI标准组件 相关方法: select(int index)和select(String item):强制将某列表项定为选中状态; add(String item) 和insert(String item,int index):添加新元素到列表中 remove(int index)和 remove(String item):删除某个列表元素 removeAll():删除所有元素。
51
例7-13 用下拉列表控制Applet的背景变化
常用GUI标准组件 例7-13 用下拉列表控制Applet的背景变化 import java.awt .*; import java.applet .*; import java.awt.event.* ; public class ChangeColor2 extends Applet implements ItemListener{ String des[]={"红色","兰色","绿色","白色","灰色"}; Color c[]={Color.red,Color.blue,Color.green,Color.white,Color.gray}; public void init() { Choice color = new Choice(); for (int i=0;i<des.length;i++ ) color.add(des[i]); color.addItemListener(this); add(color); }
52
常用GUI标准组件 例7-13(续) public void itemStateChanged(ItemEvent e){ Choice temp=(Choice)e.getItemSelectable(); for (int i=0;i<des.length ; i++) { if (temp.getSelectedIndex()==i) { setBackground(c[i]); break; } } }
53
5. 列表(List) 列表与下拉列表的区别有两点:
常用GUI标准组件 5. 列表(List) 列表与下拉列表的区别有两点: 一是列表可以在屏幕上看到一定数目的选择项,而下拉列表只能看到一项; 另一点用户可能允许同时选择列表中的多项,而下拉列表只能选一项。 MyList = new List(4, true); 给列表添加选项用add方法 下拉列表的方法均可用于列表对象,另外,由于列表支持多选,因此,列表中还提供有getSelectItems()方法和getSelectedIndexs()方法,它们返回的均是数组,分别代表哪些选中的选项的字符串和序号。
54
列表可以产生两类事件: ItemEvent类选择事件,当单击某选项时触发。 ActionEvent类动作事件。当双击某选项触发。
值得注意的是,双击事件不能覆盖单击事件,当用户双击一个选项时,首先产生双击、然后产生单击。
55
例7-14 假设有一个发文系统,需要将一份文件发给多个单位
例7-14 假设有一个发文系统,需要将一份文件发给多个单位 import java.applet.*; import java.awt.*; import java.awt.event.*; public class TestList extends Applet implements ActionListener,ItemListener { List myList; Label result; String unit[]={"总务处","教务处","工会","科研处","信息学院","机械学院"};
56
public void init() { myList = new List(5,true); for (int i=0;i<unit.length;i++) myList.add(unit[i]); add(myList); myList.addActionListener(this); myList.addItemListener(this); }
57
/* 响应动作事件*/ public void actionPerformed(ActionEvent e) { if(e.getSource()==myList) showStatus("您双击了选项"+e.getActionCommand()); }
58
/* 响应选择事件*/ public void itemStateChanged(ItemEvent e) { String sList[]; String str = ""; List temp = (List)(e.getItemSelectable()); sList = temp . getSelectedItems() ; for(int i=0;i<sList.length;i++) str = str + sList[i] + " "; showStatus("您选择了选项:"+str); } }
59
1、创建滚动条 滚动条按方向分垂直和水平两种。例如,以下代码创建一个水平滚动条:
Scrollbar mySlider = new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,255); 有关说明: (1)第1个参数为常量,代表水平滚动条,如果是垂直滚动条,则为Scrollbar.VERTICAL; (2)第2个参数代表为初始值; (3)第3个参数代表滚动条的滑块长度; (4)第4、5个参数分别代表滚动条的最小和最大值,由于滚动条滑块要占一定宽度,所以滚动条的实际最大值=最大值-滑块长度。
60
2、滚动条的事件处理 AdjustmentEvent(调整值变化事件)是在滚动条滑块移动时引发。在滚动条上可通过多种操作来改变其滑块位置,例如:用户可以拖动滚动条的滑块,点击块增量区或上、下三角按钮均会导致滑块的变化,而且移动的步长不同,按Page Up和Page Down键也相当于点击滚动条的块增量区 使用addAdjustmentListener()方法给滚动条注册监听者,监听者要求实现AdjustmentListener接口,该接口中包含如下方法: public void adjustmentValueChanged(AdjustmentEvent e)
61
滚动条编程的要点是对滚动条所代表的值的获取与设置,如下方法分别用来获取和设置滚动条的当前值:
public int getValue() public void setValue(int newValue) 如下方法获取事件源和引起值变化的调整类型: Adjustable getAdjustable() 返回引发状态变化的事件源对象。 int getAdjustmentType() 返回引发状态变化事件的调整类型
62
调整类型值可通过以下常量进行判断。 AdjustmentEvent.BLOCK_DECREMENT 点击下方引取下移
AdjustmentEvent.BLOCK_INCREMENT 上移 AdjustmentEvent.TRACK 拖动滑块 AdjustmentEvent.UNIT_DECREMENT 点击下三角按钮 AdjustmentEvent.UNIT_INCREMENT 点了上三角按钮
63
设定和获取滚动条滑块的移动增量值 void setUnitIncrement(int) //指定单位增量
void setBlockIncrement(int) //指定块增量 int getUnitIncrement() //获取单位增量 int getBlockIncrement() //获取块增量
64
例7-15 利用滚动条设计一个调色控制板用来调整任意部件的颜色
例7-15 利用滚动条设计一个调色控制板用来调整任意部件的颜色 import java.applet.*; import java.awt.*; import java.awt.event.*; class colorBar extends Scrollbar { public colorBar() { super(Scrollbar.HORIZONTAL,0,40,0,295); this.setUnitIncrement(1); this.setBlockIncrement(50); }
65
class ColorPanel extends Panel implements AdjustmentListener {
Scrollbar redSlider = new colorBar(); Scrollbar greenSlider = new colorBar(); Scrollbar blueSlider = new colorBar(); Canvas mycanvas = new Canvas(); Color color;
66
public ColorPanel() { Panel x=new Panel(); x.setLayout(new GridLayout(3,2,1,1)); x.add(new Label("red")); x.add(redSlider); x.add(new Label("green")); x.add(greenSlider); x.add(new Label("blue")); x.add(blueSlider); setLayout(new GridLayout(2,1,5,5)); add(mycanvas); add(x); redSlider.addAdjustmentListener(this); greenSlider.addAdjustmentListener(this); blueSlider.addAdjustmentListener(this); }
67
/* 滚动条调整时,根据调整值改变画布的颜色 */
public void adjustmentValueChanged(AdjustmentEvent e) { int value1,value2,value3; value1 = redSlider.getValue(); value2 = greenSlider.getValue(); value3 = blueSlider.getValue(); color= new Color(value1,value2,value3); mycanvas.setBackground(color); }
68
public class TestSlider extends Applet
{ public void init() { setLayout(new BorderLayout()); add("Center",new ColorPanel()); } }
69
7.1.4 鼠标事件 共有7种情形,用 MouseEvent类的同名静态整型常量标志, 分别是 MOUSE_DRAGGED
鼠标事件 共有7种情形,用 MouseEvent类的同名静态整型常量标志, 分别是 MOUSE_DRAGGED MOUSE_ENTERED MOUSE_EXITED MOUSE_MOVED MOUSE_PRESSED MOUSE_RELEASED MOUSE_CLICKED
70
鼠标事件的处理接口 MouseListener MouseMotionListener
负责接收和处理鼠标的press(按下)、release(释放)、click(点击)、enter(移入)和exit(移出)动作触发的事件; MouseMotionListener 负责接收和处理鼠标的move(移动)和drag(拖动)动作触发的事件。
71
MouseEvent类 public int getX() :返回发生鼠标事件的 X坐标。
public int getY() :返回发生鼠标事件的 Y坐标。 public Point getPoint() :返回 Point对象,也即鼠标事件发生的坐标点。 public int getClickCount() :返回鼠标点击事件的连击次数。
72
一个鼠标位置跟踪程序,在当前位置画红色小圆
import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class extends Applet implements MouseMotionListener { private static final int RADIUS = 7; private int posx=10,posy=10; public void init() { addMouseMotionListener (this); }
73
一个鼠标位置跟踪程序,在当前位置画红色小圆 (续1)
public void paint(Graphics g) { //在鼠标位置画红色小圆 g.setColor(Color.red); g.fillOval(posx-RADIUS, posy-RADIUS, RADIUS * 2, RADIUS * 2); }
74
一个鼠标位置跟踪程序,在当前位置画红色小圆 (续2)
/* 对鼠标移动事件进行处理*/ public void mouseMoved(MouseEvent event) { posx = event.getX(); posy = event.getY(); repaint(); } public void mouseDragged(MouseEvent event) { } }
75
已绘制直线的保存问题---向量或对象数组.
♣ 学生练习 编Applet实现拉橡皮筋方式绘制直线 。 鼠标点击,记住起点; 鼠标拖动绘制直线; 鼠标拖动到新的位置将替换原位置直线. 已绘制直线的保存问题---向量或对象数组.
76
键盘事件 包含 3个,分别对应 KeyEvent类的几个同名的静态整型常量KEY_PRESSED、 KEY_RELEASED、KEY_TYPED。 监听者接口是KeyListener public void keyPressed(KeyEvent e) 某个键按下时执行。 public void keyReleased(KeyEvent e) 某键被释放时执行。 public void keyTyped(KeyEvent e) 按键被敲击。 KeyTyped包含keyPressed和KeyRelased两个动作
77
如何获取击键值 getKeyChar()---获取输入字符(对字符键) getKeyCode()---获取键的编码(对控制键) 键编码常量
KeyEvent.VK_LEFT) ----按键为左箭头 KeyEvent.VK_RIGHT) ---右箭头 KeyEvent.VK_UP) 向上箭头 KeyEvent.VK_DOWN) ---向下箭头
78
♥ 上机实践 利用键盘事件将文本框1的内容同步拷贝到文本域中
79
小方框变色和移动 import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class KeyboardDemo extends Applet implements KeyListener{ static final int SQUARE_SIZE = 20; Color squareColor; int squareTop, squareLeft; public void init() { setBackground(Color.white); squareTop = getSize().height / 2 - SQUARE_SIZE / 2; squareLeft = getSize().width / 2 - SQUARE_SIZE / 2; squareColor = Color.red; addKeyListener(this); }
80
public void paint(Graphics g) { g. setColor(Color
public void paint(Graphics g) { g.setColor(Color.cyan); int width = getSize().width; int height = getSize().height; g.drawRect(0,0,width-1,height-1); g.drawRect(1,1,width-3,height-3); g.drawRect(2,2,width-5,height-5); g.setColor(squareColor); g.fillRect(squareLeft, squareTop, SQUARE_SIZE, SQUARE_SIZE); }
81
public void keyTyped(KeyEvent evt) { char ch = evt
public void keyTyped(KeyEvent evt) { char ch = evt.getKeyChar(); if (ch == 'B' || ch == 'b') { squareColor = Color.blue; repaint(); } else if (ch == 'G' || ch == 'g') { squareColor = Color.green; repaint(); } else if (ch == 'R' || ch == 'r') { squareColor = Color.red; repaint(); } else if (ch == 'K' || ch == 'k') { squareColor = Color.black; repaint(); } }
82
public void keyPressed(KeyEvent evt) { int key = evt.getKeyCode();
if (key == KeyEvent.VK_LEFT) { squareLeft -= 8; if (squareLeft < 3) squareLeft = 3; repaint(); } else if (key == KeyEvent.VK_RIGHT) { squareLeft += 8; if (squareLeft > getSize().width SQUARE_SIZE) squareLeft = getSize().width SQUARE_SIZE; repaint(); }
83
else if (key == KeyEvent
else if (key == KeyEvent.VK_UP) { squareTop -= 8; if (squareTop < 3) squareTop = 3; repaint(); } else if (key == KeyEvent.VK_DOWN) { squareTop += 8; if (squareTop > getSize().height SQUARE_SIZE) squareTop = getSize().height SQUARE_SIZE; repaint(); } } public void keyReleased(KeyEvent evt) { } }
84
课堂练习 编Applet程序在标签中显示输入按键的编码值。
85
1.菜单编程的基本步骤 ⑴ 创建菜单条(MenuBar)
例:MenuBar m_MenuBar = new MenuBar(); //创建一个空的菜单条MenuBar ⑵ 创建不同的菜单项(Menu)并加入到菜单条中 例: Menu menuEdit = new Menu("编辑"); m_MenuBar.add(menuEdit); ⑶ 创建菜单子项(MenuItem)加入菜单项 例:MenuItem mi_Edit_Copy = new MenuItem("复制"); menuEdit.add(mi_Edit-copy);
86
使用Menu的addSeparator()方法可以在各菜单项之间可以加入分隔线。
也可以给菜单子项定义快捷键 具体有两种方法: 方法一:创建MenuItem对象时设定。例如: MenuItem mi_File_Open = new MenuItem("打开", new MenuShortcut('o')); 方法二:通过MenuItem对象的setShortCut方法。 mi_File_Open.setShortcut(new MenuShortcut('o'));
87
⑷ 给窗体设定菜单条 执行窗体对象的setMenuBar方法可将菜单条绑定给窗体。 ⑸ 各菜单子项注册动作事件监听者 例如:mi_Edit_Copy.addActionListener(this); ⑹ 在监听者的actionPerformed(ActionEvent e)方法中实现处理代码 通过e.getSource()或e.getActionCommand()判断事件源,为每个菜单项编写对应的功能代码。
88
例7-18 一个简单的菜单
89
import java.applet.*; import java.awt.*; import java.awt.event.*; public class Menudemo extends Frame implements ActionListener{ TextArea ta; public Menudemo() { ta=new TextArea(30,60); add(ta); MenuBar menubar = new MenuBar(); setMenuBar(menubar); Menu file = new Menu("File"); menubar.add(file);
90
MenuItem open = new MenuItem("open", new MenuShortcut(KeyEvent.VK_O));
MenuItem quit = new MenuItem("Quit", new MenuShortcut(KeyEvent.VK_Q)); file.add(open); file.addSeparator(); file.add(quit); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { Frame frm=(Frame)(e.getSource()); frm.dispose(); } });
91
open.addActionListener(this);
quit.addActionListener(this); setSize(300, 300); setVisible(true); }
92
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand()=="Quit") { dispose(); } else { ta.setText("read a file content and write here"); } public static void main(String a[]) { new Menudemo();
93
1. 弹出式菜单的编程要点 (1)创建弹出菜单对象 例如:PopupMenu popup = new PopupMenu("Color"); (2)创建若干菜单项并通过执行弹出菜单的add方法将它们加入弹出菜单;给每个菜单项注册动作事件监听者,并编写相应的处理程序。 (3)通过执行部件的add方法将弹出式菜单附着在某个组件或容器上; (4)在该组件或容器注册鼠标事件监听者(MouseListener); (5)重载processMouseEvent(MouseEvent e)方法判断是否触发弹出菜单,如果是点击鼠标右键,则调用弹出式菜单的show(),把它自身显示在用户鼠标点击的位置。
94
例7-20 一个画图程序,可以通过弹出菜单选择画笔颜色,通过鼠标拖动画线
例7-20 一个画图程序,可以通过弹出菜单选择画笔颜色,通过鼠标拖动画线 import java.applet.*; import java.awt.*; import java.awt.event.*; public class MenuScribble extends Applet implements ActionListener { protected int lastx, lasty; protected Color color = Color.black; protected PopupMenu popup;
95
public void init() { popup = new PopupMenu("Color"); String labels[]={"Clear", "Red", "Green", "Blue", "Black"}; for(int i = 0; i < labels.length; i++) { MenuItem mi = new MenuItem(labels[i]); mi.addActionListener(this); popup.add(mi); } this.add(popup); this.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { lastx = e.getX(); lasty = e.getY(); } }); 创建弹出菜单
96
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) { Graphics g = getGraphics(); int x = e.getX(), y = e.getY(); g.setColor(color); g.drawLine(lastx, lasty, x, y); lastx = x; lasty = y; } });
97
public void processMouseEvent(MouseEvent e) {
if ((popup != null) && e.isPopupTrigger()) popup.show(this, e.getX(), e.getY()); else super.processMouseEvent(e); }
98
public void actionPerformed(ActionEvent e) {String name =((MenuItem)e
public void actionPerformed(ActionEvent e) {String name =((MenuItem)e.getSource()).getLabel(); if (name.equals("Clear")) { Graphics g = this.getGraphics(); g.setColor(this.getBackground()); g.fillRect(0, 0, this.getSize().width,this.getSize().height); } else if (name.equals("Red")) color = Color.red; else if (name.equals("Green")) color = Color.green; else if (name.equals("Blue")) color = Color.blue; else if (name.equals("Black")) color = color.black;
99
2. 深入理解事件处理模型
100
1、对话框的创建 对话框必须依托一个Frame。 常见的对话框包括:提示对话框、确认对话框、输入对话框等,对话框的构造方法有多种,典型的是:
Dialog(Frame parent,String title,boolean isModal) 其中,parent为对话框的依托窗体,title为对话框的标题,isModel用来指示对话框是否为“模式”对话框。
101
2、模式对话框与非模式对话框 模式对话框在显示时将阻塞该应用的其它操作,要求用户必须回答;而非模式对话框用户可以不理会,继续其它操作。
默认情况下为非模式对话框,已经创建的对话框也可以用以下方法检查和设置模式。 boolean isModal() setModal(boolean isModal)
102
例7-21 将例7-15的颜色面板放入一个对话框,给窗体设置背景颜色
例7-21 将例7-15的颜色面板放入一个对话框,给窗体设置背景颜色 import java.awt.*; import java.awt.event.*; public class TestDialog extends Frame { Button change=new Button("Change Color"); ColorPanel m; Button b = new Button("确定"); Dialog my;
103
例7-21 续 public TestDialog () { super("Parent");
例7-21 续 public TestDialog () { super("Parent"); setLayout(new FlowLayout()); m=new ColorPanel(); //创建颜色选择面板 add(change); change.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { my=new Dialog(TestDialog.this,"Select color",true);
104
例7-21 续 my.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { my.dispose(); } }); my.setLayout(new BorderLayout()); my.add("Center",m); my.add("South",b); my.setSize(300,200); my.setVisible(true); } });
105
例7-21 续 setSize(300,300); setVisible(true);
例7-21 续 setSize(300,300); setVisible(true); b.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { my.dispose(); setBackground(m.mycanvas.getBackground()); } });
106
public static void main(String a[]) {
new TestDialog(); }
107
FileDialog 是Dialog的子类。该类的构造方法有3个: FileDialog(Frame parent)
FileDialog(Frame parent, String title) FileDialog(Frame parent, String title, int mode) :创建一个对话框,mode取值为FileDialog.LOAD或FileDialog.SAVE,决定对话框是打开还是保存文件。 常用的FileDialog方法如下: String getDirectory() : 返回对话框选择的目录 String getFile(): 返回对话框选择的文件名,当对话框未选文件时返回null。
108
作业 1)创建带有标签和文本域的窗体。当用户在文本域中输入其姓名后,应该显示欢迎用户使用 java 编程的消息。例如用户输入姓名 flyhorse ,则显示消息“你好, flyhorse, 欢迎你使用 java 编程!”,并能正常关闭窗口。 2)设有一批英文单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签显示单词,另有“上一个”、“下一个”两个按钮实现单词的前后翻动。 3)编写一个鼠标位置跟踪程序,在鼠标所在位置为中心绘制一个红色十字架。
109
上机 统计第1框中数字字符个数,显示在第2框中 统计按钮的点击次数
设有一批英文单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签显示单词,另有“上一个”、“下一个”两个按钮实现单词的前后翻动。
Similar presentations