知ing

Java语言程序设计(第三版)

邵丽萍,邵光亚,张后扬 编 / 清华大学出版社

拼命菇凉@ 上传

查看本书

8.1  组件
  组件(Component)是构成GUI的基本要素,通过对不同事件的响应来完成和用户的交互或组件之间的交互。
  AWT是Java语言提供的用户界面设计工具,AWT的基本思想是将一个窗口看做一系列嵌套的构件。最外层可以是窗口、菜单条、按钮或包容器等,而包容器又可以包含其他的构件或包容器。
  java.awt包提供了基本的java程序的GUI设计工具。主要包括下述三个概念,每个概念对应着一个类:
* 构件——Component,它是该包的核心。是一个抽象类,其他构件都是从它衍生出来的。
* 容器——Container,由Component类衍生而来,用来管理构件。
* 布局管理器——LayoutManager,确定容器内构件的布局。
  AWT的界面由组件组成,所有组件都是通过继承Component组件类实现。组件主要有两种:
  (1)基本组件:Button(按钮)、Lable(标签)、TextArea(文本区)、TextField(文本框)、List(列表)、Canvas(作图区)、Ssrollbar(滑动条)、Checkbox(复选框)、Choice(选择框)、Menu(菜单)、Mnebar(菜单条)。
  (2)容器组件:窗口组件Window,Dialog,Applet,Frame,Panel。容器组件可以容纳AWT组件,也可以包含在AWT容器中。容器最高父类为Container类。
  AWT类库的基本层次结构:
Component
  
Button
Canvas
Checkbox
CheckboxGroup
Choice
Container
Label
List
Scrollbar
Textcomponent
  
panel
window

TextArea
TextField
  
Applet
Frame
Dialog
  
8.1.1  标签
  1.创建标签(Label)
  标签的功能是显示单行的字符串。
  2.标签Label的构造方法:
  (1)Label( ):建立一个新的Label
  (2)Label(String text):以text建立一个新的Label
  (3)Label(String text,int alignment):以text和指定的布局建立一个新的Label
  alignment有3种,分别用Label类的3个常量LEFT(0)(默认),CENTER(1)和RIGHT(2)来表示左对齐、居中对齐和右对齐。
  例:Label la1=new Label();
    Label la2=new Label("计算机");//按文本区域大小显示
    Label la3=new Label("网络",Label.RIGHT);//与("网络",2)等价
    add(la1);
    add(la2);
    add(la3);
    add(new Label("技术",Label.CENTER));
  3.标签的常用方法:
  (1)public int getAlignment( )返回当前的对齐方式
  (2)public String getText( )返回当前显示的字符串
  (3)public void setAlignment(int alignment)设置对齐方式
  (4)public void setText(String label)设置显示的字符串
  例:la1.setText(la2.getText());  //将标签la1显示成la2的内容
    la1.setAlignment(2);   //设置标签la1的对齐方式
    add(la1);
8.1.2  按钮(Button)
  1.创建按钮
  2.按钮的构造方法
  (1)Button( ):创建一个没有标题的按钮
  (2)Button(String label):创建一个有显示标题的按钮
  例:import java.awt.*;
    import java.applet.Applet;
    public class SC extends Applet{
     public void init()
       {Button b1=new Button();
       Button b2=new Button("确定");
       add(b1);add(b2);  }  }
  3.按钮的常用方法
  (1)public String getLabel( ):返回按钮的显示标题
  (2)public void setLabel(String label):设置按钮上的显示标题
  例:String s=b2.getLabel();  //获得b2按钮的标题“确定”
    b1.setLabel(s);     // 将b1按钮的标题改为s 值“确定”
    add(b1);
