第 2 章 Java 的图形界面
description
Transcript of 第 2 章 Java 的图形界面
![Page 1: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/1.jpg)
第 2 章 Java 的图形界面
孙焘
![Page 2: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/2.jpg)
重点:
使用 AWT 构件1
包含构件的构件2
消息与事件3
外观的管理与控制4
![Page 3: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/3.jpg)
2.1 使用 AWT 构件 getFont, handleEvent,keyUp keyDown,mouseUp, mouseDown, mouseMove, mouseEnter, mouseExit, mouseDrag, repaint setFont, resize
action, disable, enable,
getBackground, getForeground, hide, inside, isEnable, isShowing, isVisible, locate, location, move, setBackground, setForeground, show, size
![Page 4: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/4.jpg)
列表 按钮 菜单
container
另一个窗口
窗口,对话框
2.2 包含构件的构件 ----构件容器 (container)
container
![Page 5: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/5.jpg)
例:创建一个简单窗口import java.awt.*;import java.applet.Applet;public class CountClick extends Applet{ int CurrentMarks=0; public init() { Button b1=new Button(“ 按钮” ); add.b1; }}
按钮
2.2 包含构件的构件 ----构件容器 (container)
![Page 6: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/6.jpg)
AWT使用 Container类来定义最基本的构件容器 ,
它有两个子类 :Window类和 Panel类 .
在Window 类还有两个子类 1. 定义对话框 ,用 Dialog子类 ;
Java 还提了一个 Dialog 的子类 ---FileDialog, 用它生成文件对话框
2. 定义一般意义的窗口 ,用 Frame类 .
2.2 包含构件的构件 ----构件容器 (container)
![Page 7: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/7.jpg)
Panel干什么用的 ?
使你更方便的组织你的构件 ,得到赏心悦目的布局 Applet是 Panel 的子类 , 因此在小应用程序里可以直
接加入构件 , 而一般的应用程序必须先定义构件容器 .
小应用程序在浏览器中所显示的区域就是 Panel, 所占的尺寸就是缺省得 Panel 尺寸 .
2.2 包含构件的构件 ----构件容器 (container)
![Page 8: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/8.jpg)
8
Container
Window
Panel
Component
Frame
Dialog
FileDialog
Applet
Button
Menu
Checkbox
Textfield
2.2 包含构件的构件 ----构件容器 (container)
![Page 9: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/9.jpg)
2.3 消息与事件 2.3.1 什么是事件• 用户用于交互而产生的键盘或鼠标动作 .• 响应用户的动作称为处理事件 .• 在类 Event中 , 定义了所有的事件处理方法 , 小应用已经
继承了这些方法 . import java.awt.Event; Event在 java.awt 包中 , 无论哪个键按下或者释放 , 还是
鼠标移动 , 按下鼠标或释放鼠标 ,AWT 都会捕获 , 并产生一个事件 .
处理事件的核心是重写处理事件的方法 通用方法 : handEvent(Event evt, Object arg) 专用方法 : MouseDown(Event evt, Object arg)
![Page 10: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/10.jpg)
Event 类的数据域
2.3 消息与事件
Event
Object arg
int clickCountint id
int key
int modifiers Object target
int x int y long when
![Page 11: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/11.jpg)
2.3 消息与事件
Event
HandleEvent()
MouseUp()
MouseDown()MouseDrag()
MouseMove()MouseEnter()MouseExit()
keyDown()
KeyUp()
action()
如果你不覆盖你要处理的方法,则缺省的方法返回一个假值,通知系统没有处理事件
如果你不覆盖你要处理的方法,则缺省的方法返回一个假值,通知系统没有处理事件
。
![Page 12: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/12.jpg)
2.3 消息与事件 2.3.2 鼠标的事件 鼠标事件的三个参数 : 1. 事件的类型 ( 是移动 ? 托拽 ) 2. 是按下还是放开 ? 3. 鼠标的位置 (x,y) 方法的重写 : public boolean mouseDown(Event evt,int x,int
y) {….}
![Page 13: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/13.jpg)
2.3.3 键盘事件捕获的方法 keyDown(Event evt, int key)Event 类的键常量例 : 显示用户按下的字母键内容 import java.applet.Applet;import java.awt.*; { char Presskey; public boolean keyDown(Event evt, int key) { Presskey=(char)key;
repaint(); return true;}
public void paint(Graphics g) { g.drawString(Presskey,10,10); } }
2.3 消息与事件
![Page 14: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/14.jpg)
2.3 消息与事件 键盘事件处理通常包括 : 显示字符 , 光标移动 特殊键 public boolean keyDown(Event evt, int key) { switch(key) { case Event.F1: {….}; case Event.PGUP: {…} } } 修正键 if(evt.shiftDown()) if(evt.controlDown());
![Page 15: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/15.jpg)
2.3 消息与事件 凡是由构件产生的事件叫动作事件 ACTION_EVENT,
处理这类事件的方法是 : action().
取消
确定music
sports
art
![Page 16: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/16.jpg)
2.3 消息与事件 action(Event evt, Object arg) evt.target: 指明事件类型 (button,checkbox,list,...)
Event
Object arg
int clickCountint id
int key
int modifiers Object target
int x int y long when
![Page 17: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/17.jpg)
2.3 消息与事件 判断组件类型 ( 如是 button或 checkbox) if(evt.target instanceof Button) if(evt.target instanceof Checkbox) 判断是哪多个同类组件中的哪一个 if(evt.target==button1) if(evt.target=button2) 或者通过判断标签内容 if(arg==“ 确定” ) if(arg==“ 取消” )
![Page 18: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/18.jpg)
2.3 消息与事件例 : 记录按下按钮的次数 , 并显示出来 .
import java.awt.*;import java.applet.Applet;public class CountClick extends Applet{ int CurrentMarks=0; public init() { Button b1=new Button(“ 按钮” ); add.b1; } public boolean action(Event evt,Object arg) { CurrentMarks++; repaint(); return true; } public void paint(Graphics g) { g.drawString(" "+CurrentMarks,10,10);}}
10
按钮
![Page 19: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/19.jpg)
2.3 消息与事件 2.3.4 Java 响应鼠标事件画图 例 : 根据用户选择画图形
import java.awt.*;import java.applet.Applet;public class drawing extends Applet{ boolean circlemark=true; public init() { Button b1=new Button(“ 园” ); Button b2=new Button(“ 方” ); add.b1; add.b2; }
园 方
![Page 20: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/20.jpg)
2.3 消息与事件 public void paint(Graphics g) { if (circlemark) g.filloval(10,10,30,30); else g.fillRect(20,20,40,40}; } public boolean action(Event evt,Object arg) { if (evt.target==b1) circlrmark=true; else circlrmark=false; repaint(); return true; }
![Page 21: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/21.jpg)
2.3.4 通用的事件处理程序 handleEvent 处理所有的小应用程序所接受的事件 , 由它将事件送
给相对应的方法 . 让我们看一下 handleEvent 的缺省实现 public boolean handleEvent(Event evt) { switch(evt) { case Event.MOUSE_ENTER: return mouseEnter(evt,evt.x,evt.y); case Event.MOUSE_EXIT: return mouseExit(evt,evt.x,evt.y); case Event.MOUSE_MOVE: return mouseMove(evt,evt.x,evt.y); case Event.KEY_ACTION_RELEASE: return keyUp(evt,evt.key); case Event.ACTION_EVENT: return action(evt,evt.arg); case Event.GOT_FOCUS: return gotFocus(evt,evt.arg); case Event.LOST_FOCUS: return lostFocus(evt,evt.arg); } return false; }
2.3 消息与事件
![Page 22: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/22.jpg)
2.3 消息与事件
当动作发生在按钮上时 , 首先看按钮这个类有没有 action 方法 , 如果没有则看包含按钮的容器类 (即 panel) 有没有action 方法 , 如果没有事件就传递窗口 , 如果没有就传递给 component 的通用处理方法 ,如果程序中没有定义任何action 方法 , 实际上事件最终不被处理
窗口
按钮
panel
![Page 23: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/23.jpg)
class MyPanel extends Panel{ MyBtn b=new MyBtn(“ok”); add(b); boolean action() {…….;}}
class MyClass extends Frame{ MyPanel p=new Mypanel(); add(p); Button b=new Button(exit); add(b); boolean action() {…….;}}
窗口
exit
class MyBtn extends Button{ boolean action() { …….; return true;}}
ok
Panel
2.3 消息与事件
![Page 24: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/24.jpg)
2.3 消息与事件
事件由包含层次由内向外传递 . 每个处理事件的方法要有一个返回值 , 通知是否继续
向上传递 boolean action(Event evt, Object arg) { ……; return true; }
![Page 25: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/25.jpg)
2.3 消息与事件
窗口
button
panel
按钮的监听器
窗口获面板的监听器
![Page 26: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/26.jpg)
确定 取消
2.4 构件的应用实例 --按钮 Button 类 功能 : 创建按钮事件 创建一个 Button Button myButton = new Button(str); 将 button 放到窗口系统中 : add(new Button(“ 确定” ); add(new Button(“ 取消” ); Button 类的常用方法 getLabel setLabel
![Page 27: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/27.jpg)
action--- 接受动作事件 , 调用 repaint
init--- 建立 button
paint--- 显示文字
2.4 构件的应用实例 --按钮 处理 button 产生的事件 例 : 创建一个按钮 , 每当按下它时 , 在屏幕显示文字 (singlebutton.html)
想一想 : 应该有哪些类 ? Button ,Font; 应有哪些方法 ?
![Page 28: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/28.jpg)
import java.awt.*;import java.applet.Applet;public class button extends Applet{ Font font; Button b1; public void init() { font= newFont("TimesRoman",Font.BOLD,20); b1=new Button("push"); add(b1); setFont(font); }
2.4 构件的应用实例 --按钮
![Page 29: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/29.jpg)
2.4 构件的应用实例 --按钮 boolean action(Event evt,Object arg) { y+=5; repaint(); return true; } paint(Graphics g) {
g.drawString("Button”, 10,y);}
![Page 30: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/30.jpg)
2.4 构件的应用实例 --按钮import java.awt.*;\\例 : 不在 applet 中的按钮class ButtoninFrame { public static void
main(String args[]) { Frame myframe=new Frame(); myframe.setTitle("Button in Frame");
myframe.resize(200,200); myframe.show(); Button b1=new Button("Button1");
Button b2=new Button("Button2"); myframe.add(b1);myframe.add(b2); } }一般步骤:
.创 建 new
加 入add
响应 action 处理
![Page 31: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/31.jpg)
2.4 构件的应用实例 --menu 创建菜单条 mb=new MenuBar(); setMenuBar(mb);(类 Frame 中的方法 )
创建菜单 menu1=new Menu(“file”); menu2=new Menu(“edit) mb.add(menu1);mb.add(menu2);
editfile
![Page 32: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/32.jpg)
2.4 构件的应用实例 --menu 创建菜单项 mi1=new MenuItem(“new”); mi2=new MenuItem(“open”); mi3=new MenuItem(“save”); mi4=new MenuItem(“close”); menu1.add(mi1); menu1.add(mi2);
editFile
New
open
Save
Close
![Page 33: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/33.jpg)
2.4 构件的应用实例 --menu如何处理事件public boolean action(Event e, Object arg){ if (e.target instanceof MenuItem) { MenuItem selected=(MenuItem)e.trget; tring s=selected.getLabel(); switch(s) { case “new”: ….; case “open”: ….; case “save”: ….; case “close”: ….; } }}
![Page 34: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/34.jpg)
2.4 构件的应用实例 --menu 在处理菜单事件 时应该
注意的事情是 : 判断层次
MenuContainer uplevel;( 定义一个菜单容器 )
MenuItem target=(MenuItem)evt.target;( 当前被选中的对象 )
uplevel=target.getParent(); strMessage=uplevel.getLabel()( 得到上一级容器的标签 )
A
A
![Page 35: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/35.jpg)
button1 button2
button4button3
Panel类 ( 面板 ) 功能 : 容纳其他对象 ,安排合理布局 创建面板 : Panel myPanel=new Panel(); add(myPanel); 将面板作为容器 : mypanel.add(button)
2.5 外观的管理与控制
![Page 36: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/36.jpg)
南
中
北
西 东
BorderLayout 类 功能 :Applet分成五个区 创建 setLayout(new BorderLayout()); 将其他构件加入 add(“East”, new Button(“东” ); add(“South”, new Button(“南” ); add(“West”, new Button(“西” ); add(“North”, new Button(“北” ); add(“Center”, new Button(“ 中” );
2.5 外观的管理与控制
![Page 37: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/37.jpg)
FlowLayout 类 缺省的输出管理器
GridLayout 类 GridLayout mylayout = new GridLayout(3,3,0,0)
setLayout();rows cols
hspace vspace
2.5 外观的管理与控制
![Page 38: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/38.jpg)
GridBagLayout 类和 GridBagConstraints 类 功能 :借助于 GridBagConstraints类 , 实现更灵活
的外观管理 每个构件后都跟随一个 GridBagLayout 对象实体 ,
来决定构件的外观 . 创建 GridBagLayout myLayout=new GridBagLayout();
2.5 外观的管理与控制
![Page 39: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/39.jpg)
2.5 外观的管理与控制 GridBagConstraints 类的约束条件 gridwidth,
gridheight, gridx, gridy, weightx, weighty, ipadx, ipady, insets fill及其设置 GridBagConstraints.NONE GridBagConstraints.HORIZONTAL GridBagConstraints.VERTICAL GridBagConstraints.BOTH GridBagConstraints.RELATIVE
![Page 40: 第 2 章 Java 的图形界面](https://reader033.fdocuments.net/reader033/viewer/2022061616/56813a0f550346895da1e652/html5/thumbnails/40.jpg)