第 2 章 java 的图形界面

40
第 2 第 Java 第第第第第 第第

Upload: thane

Post on 05-Jan-2016

64 views

Category:

Documents


4 download

DESCRIPTION

第 2 章 Java 的图形界面. 孙焘. 1. 2. 3. 4. 包含 构件的 构件. 消息与事件. 外观的管理与控制. 使用 AWT 构件. 重点:. getFont, handleEvent,keyUp keyDown,mouseUp, mouseDown, mouseMove, mouseEnter, mouseExit, mouseDrag, repaint setFont,resize. action, disable,enable, getBackground, getForeground,hide, - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 2 章  Java 的图形界面

第 2 章 Java 的图形界面

孙焘

Page 2: 第 2 章  Java 的图形界面

重点:

使用 AWT 构件1

包含构件的构件2

消息与事件3

外观的管理与控制4

Page 3: 第 2 章  Java 的图形界面

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 的图形界面

列表 按钮 菜单

container

另一个窗口

窗口,对话框

2.2 包含构件的构件 ----构件容器 (container)

container

Page 5: 第 2 章  Java 的图形界面

例:创建一个简单窗口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 的图形界面

AWT使用 Container类来定义最基本的构件容器 ,

它有两个子类 :Window类和 Panel类 .

在Window 类还有两个子类 1. 定义对话框 ,用 Dialog子类 ;

Java 还提了一个 Dialog 的子类 ---FileDialog, 用它生成文件对话框

2. 定义一般意义的窗口 ,用 Frame类 .

2.2 包含构件的构件 ----构件容器 (container)

Page 7: 第 2 章  Java 的图形界面

Panel干什么用的 ?

使你更方便的组织你的构件 ,得到赏心悦目的布局 Applet是 Panel 的子类 , 因此在小应用程序里可以直

接加入构件 , 而一般的应用程序必须先定义构件容器 .

小应用程序在浏览器中所显示的区域就是 Panel, 所占的尺寸就是缺省得 Panel 尺寸 .

2.2 包含构件的构件 ----构件容器 (container)

Page 8: 第 2 章  Java 的图形界面

8

Container

Window

Panel

Component

Frame

Dialog

FileDialog

Applet

Button

Menu

Checkbox

Textfield

2.2 包含构件的构件 ----构件容器 (container)

Page 9: 第 2 章  Java 的图形界面

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 的图形界面

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 的图形界面

2.3 消息与事件

Event

HandleEvent()

MouseUp()

MouseDown()MouseDrag()

MouseMove()MouseEnter()MouseExit()

keyDown()

KeyUp()

action()

如果你不覆盖你要处理的方法,则缺省的方法返回一个假值,通知系统没有处理事件

如果你不覆盖你要处理的方法,则缺省的方法返回一个假值,通知系统没有处理事件

Page 12: 第 2 章  Java 的图形界面

2.3 消息与事件 2.3.2 鼠标的事件 鼠标事件的三个参数 : 1. 事件的类型 ( 是移动 ? 托拽 ) 2. 是按下还是放开 ? 3. 鼠标的位置 (x,y) 方法的重写 : public boolean mouseDown(Event evt,int x,int

y) {….}

Page 13: 第 2 章  Java 的图形界面

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 的图形界面

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 的图形界面

2.3 消息与事件 凡是由构件产生的事件叫动作事件 ACTION_EVENT,

处理这类事件的方法是 : action().

取消

确定music

sports

art

Page 16: 第 2 章  Java 的图形界面

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 的图形界面

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 的图形界面

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 的图形界面

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 的图形界面

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 的图形界面

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 的图形界面

2.3 消息与事件

当动作发生在按钮上时 , 首先看按钮这个类有没有 action 方法 , 如果没有则看包含按钮的容器类 (即 panel) 有没有action 方法 , 如果没有事件就传递窗口 , 如果没有就传递给 component 的通用处理方法 ,如果程序中没有定义任何action 方法 , 实际上事件最终不被处理

窗口

按钮

panel

Page 23: 第 2 章  Java 的图形界面

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 的图形界面

2.3 消息与事件

事件由包含层次由内向外传递 . 每个处理事件的方法要有一个返回值 , 通知是否继续

向上传递 boolean action(Event evt, Object arg) { ……; return true; }

Page 25: 第 2 章  Java 的图形界面

2.3 消息与事件

窗口

button

panel

按钮的监听器

窗口获面板的监听器

Page 26: 第 2 章  Java 的图形界面

确定 取消

2.4 构件的应用实例 --按钮 Button 类 功能 : 创建按钮事件 创建一个 Button Button myButton = new Button(str); 将 button 放到窗口系统中 : add(new Button(“ 确定” ); add(new Button(“ 取消” ); Button 类的常用方法 getLabel setLabel

Page 27: 第 2 章  Java 的图形界面

action--- 接受动作事件 , 调用 repaint

init--- 建立 button

paint--- 显示文字

2.4 构件的应用实例 --按钮 处理 button 产生的事件 例 : 创建一个按钮 , 每当按下它时 , 在屏幕显示文字 (singlebutton.html)

想一想 : 应该有哪些类 ? Button ,Font; 应有哪些方法 ?

Page 28: 第 2 章  Java 的图形界面

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 的图形界面

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 的图形界面

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 的图形界面

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 的图形界面

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 的图形界面

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 的图形界面

2.4 构件的应用实例 --menu 在处理菜单事件 时应该

注意的事情是 : 判断层次

MenuContainer uplevel;( 定义一个菜单容器 )

MenuItem target=(MenuItem)evt.target;( 当前被选中的对象 )

uplevel=target.getParent(); strMessage=uplevel.getLabel()( 得到上一级容器的标签 )

A

A

Page 35: 第 2 章  Java 的图形界面

button1 button2

button4button3

Panel类 ( 面板 ) 功能 : 容纳其他对象 ,安排合理布局 创建面板 : Panel myPanel=new Panel(); add(myPanel); 将面板作为容器 : mypanel.add(button)

2.5 外观的管理与控制

Page 36: 第 2 章  Java 的图形界面

西 东

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 的图形界面

FlowLayout 类 缺省的输出管理器

GridLayout 类 GridLayout mylayout = new GridLayout(3,3,0,0)

setLayout();rows cols

hspace vspace

2.5 外观的管理与控制

Page 38: 第 2 章  Java 的图形界面

GridBagLayout 类和 GridBagConstraints 类 功能 :借助于 GridBagConstraints类 , 实现更灵活

的外观管理 每个构件后都跟随一个 GridBagLayout 对象实体 ,

来决定构件的外观 . 创建 GridBagLayout myLayout=new GridBagLayout();

2.5 外观的管理与控制

Page 39: 第 2 章  Java 的图形界面

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 的图形界面