8.1.3  选项框(Choice)(下拉列表框)
  1.创建选项框
  每次只能选择其中的一项。
  2.选项框的常用方法
  (1)public void addItem(String item):向选项框中加入选项item
  (2)public int countItems( ):返回选项框中的选项个数(此方法已不用)
    改为:getItemCount( ):
  (3)public String getItem(int index):返回指定下标值的某个选项
  (4)public int getSelectedIndex( ):返回被选中的选项的下标值
  (5)public String getSelectedItem( ):返回被选中的选项
  (6)public void select(int pos):选择指定下标值的选项
  (7)public void select(String str):选择指定的选项
  (8)Choice( ):构造一下拉选项框
  (9)public void add(String item):向选项框中加入选项item,同(1)
  (10)public void insert(String item,int index):在指定位置插入选项
  (11)public void remove(int index):删除指定位置选项
  (12)public void remove(String item):删除指定字符串
  (13)public void removeAll( ):删除所有选项
  (14)public Object[] getSelectedObject( ):返回当前选中项的Object数组
  例:import java.awt.*;
import java.applet.Applet;
public class SC extends Applet{
 String []description={"red","blue","yellow","orange","green","black"};
 Label L1=new Label(); //标签对象L1
 Label L2=new Label();
 Choice c=new Choice(); //下拉列表对象c
 public void init(){
  for(int i=0;i<6;i++) 
   c.addItem(description[i]); //将description数组内容作为选项加入
  L1.setText(c.getItem(2)); //将标签显示成“yellow”
  c.addItem("红色"); //在最后加入"红色"选项,同c.add("红色");
  String s=Integer.toString(c.getItemCount()); //获得下拉列表选项数 7个
  L2.setText(s); //标签L2显示s值
  c.insert("兰",1); //在1的位置插入"兰"选项,"blue"等往后退
  c.select(3);  //将第3选项"yellow"设为当前选项
  c.remove(4);  //将第4选项"orange"删除
  add(L1);  add(L2);   add(c);  } }
  
  
  例:import java.awt.*;
  import java.awt.event.*;
  import java.applet.Applet;
  public class SC extends Applet implements ItemListener{
   String description[]={"red", "blue", "yellow", "orange", "pink", "grey", "green", "black", "brown"};
   TextArea t=new TextArea(10,30);
   Choice c=new Choice(); //下拉列表对象c
   public void init()
    { t.setEditable(false); //设置文本区域为不可编辑,用户不可输入内容
     for(int i=0;i<9;i++)
      c.addItem(description[i]); //将description数组内容作为选项加入
     add(t);   add(c);
     c.addItemListener(this);}
  public void itemStateChanged(ItemEvent e)
  {t.append("\n"+"index:  "+ c.getSelectedIndex()+ "\n"+c.getSelectedItem()+ "is selected");}}
  //将所选择的序号和内容显示在文本区域中
