第5章 构成用户界面的窗口环境 北京大学计算机系 代亚非.

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

Java 程序分类 Java Application :是完整程序,需要独立的解 释器解释运行;以 “.java” 为后缀的文件,以 main() 方法作为程序入口,由 java 编译器编译生 成字节码,由 Java 解释器加载执行字节码。 Java Applet 没有 main() 方法作为程序入口,是嵌在.
Java 程序设计 案例教程 北京大学出版社 第 01 章. Java 程序设计案例教程 第 01 章 Java 语言与面向对象程序设计 Java 语言的历史 Java 语言的特点 Java 程序的分类 Java 环境配置 Eclipse 的安装 Java 程序的调试 教学目标.
第四章 类、对象和接口.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
项目6 通用堆栈.
《 Java开发环境配置》 主讲人:耿力.
Java 2实用教程(第3版)教学课件 主讲教师:张国平
JAVA程序设计 天津工程职业技术学院计算机工程系软件技术教研室.
Java程序设计教程 第一讲 Java概述.
Java程序设计 常州信息职业技术学院(CCIT) 软件学院
四資二甲 第三週作業 物件導向程式設計.
Java System Concepts and Animation Programming
Hello小程序的运行和编译 Java AppletJava小程序的构成 1、关键字
算法设计与分析 Algorithm Design and Analysis
南京理工大学 第2章 Java基本语法 本章我们将学习Java编程语言的基本语法,包括变量、操作符、表达式、语句、字符串、数组、控制流以及如何使用帮助文档。 使用下面的编程框架: public class Test{ public static void main(String []args){ //以下添加测试代码.
第二十章 圖型介面與網路對播 (GUI and Intercross Transition) 20-1 簡介 20-2 ActionListener Interface 20-3 ActionEvent Class 20-4 Vector Class 20-5 圖型介面與視窗關閉 20-6 圖型介面與資料顯示.
視窗程式設計 2. 視窗版面配置 Chih Hung Wang Reference:
6.5 图形界面的布局设计 每一个容器组件都有一个默认的布局管理方式,也可以用setLayout方法来设置其他布局管理器。一旦确定了布局管理方式,容器组件就可以用add方法加入组件。 布局管理器用来确定组件在容器中的位置和大小,AWT中定义了布局管理器接口LayoutManager的实现类来实现此功能。
Java Applet的运行原理 在网页向Java Applet传值 在Java Applet中播放声音 在Java Applet中使用组件
第11章 Java多媒体技术.
第6章 图形用户界面设计 6.1 图形用户界面概述 6.2 GUI标准组件的使用 6.3 Java的事件处理 6.4 窗口及菜单设计
第 18 章 圖形使用者介面.
第三部分 Java语言编程应用篇 第6章 Java语言的 图形用户界面开发技术 (之二).
第二章 JAVA语言基础.
第二部分 Java语言基础篇 第4章 Java语言与面向对象 (之一).
第三章 控制结构.
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
Ch02 視窗Swing套件 物件導向系統實務.
Java语言程序设计-图形用户界面设计(2)
程式設計實作.
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
2018/11/15 面向对象与多线程综合实验-GUI设计 教师:段鹏飞.
Ch07 Java Applets 物件導向系統實務.
Java程序设计 JAVA 授课教师:赵小敏 浙江工业大学 软件学院
2018/11/20 第一章 Java概述 武汉大学计算机学院计算机应用系 2018/11/20 14:33.
Chapter 9 設計的精細製作: 行動計算 Software Engineering – An Engineering Approach, James F. Peters & Witold Pedrycz.
本單元介紹何謂變數,及說明變數的宣告方式。
程式設計實作.
記事本 物件導向系統實務.
記事本 物件導向系統實務.
Java程序设计 第9章 继承和多态.
JAVA 2 新觀念教本 ---邁向SCJP專業認證--- 易瓏資訊 林新德 著.
Java语言程序设计 第八部分 Applet小程序.
實作輔導 3 日期: 4/14(星期六) 09:10~12:00、13:10~16:00
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
Ch04 事件處理 物件導向系統實務.
2019/1/16 Java语言程序设计-类与对象 教师:段鹏飞.
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
Java程序设计 第2章 基本数据类型及操作.
CH04 視窗中元件排排坐 物件導向系統實務.
C/C++/Java 哪些值不是头等程序对象
事件處理.
Multithread 多執行緒 以GUI為例了解物件以及Event
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
第二章Java基本程序设计.
第二章 Java基本语法 讲师:复凡.
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
第6章 面向对象的高级特征 学习目标 本章要点 上机练习 习 题.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
第2章 Java语言基础.
Applet.
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
Summary
变量定位图形 Java中数据的类型分为四种:基本数据类型、数组类型、类类型以及接口类型。任何常量和变量都一定是上述四种数据类型中的一种。简单数据类型的实例化有两种:变量和常量。 变量名和常量名必须是Java语言中合法的标识符。 常量是在程序运行期间值不改变的量。 变量是在程序运行期间值可通过赋值改变的量,
Presentation transcript:

第5章 构成用户界面的窗口环境 北京大学计算机系 代亚非

构成用户界面的窗口环境 5.1 使用AWT(Abstract Window Toolkit)构件 5.2 包含构件的构件----构件容器(container) 5.3 事件的传递 5.4 各种构件的应用实例(一) 5.5 外观的管理与控制 5.6 各种构件的应用实例(二) 5.7 总结

5.1 使用AWT构件 在AWT的概念中,窗口系统所显示的各种对象统称为构件:Button,Menu,List等等都是构件。 Component是代表构件最基本的类。 Component类中定义了各种窗口对象中最基本、最重要的方法和性质。随时随处都有可能利用Component定义的方法。

5.1 使用AWT构件 已经学过的: 没有学过的: getFont, action, disable,enable, 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

5.2 包含构件的构件----构件容器(container) 列表 按钮 菜单 窗口,对话框 container 另一个窗口 container

5.2 包含构件的构件----构件容器(container) import java.awt.*; import java.applet.Applet; public class CountClick extends Applet { int CurrentMarks=0; public init() { Button b1=new Button(“按钮”); add.b1; } 按钮

5.2 包含构件的构件----构件容器(container) AWT使用Container类来定义最基本的构件容器,它有两个子类:Window类和Panel类. 在Window类还有两个子类 1. 定义对话框,用Dialog子类; Java还提了一个Dialog的子类---FileDialog, 用它生成文件对话框 2. 定义一般意义的窗口,用Frame类.

5.2 包含构件的构件----构件容器(container) Panel干什么用的呢? 使你更方便的组织你的构件,得到赏心悦目的布局 Applet是Panel的子类,因此在小应用程序里可以直接加入构件,而一般的应用程序必须先定义构件容器. 小应用程序在浏览器中所显示的区域就是Panel,所占的尺寸就是缺省得Panel尺寸.

5.2 包含构件的构件----构件容器(container) Component Container Button Panel Applet Menu Window Textfield Frame Dialog Checkbox FileDialog

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

class MyClass extends Frame { MyPanel p=new Mypanel(); add(p); Button b=new Button(exit); add(b); boolean action() {…….;} } 窗口 ok Panel exit class MyPanel extends Panel { MyBtn b=new MyBtn(“ok”); add(b); boolean action() {…….;} } class MyBtn extends Button { boolean action() { …….; return true;} }

5.3事件的传递(1.02) 事件由包含层次由内向外传递. 每个处理事件的方法要有一个返回值,通知是否继续向上传递 boolean action(Event evt, Object arg) { ……; return true; }

5.3 事件的传递(1.1) 窗口 button panel 按钮的监听器 窗口获面板的监听器

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

5.4 各种构件的应用实例--按钮 处理button产生的事件 例:创建一个按钮,每当按下它时,在屏幕显示文字(singlebutton.html) 想一想: 应该有哪些类? Button ,Font; 应有哪些方法? init---建立button action---接受动作事件,调用repaint paint---显示文字

5.4 各种构件的应用实例--按钮 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); }

5.4 各种构件的应用实例--按钮 boolean action(Event evt,Object arg) { y+=5; repaint(); return true; } paint(Graphics g) { g.drawString("Button”, 10,y);}

5.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); } .

5.4 各种构件的应用实例 一般步骤: 创建 new 加入 add 响应 action 处理

Scrollbar(VERTICAL,50,0,1,100); Sports Computer Music Art 5.4 各种构件的应用实例 Sports Computer Music Art New TextField(20); 常用的方法 getText();setText(); setEchoCharacter(char c) new TextArea( “this is a test”,20,40); Scrollbar(VERTICAL,50,0,1,100); 1 CheckboxGroup gr=new CheckboxGroup(); New Checkbox(label, gr, false); New Checkbox(label,gr,true); New Checkbox(label, null, false); min max start

5.4 各种构件的应用实例--CheckBox 应用举例 建立三个复选框,被选中者的标签内容变成“changes” 应有的方法: init:建立复选框 action:接受动作事件 setLabel(“*****”);

5.4 各种构件的应用实例--CheckBox import java.awt.*; public class checkbox extends java.applet.Applet { Checkbox b1,b2,b3; public void init() { b1=new Checkbox("Label1",null,false); b2=new Checkbox("Label2",null,false); b3=new Checkbox("Label3",null,false); add(b1); add(b2); add(b3); }

5.4 各种构件的应用实例--- CheckBox public boolean action(Event evt, Object arg) { if (evt.target instanceof Checkbox){ Checkbox selectedbox=(Checkbox)evt.target; String str=selectedbox.getLabel(); if (str=="Label1") selectedbox.setLabel("Chnage1"); else if (str=="Label2") selectedbox.setLabel("Chnage2"); else if (str=="Label3") selctedbox.setLabel("Change3"); } repaint();return true;

5.4 各种构件的应用实例--- TextField 例:在文本行中输入,并用字符串接受,显示出来 类的数据构成:Textfield,Button, String 类的方法构成: init(), action():接受按钮事件,调用paint() paint():用getText()方法得到输入内容,并显示.

5.4 各种构件的应用实例--- TextField import java.awt.*; public class textfieldkey extends java.applet.Applet { TextField t;String s;Button button; public void init() { t=new TextField("",25); add(t); button=new Button("getText"); add(button); }

5.4 各种构件的应用实例--- TextField public boolean action(Event evt, Object arg) { if(evt.target instanceof Button) { repaint();} return true; } public void paint(Graphics g) { s=t.getText(); g.drawString(s,40,80); }

5.5 外观的管理与制 1 3 1 2 3 4 4 4 5 5

5.5 外观的管理与制 Panel类(面板) 功能:容纳其他对象,安排合理布局 创建面板: Panel myPanel=new Panel(); add(myPanel); 将面板作为容器: mypanel.add(button) button1 button2 button4 button3

5.5 外观的管理与制 import java.awt.*; public class Panel extends java.applet.Applet { Panel panel1,panel2; Button button1,button2,button3,button4; public void init() { panel1=new Panel(); panel2=new Panel(); add(panel1); add(panel2); button1=new Button("Button1"); button2=new Button("Button2"); button3=new Button("Button3"); button4=new Button("Button4"); panel1.add(button1); panel1.add(button2); panel2.add(button3); panel2.add(button4); }} 5.5 外观的管理与制 例:(panel.htm)

5.5 外观的管理与制 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(“中”); 南 中 北 西 东

5.5 外观的管理与制 FlowLayout类 缺省的输出管理器 GridLayout类 GridLayout mylayout = new setLayout(); rows cols hspace vspace

5.5 外观的管理与制 GridBagLayout类和 GridBagConstraints类 创建 GridBagLayout myLayout=new GridBagLayout();

5.5 外观的管理与制 GridBagConstraints类的约束条件gridwidth, gridheight, gridx, gridy, weightx, weighty, ipadx, ipady, insets fill及其设置 GridBagConstraints.NONE GridBagConstraints.HORIZONTAL GridBagConstraints.VERTICAL GridBagConstraints.BOTH GridBagConstraints.RELATIVE

5.5 外观的管理与制 例:(GridBagApplet.html) button1 button2 button3 button8

5.5 外观的管理与制 public void init() { GridBagLayout layout=new GridBagLayout(); setLayout(layout); GridBagConstraints GBC = new GridBagConstraints(); Button button1=new Button("button1"); Button button2=new Button("button2"); Button button3=new Button("button3"); Button button4=new Button("button4"); Button button5=new Button("button5"); Button button6=new Button("button6"); Button button7=new Button("button7"); Button button8=new Button("button8"); Button button9=new Button("button9"); 5.5 外观的管理与制

5.5 外观的管理与制 GBC.fill=GridBagConstraints.BOTH; (按钮可以在水平和垂直两个方向扩展) layout.setConstraints(button1,GBC); add(button1); GBC.gridwidth=GridBagConstraints.RELATIVE; (BOTH依然起作用, 紧挨着最后一个按钮,) layout.setConstraints(button2,GBC); add(button2); GBC.gridwidth=GridBagConstraints.REMAINDER; (填充剩余部分) layout.setConstraints(button3,GBC); add(button3); 5.5 外观的管理与制 But1 But2 But3

5.5 外观的管理与制 GBC.gridwidth= GridBagConstraints.REMAINDER; (表示该按钮独占一行) layout.setConstraints(button4,GBC); add(button4); But1 But2 But3 But4

5.5 外观的管理与制 GBC.gridwidth=2; (表示该按钮占两个单元) layout.setConstraints(button5,GBC); add(button5); GBC.gridwidth= GridBagConstraints.REMAINDER; layout.setConstraints(button6,GBC); add(button6); But1 But2 But3 But4 But6 But5

5.5 外观的管理与制 GBC.gridwidth=1; GBC.gridheight=2; (高度为两个单元) layout.setConstraints(button7,GBC); add(button7); But1 But2 But3 But4 But6 But5 But7

5.5 外观的管理与制 GBC.gridwidth= GridBagConstraints.REMAINDER; GBC.gridheight=1; layout.setConstraints(button8,GBC); add(button8); layout.setConstraints (button9,GBC); add(button9); But1 But2 But3 But4 But6 But5 But7 But8 But9

5.6 各种构件的应用实例---Canvas 5.6.2 Canvas类(画布) 功能: 制作其他构件,通常用来放置图形图像,或绘图. 画图可以直接在applet区域上进行,定义了 Canvas对象后将paint()语句作为该对象的方法,这些动作就自动发生在画布区. 通常不需要处理画布上发生的事件 创建 Canvas canvas=new Canvas(); add(canvas);

5.6 各种构件的应用实例---Canvas 例:根据程序说出运行结果 注意一个程序中生成一个canvas类的实例,另一个程序没有

5.6 各种构件的应用实例---Canvas import java.awt.*; import java.applet.*; public class canvas_test_2 extends Applet { public void init() { setLayout(new BorderLayout()); add("North", new Button("button1")); add("South", new Button("button2")); add("West", new Button("button3")); add("East", new Button("button4")); } public void paint(Graphics g) { g.setColor(Color.red); g.fillRect(0,0,50,100); g.setColor(Color.blue); g.fillRect(30,0,100,40);} } 5.6 各种构件的应用实例---Canvas

5.6 各种构件的应用实例---Canvas import java.awt.*; import java.applet.*; public class canvas_test extends Applet { MyCanvas mycanvas=new MyCanvas(); public void init() { setLayout(new BorderLayout()); add("Center",mycanvas); add("North",new Button("button1")); ….; add("East",new Button("button4")); } }

5.6 各种构件的应用实例---Canvas class MyCanvas extends Canvas { public void paint(Graphics g) { g.setColor(Color.red); g.fillRect(0,0,50,100); g.setColor(Color.blue); g.fillRect(30,0,100,40); }

5.6 各种构件的应用实例---Canvas

5.6 各种构件的应用实例---Canvas 例:按动鼠标改变画布的颜色(CanvasApplet) 有哪些类? Canvas, Button, Color; 哪些方法? init(), action(),swapColor(),paint() color color color 利用输出管理 器按钮和画布 按钮接收 鼠标事件 变换颜色 执行重画

5.6 各种构件的应用实例---Canvas class CanvasApplet extends Applet { MyCanvas mycanvas=new MyCanvas(); public void init() { setLayout(new BorderLayout()); Button button = new Button("Color"); add("North",button); add(“Center”,mycanvas); resize(200,250); } .

5.6 各种构件的应用实例---Canvas boolean action(Event evt, Object arg) { if(arg=="Color") mycanvas.swapColor(); return true; }

5.6 各种构件的应用实例---Canvas class MyCanvas extends Canvas { Color color; { color=Color.red; } public void paint(Graphics g) { g.setColor(color); g.fillRect(20,20,100,100); g.setColor(color.white); g.drawString("CANVAS",40,40);} public void swapColor() { if(color==Color.black) color=Color.red; else if(color==Color.red) color=Color.green; else color=Color.black; repaint(); } 5.6 各种构件的应用实例---Canvas .

5.6 各种构件的应用实例---Frame 5.6.3 Frame类 功能 : 制作一般的独立窗口,它是构件容器 创建 Frame fmInstance=new Frame(); 或 Frame fmInstance= new Frame(“The window for test”); 将其显示到屏幕上 fmInstance.show() 注意:不用add()

5.6 各种构件的应用实例---Frame 常用的方法 dispose,getCursorType,getIconImage, getMenuBar,getTitle,isResizable, setCursor,setIconImage,setMenuBar, setResizable,setTitle 窗口的相关事件: Event.WINDOW_DEICONIFY, _DESTROY _EXPOSE, _ICONIFY, _MOVED

5.6 各种构件的应用实例---Frame 例:创建一个窗口,并用按钮控制它的显示或 隐藏 FrameApplet Frame Window This is CustomFrame window Show window hide window Show window

5.6 各种构件的应用实例---Frame 在applet中action处理Button的事件 button.label is show Frame.show Frame.hide button.label is show button.label is hide

5.6 各种构件的应用实例---Frame . 关闭窗口的事件在窗口类本身处理. 注: 处理窗口中的事件用handelEvent() 为了将字符显示在自定义窗口中,包含输出语句的方法必须在自定义的窗口类中 . Frame Window This is CustomFrame window 关闭窗口的事件在窗口类本身处理. 注: 处理窗口中的事件用handelEvent() public boolean handleEvent(Event evt) { switch(evt.id) { case Event.WINDOW_DESTROY: dispose();System.exit(0); default: return super.handleEvent(evt); } }

5.6 各种构件的应用实例---Frame public class FrameApplet extends Applet { CustomFrame frame; Button button; public void init() { frame=new CustomFrame ("Custom Frame Window"); button=new Button("Show Window"); add(button); } } public boolean action(Event evt, Object arg) { boolean visible=frame.isShowing(); if(visible){ frame.hide(); button.setLabel("Show window");} else {frame.show();button.setLabel("Hide Window"); return true; 5.6 各种构件的应用实例---Frame

5.6 各种构件的应用实例---Frame class CustomFrame extends Frame { CustomFrame(String title) { super(title);} public boolean handleEvent(Event evt) { switch(evt.id) { case Event.WINDOW_DESTROY: dispose();System.exit(0); default: return super.handleEvent(evt); } } public void paint(Graphics g) { resize(200,100); g.drawString("this is a custom window.",30,30); } 5.6 各种构件的应用实例---Frame

5.6 各种构件的应用实例---Frame 多窗口(FrameApplet\ButtonsFrames.class-f1.bat)

5.6 各种构件的应用实例---Frame 1.一个窗口类创建两个实例 2.由于有不同的事件发生(按钮,关窗口),因此事件先由通用事件处理程序来接收,然后再根据情况做相应的处理. switch(evt.id) { case Event.WINDOW_DESTROY: dispose(); return true; case Event.ACTION_EVENT: return action(evt, evt.arg); default: return super.handleEvent(evt);} }

5.6 各种构件的应用实例---Frame 3. 任何时候只有一个窗口是活动的(active)的因此不必考虑那个判断是哪一个窗口发生的事件 4.一般的结构 在main()中,只做与窗口有关的事情:创建窗口,显示窗口 在构造方法中,安排窗口中的构件

5.6 各种构件的应用实例---Frame import java.awt.*; class ButtonsInFrames extends Frame { int a1=0,a2=0; public static void main(String args[]) { ButtonsInFrames myframe1=new ButtonsInFrames(); myframe1.setTitle("Button in Frame1"); myframe1.resize(200,200); myframe1.show(); ButtonsInFrames myframe2=new myframe2.setTitle("Button in Frame2"); myframe2.resize(200,200); myframe2.show(); } 5.6 各种构件的应用实例---Frame

5.6 各种构件的应用实例---Frame ButtonsInFrames() { setLayout(new BorderLayout()); Button b1=new Button("Button1"); Button b2=new Button("Button2"); add("North",b1);add("South",b2); } public boolean handleEvent(Event evt) { switch(evt.id) { case Event.WINDOW_DESTROY: dispose(); return true; case Event.ACTION_EVENT: return action(evt, evt.arg); default: return super.handleEvent(evt);} 5.6 各种构件的应用实例---Frame

5.6 各种构件的应用实例---Frame public boolean action(Event evt, Object arg) { if(evt.target instanceof Button) if(arg=="Button1") a1++; else a2++; repaint(); return true; } public void paint(Graphics g) { g.drawString("button1 "+a1,5,80); g.drawString("button2 "+a2,5,100); }} .

5.6 各种构件的应用实例---练习 与List类有关的事件 public boolean handleEvent(Event evt) Event.LIST_DESELECT, Event.LIST_SELECT 例:(FontDisplay.class---f3.bat) 5.6 各种构件的应用实例---练习 public boolean handleEvent(Event evt) { switch(evt.id){ case Event.WINDOW_DESTROY: dispose(); System.exit(0); default: return super.handleEvent(evt); } add Frame类 Panel类 TextArea类 List arae FontDisplayer FontDisplay! You can input something here. Arial Courier New Times New Roman 18 20 22 24 26 area.setfont(字型, 字体,字号) . handleEvent LIST_SELECT handleEvent WINDOW_DESTROY

5.6 各种构件的应用实例---练习 import java.awt.*; class FontDisplay extends Frame { TextArea FontShower; public static void main(String args[]) { FontDisplay myFrame=new FontDisplay(); myFrame.setTitle("FontDisplayer"); myFrame.resize(450,300); myFrame.show(); } public FontDisplay() { setLayout(new BorderLayout(5,5)); FontShower=new TextArea("Font Display! ”); add("West", new FontPanel(FontShower)); add("Center",FontShower);} 5.6 各种构件的应用实例---练习

5.6 各种构件的应用实例---练习 对窗口来说只有一个事件 public boolean handleEvent(Event evt) { switch(evt.id){ case Event.WINDOW_DESTROY: dispose(); System.exit(0); default: return super.handleEvent(evt); } 对窗口来说只有一个事件

5.6 各种构件的应用实例---练习 在panel中创建两个列表 往列表中加入条目用additem(str) 得到列表选项用getItem 事件处理用用handleEvent,得到两个参数--字型,字号. 对右边的文本区设置属性,利用引用传递. void updateFontShower() { area.setFont(new Font(CurrentFontName, Font.PLAIN, CurrentSize));}} .

5.6 各种构件的应用实例---练习 public boolean handleEvent(Event evt) { switch(evt.id){ case Event.LIST_SELECT: List target=(List)evt.target; String itemName= target.getItem(((Integer)evt.arg).intValue()); if(target==FontSelector) CurrentFontName=itemName; else CurrentSize=Integer.parseInt(itemName);

5.6 各种构件的应用实例---练习 String FontNames[]={"Arial", "Courier New", "Times New Roman"}; List FontSelector=new List(); for (i=0;i<FontNames.length;i++) FontSelector.addItem(FontNames[i]); add(FontSelector); List SizeSelector=new List(); for (i=6;i<64;i+=2) SizeSelector.addItem(String.valueOf(i)); add(SizeSelector);

{ area.setFont(param1,param2,param3) 5.6 各种构件的应用实例---练习 class FontPanel extends Panel { int CurrentSize=20; String CurrentFontName; TextArea area;; List FontSelector,SizeSelector; updateFontShower() { area.setFont(param1,param2,param3)

5.6 各种构件的应用实例---练习 FontPanel(TextArea FS) //把另一个对象做参数 { int i; String FontNames[]={"Arial", "Courier New", "Times New Roman"}; setLayout(new GridLayout(2,1,5,5)); FontSelector=new List(); for (i=0;i<FontNames.length;i++) FontSelector.addItem(FontNames[i]); add(FontSelector); SizeSelector=new List(); for (i=6;i<64;i+=2) SizeSelector.addItem(String.valueOf(i)); add(SizeSelector); area=FS; CurrentFontName=FontNames[0]; updateFontShower(); } 5.6 各种构件的应用实例---练习

5.6 各种构件的应用实例---练习 public boolean handleEvent(Event evt) { switch(evt.id){ case Event.LIST_SELECT: List target=(List)evt.target; String itemName= target.getItem(((Integer)evt.arg).intValue()); if(target==FontSelector) CurrentFontName=itemName; else CurrentSize=Integer.parseInt(itemName); updateFontShower(); return true; default: return super.handleEvent(evt); }} void updateFontShower() { area.setFont(new Font(CurrentFontName, Font.PLAIN, CurrentSize));}} 5.6 各种构件的应用实例---练习

5.6 各种构件的应用实例---menu 5.6.6菜单系统 类MenuBar 菜单容器 类Menu 类MenuItem 非菜单容器 一般菜单 可撕下菜单 帮助菜单 选项#1 菜单容器 选项#2 菜单中的菜单 选项#1 类Menu 选项#2 选项#3 第三层菜单 选项#1 选项#4 类MenuItem 选项#3 选项#2 非菜单容器

5.6 各种构件的应用实例---menu 创建菜单条 mb=new MenuBar(); setMenuBar(mb);(类Frame中的方法) edit file 创建菜单 menu1=new Menu(“file”); menu2=new Menu(“edit) mb.add(menu1);mb.add(menu2);

5.6 各种构件的应用实例---menu 创建菜单项 mi1=new MenuItem(“new”); mi2=new MenuItem(“open”); mi3=new MenuItem(“save”); mi4=new MenuItem(“close”); menu1.add(mi1); menu1.add(mi2); edit File New open Save Close

5.6 各种构件的应用实例---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”: ….; }

5.6 各种构件的应用实例---menu 在处理菜单事件 时应该注意的事情是:判断层次 A MenuContainer uplevel;(定义一个菜单容器) MenuItem target=(MenuItem)evt.target;(当前被选中的对象) uplevel=target.getParent(); strMessage=uplevel.getLabel()(得到上一级容器的标签)

5.6 各种构件的应用实例---menu public boolean action(Event evt, Object arg) { String strMessage; if(evt.target instanceof MenuItem){ MenuItem target=(MenuItem)evt.target; MenuContainer uplevel; uplevel=target.getParent(); while(uplevel instanceof Menu) { strMessage=((Menu)uplevel).getLabel()+strMessage; uplevel=((Menu)uplevel).getParent(); } strMessage="you selected"+strMessage; taMessage.appendText(strMessage); return true; } else return false;} 5.6 各种构件的应用实例---menu

5.6 各种构件的应用实例---menu Java1.1处理菜单的方法 两个主要的策略: 1. 让每个菜单项有一个唯一的监听器 2. 将一个大的监听器用于用于所有菜单项

5.6 各种构件的应用实例---menu class Example { class MenuFileOpen implements ActionListener { public void actionPerformed(ActionEvent e) { openFile(e.getActionCommand());} } class MenuFileSave implements ActionListener { saveFile(e.getActionCommand());}

5.6 各种构件的应用实例---menu public void init() { MenuItem OpenItem=new OpenItem.addActionListener (new MenuFileOpen()); MenuItem SaveItem= new MenuItem(“Save…”); SaveItem.addActionListener (new MenuFileSave()); }

5.6 各种构件的应用实例--综合练习 设计用户界面可根据用户选择办理银行业务 Bankapp\Bankapp.class---f2.bat 控制流程

5.6 各种构件的应用实例--综合练习 class Bank { long balance; public Bank() public void deposite(long amount) { if(amount>0.0) {balance+=amount;}} void withdrawal(long amount) { if(amount>0.0 &&amount <= balance) { balance-=amount;} } public long show_balance() { return (long)balance; }

5.6 各种构件的应用实例--综合练习 public class BankDemo { public static void main(String agrs[]) { Bank account1=new Bank(); Bank account2=new Bank(); account1.deposite(100); account2.withdrawal(50); account1.show_balance(); account2.show_balance(); } }

5.6 各种构件的应用实例--综合练习 WelCome to Bank 100 Create account Show nbalance Deposit Withdrawal

5.6 各种构件的应用实例--综合练习 主类Bankapp 辅类Bank 辅类Warningbox (Frame的子类) Bank() 创建账户 main() 定义并显示窗口 Warningbox(String str) 布局安排,显示对话框 显示警告信息 show_balance Bankapp() 布局安排 diposite() action() 关闭对话框 它是模态的 handleEvent() 关闭窗口 withdrawal() action() 根据按钮做处理 不满足Bank要求 满足Bank要求

5.6 各种构件的应用实例--综合练习 public static void main(String args[]) { Bankapp frame=new Bankapp(); frame.setTitle("Bank Application"); frame.resize(200,200); frame.show(); }

5.6 各种构件的应用实例--综合练习 public Bankapp() {setLayout(new GridLayout(6,1)); Label lb=new Label("welcome to Bank",Label.CENTER); tf=new TextField("0",15); add(lb);add(tf); b1=new Button("create account"); add(b1); b2=new Button("show balance"); add(b2); b3=new Button("diposite"); add(b3); b4=new Button("withdrawal"); add(b4); resize(450,100); }

5.6 各种构件的应用实例--综合练习 public boolean handleEvent(Event evt) { switch(evt.id) { case Event.WINDOW_DESTROY: dispose(); System.exit(0); return true; case Event.ACTION_EVENT: return action(evt, evt.arg); default: return super.handleEvent(evt); }

5.6 各种构件的应用实例--综合练习 public boolean action(Event evt,Object arg) {if(evt.target instanceof Button) { String targetLabel=tf.getText(); long amount=Long.valueOf(targetLabel).longValue(); if (arg=="diposite") { if (!haveAccount) {wb=new WarningBox(this,"create a account first!"); wb.show(); } else { if(amount==0) { wb=new WarningBox(this,”need the amount"); else { bank.deposite(amount); tf.setText("0"); }} return true; } return false; 5.6 各种构件的应用实例--综合练习

5.6 各种构件的应用实例--综合练习 public WarningBox(Frame parent,String str) { super(parent,"Warning!",true); Panel panel=new Panel(); panel.setLayout(new GridLayout(2,1)); panel.add(new Label(str,Label.CENTER)); panel.add(new Button("OK")); add(info_panel); } public boolean action(Event evt,Object arg) { if (evt.target instanceof Button) { this.dispose(); return true; return false; 5.6 各种构件的应用实例--综合练习

5.6 各种构件的应用实例--综合练习 class Bank { long balance; public Bank() public void deposite(long amount) { if(amount>0.0) {balance+=amount;}} void withdrawal(long amount) { if(amount>0.0 &&amount <= balance) { balance-=amount;} } public long show_balance() { return (long)balance; } 5.6 各种构件的应用实例--综合练习

5.7 总结 5.8 总结 1 使用AWT构件的应用实例 2 事件的传递 3 外观的管理与控制 了解类及其常用方法 设计好容器层次 2 事件的传递 3 外观的管理与控制 了解类及其常用方法 设计好容器层次 创建输出管理器setLayout 创建类的实例new 定义事件的处理action 加到上一级容器中 add

作业 将文本行的输入加入到文本域中 追加