940 likes | 1.09k Vues
第 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 等等都是构件。
E N D
第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定义的方法。
已经学过的: 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 5.1 使用AWT构件
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 Panel Button Applet Menu Window Frame Textfield Dialog Checkbox FileDialog
窗口 panel 按钮 5.3 事件的传递(1.02) 当动作发生在按钮上时, 首先看按钮这个类有没有action方法,如果没有则看包含按钮的容器类(即panel)有没有action方法,如果没有事件就传递窗口, 如果没有就传递给 component的通用处理方法,如果程序中没有定义任何action方法,实际上事件最终不被处理
Panel ok 窗口 class MyClass extends Frame { MyPanel p=new Mypanel(); add(p); Button b=new Button(exit); add(b); boolean action() {…….;} } 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; }
窗口获面板的监听器 窗口 panel 按钮的监听器 button 5.3 事件的传递(1.1)
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); } } .
加入 add 处理 响应 action 创建 new 5.4 各种构件的应用实例 • 一般步骤:
Computer Music Sports 1 Computer Art Music Sports max start min Art 5.4 各种构件的应用实例 New TextField(20); 常用的方法 getText();setText(); setEchoCharacter(char c) new TextArea( “this is a test”,20,40); Scrollbar(VERTICAL,50,0,1,100); CheckboxGroup gr=new CheckboxGroup(); New Checkbox(label, gr, false); New Checkbox(label,gr,true); New Checkbox(label, null, false);
5.4 各种构件的应用实例--CheckBox • 应用举例 • 建立三个复选框,被选中者的标签内容变成“changes” • 应有的类:Checkbox • 应有的方法: • 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 外观的管理与制 0 0 1 3 1 2 3 4 4 4 5 5
button1 button2 button3 button4 5.5 外观的管理与制 • Panel类(面板) • 功能:容纳其他对象,安排合理布局 • 创建面板: • Panel myPanel=new Panel(); • add(myPanel); • 将面板作为容器: • mypanel.add(button)
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 • GridLayout(3,3,0,0) • setLayout(); rows cols hspace vspace
5.5 外观的管理与制 • GridBagLayout类和 • GridBagConstraints类 • 功能:借助于GridBagConstraints类,实现更灵活的外观管理 • 每个构件后都跟随一个GridBagLayout对象实体,来决定构件的外观. • 创建 • 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
button1 button2 button3 button4 button5 button6 button7 button8 button9 5.5 外观的管理与制 • 例:(GridBagApplet.html)
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");
But1 But2 But3 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);
But1 But2 But3 But4 5.5 外观的管理与制 • GBC.gridwidth= GridBagConstraints.REMAINDER; • (表示该按钮独占一行) • layout.setConstraints(button4,GBC); • add(button4);
But1 But2 But3 But4 But5 But6 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 But5 But6 But7 5.5 外观的管理与制 • GBC.gridwidth=1; • GBC.gridheight=2; • (高度为两个单元) • layout.setConstraints(button7,GBC); • add(button7);
But1 But2 But3 But4 But5 But6 But7 But8 But9 5.5 外观的管理与制 • GBC.gridwidth= GridBagConstraints.REMAINDER; • GBC.gridheight=1; • layout.setConstraints(button8,GBC); • add(button8); • layout.setConstraints • (button9,GBC); • add(button9);
5.6 各种构件的应用实例---Canvas • 5.6.2 Canvas类(画布) • 功能: 制作其他构件,通常用来放置图形图像,或绘图. • 画图可以直接在applet区域上进行,定义了 Canvas对象后将paint()语句作为该对象的方法,这些动作就自动发生在画布区. • 通常不需要处理画布上发生的事件 • 创建 • Canvas canvas=new Canvas(); • add(canvas);
5.6 各种构件的应用实例---Canvas • 例:根据程序说出运行结果 • 注意一个程序中生成一个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 • 例:按动鼠标改变画布的颜色(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; • }
class MyCanvas extends Canvas { Color color; MyCanvas() { 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 .