8.1.4  复选框(Checkbox)和选项按钮(CheckboxGroup)
  1.创建复选框
  复选框构造方法:
  Checkbox( ):创建一个无显示内容的复选框
  Checkbox(String label):创建一个指定显示内容的复选框
  CheckboxGroup( ):创建一个选项组
  Checkbox(String label,CheckboxGroup cbGroup,boolean state):
  创建一个指定显示内容字符串,属于选项按钮组cbGroup且状态为state的选项按钮
  复选框和选项按钮常用方法:
  public void setLabel(String label):设置复选框或选项按钮的标签为label
  public void setState(boolean state):设置复选框或选项按钮的状态
  public boolean getState( ):获得复选框或选项按钮的状态
  public String getLabel( ):获得复选框或选项按钮的标签
  例:import java.awt.*;
    import java.awt.event.*;
    public class SC{
    public static void main(String args[]){
      Frame f=new Frame("CheckBox");
      f.setLayout(new GridLayout(2,1));
      Panel p1=new Panel();
      p1.setLayout(new GridLayout(1,3));
      Checkbox c1=new Checkbox("小肥牛");  //新建C1复选框,标签是"小肥牛"
      Checkbox c2=new Checkbox("小肥羊");
      Checkbox c3=new Checkbox("蜀王");
      p1.add(c1);   p1.add(c2);  p1.add(c3);
     Choice c=new Choice(); //新建下拉列表对象c
   c.add(c1.getLabel());  //将c1复选框的标签加入到c的下拉列表框中
   c.add(c2.getLabel());
   c.add(c3.getLabel());
   p1.add(c);
   c1.setLabel("金满楼"); //将c1的标签改为“金满楼”
   c2.setState(true); //设置c2的状态为选中
    f.add(p1);  f.pack();  f.show();
  f.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e) {
     System.exit(0); }  }); }  }
  运行结果:
  
  2.选项按钮
  选项按钮构造方法: CheckboxGroup( ) 
  常用方法:
 public CheckboxGroup getCheckboxGroup( ):返回选项按钮所属的复选框组
 public void setCheckboxGroup(CheckboxGroup g ):设置选项按钮所属的复选框组
  注:要生成选项按钮,必须先生成一个类CheckboxGroup的对象:
    CheckboxGroup c=new CheckboxGroup( );
  然后再使用下面语句:
    Checkbox c1=new Checkbox(“Label”,c,false);
  第一参数是选项按钮的标签,第二个是按钮组对象,第三个是状态。
  例:import java.awt.*;
   import java.applet.*;
   public class SC extends Applet{
    CheckboxGroup cbg=new CheckboxGroup();
    public void init(){
     add(new Checkbox("第一",cbg,true));
     add(new Checkbox("第二",cbg,false));
     add(new Checkbox("第三",cbg,false));   }}
8.1.5  列表框(List)
  构造方法:
  List( ) :新建一个空的列表框
  List(int i ,boolean b) :新建一个指定行数i的列表框,b为true表示可以多选,false则只能单选;
  常用成员方法:
  public int getItemCount( ) :返回列表内的项目数//现改为getItemCount()
  public String getItem(int index):返回下标为index指定的列表项
  public synchronized void add(String item):增加一项item
  public synchronized void addItem(String item):同上
  public synchronized void removeAll( ):清空列表
  public synchronized void remove(int index):删除指定下标项
  public synchronized void remove(String item):删除指定选项
  public synchronized int getSelectedIndex( ):获取选定项的下标
  public synchronized int[] getSelectedIndexs( ):获取多个选定项的下标
  public synchronized String getSelectedItem( ): 获取选定项内容
  public synchronized String[] getSelectedItems( ): 获取多个选定项内容
  public synchronized void select(int index ): 选定指定下标的项
  public synchronized void deselect(int index ): 取消对指定下标项的选择
  public synchronized boolean isIndexSelected(int index ): 判断指定下标项是否被选择
  public boolean isMultipleMode( ): 判断列表是否支持多行选择
  public void setMultipleMode(boolean bl ): 设置列表是否支持多行选择
  例:
8.1.6  单行文本框(TextField)
  文本框的构造方法
  (1)TextField( ):创建一个默认长度的文本框
  (2)TextField( int columns):创建一个列数是columns的文本框(即宽度)
  (3)TextField(String text ):创建一个带有初始文本内容的文本框
  (4)TextField(String text,int columns ):创建一个带有初始文本内容并具有指定列数的文本框
文本框的常用方法
(1)public void setEchoChar(char c):设定用户输入字符的回显字符
(2)public void setText(String t) :设定文本框的文本内容
(3)public String getText( ) :返回文本框中的文本内容
(4)public void setEditable(boolean b) :设定文本框是否只读属性,false为只读
(5)public int getColumns( ) :返回文本框的列数
(6)public void setColumns( ) :设置文本框的列数
例:
  import java.awt.*;
  import java.applet.Applet;
  public class SC extends Applet{
   public void init(){
    TextField t1,t2,t3,t4,t5;
    Label L1=new Label();
    t1=new TextField();
    t2=new TextField(5); //宽度为5个汉字
    t3=new TextField("网络");
    t4=new TextField("计算机",2);  //只显示出“计算”
    add(t1);add(t2);add(t3);add(t4); add(l1);
    L1.setText(t4.getText());  //L1获得t4的内容
    t1.setEchoChar('*');  //设置掩码为“*” 
    t2.setText("Java!");   // 将t2内容改为“Java!!!”
    t3.setEditable(false);  }}  // 将t3设为只读
8.1.7  文本区(TextArea)
文本区的构造方法
(1)TextArea( ):创建一个默认大小的文本区
(2)TextArea(int rows,int columns):创建一个指定行和列数的文本区
(3)TextArea(String text):创建一个带有初始文本内容的文本区
(4)TextArea(String text,int rows,int columns):创建一个带有初始文本内容并具有指定行和列数的文本区
(5)TextArea(String text,int rows,int columns,int scrollbars):在(4)的基础上添加滚动条,scrollbars取值:1(SCROLLBARS_VERTICAL_ONLY)(仅有垂直),2(SCROLLBARS_HORIZONTAL_ONLY)(仅有水平),3(SCROLLBARS_NONE)(无滚动条),4(SCROLLBARS_BOTH)(水平、垂直均有)(除1,2,3数字以外均都有水平垂直滚动条)
文本区的常用方法
(1)public void append(Sting str):在文本区尾部添加文本
(2)public void insert(String str,int pos):在文本区指定位置插入文本
(3)public void setText(String t):设定文本区内容
(4)public int getRows( ):返回文本区的行数
(5)public void setRows(int rows):设定文本区的行数
(6)public int getColumns( ):返回文本区的列数
(7)public void setColumns(int Columns):设定文本区的列数
(8)public void setEditable(boolean b):设定文本区是否只读属性
(9)public void replaceRange(String str,int start,int end):从start到end的文本替换为str的内容
例:import java.awt.*;
  import java.applet.Applet;
  public class SC extends Applet{
  public void init(){
   TextArea a1,a2,a3,a4;
   a1=new TextArea(5,10);  // 5行10列空白文本区
   a2=new TextArea("城市管理",8,10);
   a3=new TextArea("城市管理",5,10,3);
   a4=new TextArea("安徽省合肥人",5,10);
   a2.append("\n网络专业");   //a2后追加“网络专业”(\n换行)
   a3.setEditable(false);   // 将a3设为只读
  a3.insert("园林",2);   //在第2个字符插入“园林”
  a4.replaceRange("安庆",2,4);   //将a4文本区中第2~4的字符改为“安庆”
  add(a1);add(a2);add(a3);add(a4);  } }


8.2  组件布局管理
布局:就是容器中组件的摆放方式,常用的布局管理器有:
1.FlowLayout(顺序)(默认):
  将组件依次摆放,每个组件若不设置其大小都将被压缩到最小尺寸。
2.BorderLayout(边界布局):
  将组件按north,south,west,east,center五个位置来摆放。
3.CardLayout(卡片布局):
  前后依次排列,每次只显示一个卡片。
4.GridLayout(网格布局):
  将显示区域划分为若干行列,每个组件占一格。
8.2.1 顺序布局(FlowLayout)
 构造函数:
 FlowLayout( ):建立一个新的FlowLayout布局,默认居中对齐,组件间有5个单位的水平和垂直间距。
 FlowLayout(int align ):按align建立一个新的FlowLayout布局,默认居中对齐,组件间有5个单位的水平和垂直间距。
 FlowLayout(int align,int h,int v):按align建立一个新的FlowLayout布局,齐,组件间有h水平和v垂直间距。
 FlowLayout共有5种排列方式CENTER(中)、LEFT(左)、RIGHT(右)、LEADING(头)、TAILING(尾)。
8.2.2 边界布局(BorderLayout)
  构造函数:
  BorderLayout( ):建立一个组件间没有间距的BorderLayout
  BorderLayout(int h,int v):建立一个组件间有间距的BorderLayout,h为水平间距,v为垂直间距。
  例p171:import java.awt.*;
    import java.applet.Applet;
    public class SC extends Applet{
    Button bn,bs,be,bw,bc;
    public void init(){
    setLayout(new BorderLayout(5,10)); //设置为边界布局,间距为5,10
    bn=new Button("北");
    bs=new Button("南");
    be=new Button("东");
    bw=new Button("西");
    bc=new Button("中");
    add("North",bn);
    add("South",bs);
    add("East",be);
    add("West",bw);
    add("Center",bc);  } }
8.2.3 卡片布局(CardLayout)
  构造函数:
  CardLayout( ):
  建立组件间没有水平与垂直间距的、新的CardLayout。
  CardLayout( ):建立组件间没有水平间距为h、垂直间距为v的、新的CardLayout。
  例P171:import java.awt.*;
      import java.applet.Applet;
      public class SC extends Applet{
      public void init(){
      CardLayout card =new CardLayout();
      setLayout(card);
      setFont(new Font("Arial",Font.PLAIN,24));
      for (int i=1;i<=5;i++){
        add(String.valueOf(i),new Button("卡片号为:"+i)); }
      card.show(this,String.valueOf(2)); } }
8.2.4 网格布局(GridLayout)
  构造函数:
  GridLayout( ):建立一个新的默认是1行1列的GridLayout
  GridLayout(int r,int c):建立一个r行c列的GridLayout
  GridLayout(int r,int c,int h,int v):建立一个r行c列的水平间距是h,垂直间距是v的GridLayout
例P172:import java.awt.*;
    import java.applet.Applet;
    public class SC extends Applet{
     Button b1,b2,b3,b4,b5,b6;
     public void init(){
      setLayout(new GridLayout(3,3)); // 设置3行3列共9个网格
      b1=new Button("按钮1");
      b2=new Button("按钮2");
      b3=new Button("按钮3");
      b4=new Button("按钮4");
      b5=new Button("按钮5");
      b6=new Button("按钮6");
     add(new Label("label1"));
     add(b1);add(b2);add(b3);
     add(new Label1());  // 加一个空标签
     add(b4);add(b5);add(b6);
     add(new Label("label2"));  } }
网袋布局(GridBagLayout)(补充)
  网袋布局管理器中引入了一个辅助类GirdBagConstraints类,它可以指定构件的3个信息:
(1)构件单元在容器中的大小和位置,其高度和宽度可能占几个行和列。
(2)单元中构件的大小和位置
(3)容器缩放时,单元发生的变化。
设置构件的大小、位置信息,要按如下步骤进行:
(1)创建一个GridBagConstraints类的对象(如果没有的话)
(2)按照此构件的大小、位置信息设置此对象的各实例变量的值。
(3)调用GridBagLayout的setConstraints方法设置此构件的大小和位置信息,GridBagConstraint对象可以一次创建、多次使用。
构造函数
GridBagLayout():建立一个新的GridBagLayout
GridBagConstraints():建立一个新的GridBagConstraints对象
GridBagConstraints(int gridx,int gridy,int gridwidth,int gridheight,double weightx,double weighty,int anchor,int fill,Insets insets,int ipadx,int ipady):建立一指定参数的GridBagConstraints对象。其中:
* gridwidth和gridheight:用来设置组件所占的单位长度和高度,默认为1。
* Weightx和weighty:用来设置当窗口变大时,组件跟着变大的比例,默认为0,最大为1。数字越大表示组件变大的比例越大
* anchor:当两个组件大不不同时,相对于大组件来说小的放在什么位置,一共有9个值:CENTER(默认)、NORTH、NORTHEAST、EAST、SOUTHEAST、SOUTH、SOUTHWEST、WEST、NORTHWEST。
* Fill:当组件所处的位置有剩余空间时,此参数设置为将组件填满的方向,一共有4个值:NONE(默认)、VERTICAL、HORIZONTAL、BOTH。
* insets:设置组件间彼此的间距,有4个参数分别表示组件上、左、下、右4个方向的间距,默认为(0,0,0,0)
* ipadx和ipady:设置组件边框离组件中心的距离,也就是组件的大小,默认为0。
8.2.5  面板(Panel)的使用
  面板是一个无边框的容器,可以包容其他组件或另一个面板。面板目的是为了分层次、分区域管理各种组件。面板实际上是一个必须放在大容器(Applet或Frame)中的小容器。
例P173:import java.awt.*;
    import java.applet.Applet;
   public class SC extends Applet{
   public void init(){
   setLayout(new BorderLayout()); 
   setForeground(Color.black);  //设置前景色
   setFont(new Font("Arial",Font.PLAIN,20));  //设置字体,风格,字号
   add("North",new Label("我在Applet中",Label.CENTER));
   Panel panel1=new Panel();
   add("West",panel1); //在西边加入panel1对象
   panel1.setBackground(Color.blue);  //设置panel1的背景色
   panel1.setForeground(Color.red);
   panel1.setLayout(new BorderLayout()); //在panel1中设置新布局
   panel1.add("East",new Button("东"));
   panel1.add("West",new Button("西"));
   panel1.add("Center",new Label("我在Panel1中"));
   Panel panel2=new Panel();
   add("East",panel2); ////在总布局的东边加入panel2对象
   panel2.setBackground(Color.green);
   panel2.setLayout(new BorderLayout());
   panel2.add("North",new Label("我在Panel2中"));
   panel2.add("South",new Button("我在Panel2中")); }}
  
  当容器中的组件较多时,用一个布局管理器来管理容器的所有组件就有局限,但一个容器又只能有一个布局管理器,可以通过叠加多个透明容器(如Panel)来实现。

面板和组件的常用方法:
> Panel( ):用默认布局方式创建一个面板
> Panel(LayoutManager layout):用指定布局方式创建一个面板
> public Component add(Component comp):为容器添加一个组件
> public Component add(Component comp,int index):将组件添加到队列的指定位置
> public void add(Component comp,Object constraints):按照限制条件添加组件
> public void remove(Component comp):去除指定组件
> public void setFont(font f):设定组件的字体
> public void setSize(Dimension d):设定组件的宽和高
> public void setVisible(boolean b):设定组件是否可见
> public void setLocation(int x,int y):以设定组件的位置
> public void setBackground(Color c):设定组件的背景色
> public void setForeground(Color c):设定组件的前景色
> public void setBounds(int x,int y,int widty,int height):设定组件的位置和大小
> public void setName(String name):设定组件的名称
> public String getName():返回组件的名称
> public int getX():返回组件的X坐标
> public int getY():返回组件的Y坐标
> public int getHeight():返回组件的高
> public int getWidth():返回组件的宽
> public void paint(Graphics g):画出容器
> public void update(Graphics g):用背景色清除组件,设定画笔为前景色,调用paint方法重画组件。
> Public void repaint():立即调用组件的update方法
8.2.6  手工布局
  Java允许使用手工布局放置各个组件,这种方法比较灵活,但用户必须使用setLocation()、setSize()、setBounds()等方法为组件设置大小和在容器中的位置,且使得策略模式的优点将被全部忽略,容器能应付调整大小的事件,代码的可重用性也大大降低,还会导致程序的系统相关。
  首先:setLayout(null);语句关闭默认的布局管理器
  例P175:import java.awt.*;
      import java.applet.Applet;
      public class SC extends Applet{
      Choice c=new Choice();
      Button b1=new Button("Button1"); 
      Button b2=new Button("Button2");
      Button b3=new Button("Button3");
      public void init(){
      setLayout(null);
      c.addItem("Item1");
      c.addItem("Item2");
      c.addItem("Item3");
      add(c);
      c.setBounds(80,80,100,20);
      add(b1);
      b1.setBounds(20,20,50,30);
      add(b2);
      b2.setBounds(100,20,50,30);
      add(b3);
      b3.setBounds(200,60,50,50);  }}
8.3  事件处理方法
8.3.1  事件与事件处理方法
  Java通过委托型事件处理机制解决如何对事件作出响应的问题
8.3.2  Java的事件处理机制
  能产生事件的组件叫做事件源(如按钮),可给事件源注册一个事件监听器,当事件源发生事件时,事件监听器就代替事件源对发生的事件进行处理,这就是所谓的委托事件处理机制。
  注意:事件监听器不一定是包容事件源的容器对象,只要一个对象实现了事件监听器接口就能成为事件监听器。这样处理可使程序中的事件处理代码与GUI代码分离,有利于优化程序结构。
  在程序中编写“事件处理”程序段时,通常可以分为以下几个步骤:
(1)确定事件类型
(2)为部件增加一个该事件的监测器:通常名为XXXListener。这些接口包含在java.awt.event和javax.swing.event包中
(3)增加事件处理程序
总体来说,Java事件处理有3部分主要内容:
事件对象:表示事件的内容
事件源:哪个控件上发生了事件
Listener:事件发生了谁来处理
  表8.1  Java事件类、对应接口及接口中的方法 P177
ActionEvent一些常用方法:
(1)public String getActionCommand( ):返回事件源的标签
(2)public Object getSource( ):返回产生事件的对象名
(3)public int getModifiers( ):返回事件发生时功能控制键的状态,它们可能是功能键常数:SHIFT_MASK、CTRL_MASK、ALT_MASK 
表8.1 Java事件类、对应接口及接口中的方法
事件类/接口名称
接口的方法及产生事件的用户操作
ActionEvent单击事件类
ActionListener单击事件接口
actionPerformed(ActionEvent e) 单击按钮、文本行中单击鼠标、双击列表框选项
ComponentEvent组件事件类
ComponentListener接口
componentMoved(ComponentEvent e)移动组件时
componentHidden(ComponentEvent e)隐藏组件时
componentResized(ComponentEvent e)改变组件大小时
componentShown(ComponentEvent e)显示组件时
ContainerEvent容器事件类
ContainerListener接口
componentAdded(ContainerEvent e)添加组件时
componentRemoved(ContainerEvent e)添加组件时
FocusEvent焦点事件类
FocusListener接口
focusGained(FocusEvent e)获得焦点时
focusLost(FocusEvent e)失去焦点时
ItemEvent选择事件类
ItemListener接口
itemStateChanged(ItemEvent e)选择复选框、选项框、单击列表框、选中带复选框的菜单项
KeyEvent键盘击键事件类
KeyListener接口
keyPressed(KeyEvent e)按下键盘时
keyReleased(KeyEvent e)释放键盘时
MouseEvent鼠标事件类
MouseListener鼠标按钮事件接口
mouseClicked(MouseEvent e)单击鼠标时
mouseEntered(MouseEvent e)鼠标进入时
mouseExited(MouseEvent e)鼠标离开时
mousePressed(MouseEvent e)按下鼠标时
mouseReleased(MouseEvent e)放开鼠标时
MouseEvent鼠标事件类
MouseMotionListener接口
mouseDragged(MouseEvent e)拖拽鼠标时
mouseMoved(MouseEvent e)鼠标移动时
TextEvent文本事件类
TextListener接口
textValueChanged(TextEvent e)
文本行、文本区中修改内容时
WindowEvent窗口事件类
WindowListener接口
windowsOpened(WindowEvent e)打开窗口时
windowsClosed(WindowEvent e)关闭窗口后
windowsClosing(WindowEvent e)关闭窗口时
windowsActivated(WindowEvent e)激活窗口时
windowsDeactivated(WindowEvent e)窗口失去焦点时
windowsIconified(WindowEvent e)窗口缩小为图标时
windowsDeiconified(WindowEvent e)窗口复原时

例P179:import java.applet.*;
    import java.awt.*;
    import java.awt.event.*;
public class SC extends Applet implements ItemListener{
   TextArea area=new TextArea(6,30);
   String City[]={"北京","上海","天津","南京","武汉"};
   Checkbox cb[]=new Checkbox[5];
   Checkbox radio[]=new Checkbox[5];
    public void init(){
    add(new Label("这是一个选项事件例子"));
    add(area);
    add(new Label("   请选择中国的大城市:"));
    for (int i=0;i<5;i++){
     cb[i]=new Checkbox(City[i]);
     add(cb[i]);
      cb[i].addItemListener(this); }
  CheckboxGroup cbGroup=new CheckboxGroup();
  add(new Label("请选择中国最大的城市:"));
  for (int i=0;i<5;i++){
    radio[i]=new Checkbox(City[i],cbGroup,false);
    add(radio[i]);
    radio[i].addItemListener(this); } }
public void itemStateChanged(ItemEvent e){
  area.append("你选择的是"+e.getItem()+"\n");  } }// e.getItem()选项标签
8.3.4 事件适配器类与类的包容
  在java.awt.event包中还声明了一组带Adapter标记的类,称为适配器类,它们是一些抽象类,其中声明的方法与相应的接口的方法完全相同,也是空方法,但在使用它们继承创建新类时,可以不实现所有的方法,只要实现需要的方法即可。
  例如:class EnclosingClass{
      ……
      static class NestedClass{……}
      class InnerClass{……}
     }
  被包容的类可以无条件地使用包容它的类的所有成员,包括私有成员,被包容的类的作用域仅限于包容它的类
  和类的其他成员一样,被包容的类可以被声明为静态类,非静态被包容类称为内部类(inner class),也可以声明为抽象类或最终类,这些和一般类声明是完全相同的。 
例P185:import java.applet.Applet;
  import java.awt.*;
  import java.awt.event.*;
  public class SC extends Applet{
  int x1,y1,x2,y2;
  public void init( )
   { addMouseListener(new m1());
    addMouseMotionListener(new m2());  }
  public void paint(Graphics g){
    g.drawLine(x1,y1,x2,y2); }
  class m1 extends MouseAdapter{
   public void mousePressed(MouseEvent e){
     x1=e.getX();
     y1=e.getY();   }}
  class m2 extends MouseMotionAdapter{
   public void mouseDragged(MouseEvent e){
     x2=e.getX();
     y2=e.getY();
     repaint(); } } }
   
   作业:P186-6
   import java.applet.Applet;
   import java.awt.*;
   import java.awt.event.*;
   
   public class SC extends Applet implements ItemListener {
   Label la1=new Label("喜欢的城市:");
   Label la2=new Label("喜欢的活动:");
   Choice c=new Choice();
   List l=new List();
   
   public void init( )
   {
   setLayout(null);
   c.add("北京");
   c.add("上海");
   c.add("武汉");
   c.add("南京");
   c.addItemListener(this);
   l.add("听音乐");
   l.add("看电视");
   l.add("看电影");
   l.add("看小说");
   l.add("打球");
   l.addItemListener(this);
   add(c); c.setBounds(20,20,100,30);
   add(l); l.setBounds(20,50,100,60);
   add(la1);la1.setBounds(150,20,100,30);
   add(la2);la2.setBounds(150,50,100,30);
   }
    
   public void itemStateChanged(ItemEvent e)
   {if (e.getSource()==c)
       la1.setText("喜欢的城市:"+e.getItem());
    else
       la2.setText("喜欢的活动:"+l.getSelectedItem());
    } 
   
   }

查看更多