精品午夜福利中文字av_国产成人综合网_av毛片免费观看网站_欧美影视国产综合_野花香视频中文免费观看_亚洲无码要在线视频_又粗又大又用力大交换好大好爽小静_欧美贵妇v办公室高跟鞋_亚洲国产高清a∨网站_免费中文少妇亚洲

知ing

Java語言程序設計(第三版)

邵麗萍,邵光亞,張后揚 編 / 清華大學出版社

拼命菇?jīng)鯜 上傳

查看本書

8.1  組件
  組件(Component)是構成GUI的基本要素,通過對不同事件的響應來完成和用戶的交互或組件之間的交互。
  AWT是Java語言提供的用戶界面設計工具,AWT的基本思想是將一個窗口看做一系列嵌套的構件。最外層可以是窗口、菜單條、按鈕或包容器等,而包容器又可以包含其他的構件或包容器。
  java.awt包提供了基本的java程序的GUI設計工具。主要包括下述三個概念,每個概念對應著一個類:
* 構件——Component,它是該包的核心。是一個抽象類,其他構件都是從它衍生出來的。
* 容器——Container,由Component類衍生而來,用來管理構件。
* 布局管理器——LayoutManager,確定容器內構件的布局。
  AWT的界面由組件組成,所有組件都是通過繼承Component組件類實現(xiàn)。組件主要有兩種:
 ?。?)基本組件:Button(按鈕)、Lable(標簽)、TextArea(文本區(qū))、TextField(文本框)、List(列表)、Canvas(作圖區(qū))、Ssrollbar(滑動條)、Checkbox(復選框)、Choice(選擇框)、Menu(菜單)、Mnebar(菜單條)。
 ?。?)容器組件:窗口組件Window,Dialog,Applet,F(xiàn)rame,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.創(chuàng)建標簽(Label)
  標簽的功能是顯示單行的字符串。
  2.標簽Label的構造方法:
 ?。?)Label( ):建立一個新的Label
 ?。?)Label(String text):以text建立一個新的Label
 ?。?)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("計算機");//按文本區(qū)域大小顯示
    Label la3=new Label("網(wǎng)絡",Label.RIGHT);//與("網(wǎng)絡",2)等價
    add(la1);
    add(la2);
    add(la3);
    add(new Label("技術",Label.CENTER));
  3.標簽的常用方法:
 ?。?)public int getAlignment( )返回當前的對齊方式
  (2)public String getText( )返回當前顯示的字符串
 ?。?)public void setAlignment(int alignment)設置對齊方式
 ?。?)public void setText(String label)設置顯示的字符串
  例:la1.setText(la2.getText());  //將標簽la1顯示成la2的內容
    la1.setAlignment(2);   //設置標簽la1的對齊方式
    add(la1);
8.1.2  按鈕(Button)
  1.創(chuàng)建按鈕
  2.按鈕的構造方法
  (1)Button( ):創(chuàng)建一個沒有標題的按鈕
 ?。?)Button(String label):創(chuàng)建一個有顯示標題的按鈕
  例: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.按鈕的常用方法
 ?。?)public String getLabel( ):返回按鈕的顯示標題
 ?。?)public void setLabel(String label):設置按鈕上的顯示標題
  例:String s=b2.getLabel();  //獲得b2按鈕的標題“確定”
    b1.setLabel(s);     // 將b1按鈕的標題改為s 值“確定”
    add(b1);
8.1.3  選項框(Choice)(下拉列表框)
  1.創(chuàng)建選項框
  每次只能選擇其中的一項。
  2.選項框的常用方法
 ?。?)public void addItem(String item):向選項框中加入選項item
  (2)public int countItems( ):返回選項框中的選項個數(shù)(此方法已不用)
    改為:getItemCount( ):
 ?。?)public String getItem(int index):返回指定下標值的某個選項
 ?。?)public int getSelectedIndex( ):返回被選中的選項的下標值
 ?。?)public String getSelectedItem( ):返回被選中的選項
 ?。?)public void select(int pos):選擇指定下標值的選項
 ?。?)public void select(String str):選擇指定的選項
 ?。?)Choice( ):構造一下拉選項框
 ?。?)public void add(String item):向選項框中加入選項item,同(1)
  (10)public void insert(String item,int index):在指定位置插入選項
  (11)public void remove(int index):刪除指定位置選項
 ?。?2)public void remove(String item):刪除指定字符串
 ?。?3)public void removeAll( ):刪除所有選項
 ?。?4)public Object[] getSelectedObject( ):返回當前選中項的Object數(shù)組
  例: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數(shù)組內容作為選項加入
  L1.setText(c.getItem(2)); //將標簽顯示成“yellow”
  c.addItem("紅色"); //在最后加入"紅色"選項,同c.add("紅色");
  String s=Integer.toString(c.getItemCount()); //獲得下拉列表選項數(shù) 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); //設置文本區(qū)域為不可編輯,用戶不可輸入內容
     for(int i=0;i<9;i++)
      c.addItem(description[i]); //將description數(shù)組內容作為選項加入
     add(t);   add(c);
     c.addItemListener(this);}
  public void itemStateChanged(ItemEvent e)
  {t.append("\n"+"index:  "+ c.getSelectedIndex()+ "\n"+c.getSelectedItem()+ "is selected");}}
  //將所選擇的序號和內容顯示在文本區(qū)域中
8.1.4  復選框(Checkbox)和選項按鈕(CheckboxGroup)
  1.創(chuàng)建復選框
  復選框構造方法:
  Checkbox( ):創(chuàng)建一個無顯示內容的復選框
  Checkbox(String label):創(chuàng)建一個指定顯示內容的復選框
  CheckboxGroup( ):創(chuàng)建一個選項組
  Checkbox(String label,CheckboxGroup cbGroup,boolean state):
  創(chuàng)建一個指定顯示內容字符串,屬于選項按鈕組cbGroup且狀態(tài)為state的選項按鈕
  復選框和選項按鈕常用方法:
  public void setLabel(String label):設置復選框或選項按鈕的標簽為label
  public void setState(boolean state):設置復選框或選項按鈕的狀態(tài)
  public boolean getState( ):獲得復選框或選項按鈕的狀態(tài)
  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的狀態(tài)為選中
    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);
  第一參數(shù)是選項按鈕的標簽,第二個是按鈕組對象,第三個是狀態(tài)。
  例: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) :新建一個指定行數(shù)i的列表框,b為true表示可以多選,false則只能單選;
  常用成員方法:
  public int getItemCount( ) :返回列表內的項目數(shù)//現(xiàn)改為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)
  文本框的構造方法
 ?。?)TextField( ):創(chuàng)建一個默認長度的文本框
  (2)TextField( int columns):創(chuàng)建一個列數(shù)是columns的文本框(即寬度)
 ?。?)TextField(String text ):創(chuàng)建一個帶有初始文本內容的文本框
 ?。?)TextField(String text,int columns ):創(chuàng)建一個帶有初始文本內容并具有指定列數(shù)的文本框
文本框的常用方法
(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( ) :返回文本框的列數(shù)
(6)public void setColumns( ) :設置文本框的列數(shù)
例:
  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("網(wǎng)絡");
    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  文本區(qū)(TextArea)
文本區(qū)的構造方法
(1)TextArea( ):創(chuàng)建一個默認大小的文本區(qū)
(2)TextArea(int rows,int columns):創(chuàng)建一個指定行和列數(shù)的文本區(qū)
(3)TextArea(String text):創(chuàng)建一個帶有初始文本內容的文本區(qū)
(4)TextArea(String text,int rows,int columns):創(chuàng)建一個帶有初始文本內容并具有指定行和列數(shù)的文本區(qū)
(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數(shù)字以外均都有水平垂直滾動條)
文本區(qū)的常用方法
(1)public void append(Sting str):在文本區(qū)尾部添加文本
(2)public void insert(String str,int pos):在文本區(qū)指定位置插入文本
(3)public void setText(String t):設定文本區(qū)內容
(4)public int getRows( ):返回文本區(qū)的行數(shù)
(5)public void setRows(int rows):設定文本區(qū)的行數(shù)
(6)public int getColumns( ):返回文本區(qū)的列數(shù)
(7)public void setColumns(int Columns):設定文本區(qū)的列數(shù)
(8)public void setEditable(boolean b):設定文本區(qū)是否只讀屬性
(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列空白文本區(qū)
   a2=new TextArea("城市管理",8,10);
   a3=new TextArea("城市管理",5,10,3);
   a4=new TextArea("安徽省合肥人",5,10);
   a2.append("\n網(wǎng)絡專業(yè)");   //a2后追加“網(wǎng)絡專業(yè)”(\n換行)
   a3.setEditable(false);   // 將a3設為只讀
  a3.insert("園林",2);   //在第2個字符插入“園林”
  a4.replaceRange("安慶",2,4);   //將a4文本區(qū)中第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(網(wǎng)格布局):
  將顯示區(qū)域劃分為若干行列,每個組件占一格。
8.2.1 順序布局(FlowLayout)
 構造函數(shù):
 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)
  構造函數(shù):
  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)
  構造函數(shù):
  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 網(wǎng)格布局(GridLayout)
  構造函數(shù):
  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個網(wǎng)格
      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"));  } }
網(wǎng)袋布局(GridBagLayout)(補充)
  網(wǎng)袋布局管理器中引入了一個輔助類GirdBagConstraints類,它可以指定構件的3個信息:
(1)構件單元在容器中的大小和位置,其高度和寬度可能占幾個行和列。
(2)單元中構件的大小和位置
(3)容器縮放時,單元發(fā)生的變化。
設置構件的大小、位置信息,要按如下步驟進行:
(1)創(chuàng)建一個GridBagConstraints類的對象(如果沒有的話)
(2)按照此構件的大小、位置信息設置此對象的各實例變量的值。
(3)調用GridBagLayout的setConstraints方法設置此構件的大小和位置信息,GridBagConstraint對象可以一次創(chuàng)建、多次使用。
構造函數(shù)
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):建立一指定參數(shù)的GridBagConstraints對象。其中:
* gridwidth和gridheight:用來設置組件所占的單位長度和高度,默認為1。
* Weightx和weighty:用來設置當窗口變大時,組件跟著變大的比例,默認為0,最大為1。數(shù)字越大表示組件變大的比例越大
* anchor:當兩個組件大不不同時,相對于大組件來說小的放在什么位置,一共有9個值:CENTER(默認)、NORTH、NORTHEAST、EAST、SOUTHEAST、SOUTH、SOUTHWEST、WEST、NORTHWEST。
* Fill:當組件所處的位置有剩余空間時,此參數(shù)設置為將組件填滿的方向,一共有4個值:NONE(默認)、VERTICAL、HORIZONTAL、BOTH。
* insets:設置組件間彼此的間距,有4個參數(shù)分別表示組件上、左、下、右4個方向的間距,默認為(0,0,0,0)
* ipadx和ipady:設置組件邊框離組件中心的距離,也就是組件的大小,默認為0。
8.2.5  面板(Panel)的使用
  面板是一個無邊框的容器,可以包容其他組件或另一個面板。面板目的是為了分層次、分區(qū)域管理各種組件。面板實際上是一個必須放在大容器(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)來實現(xiàn)。

面板和組件的常用方法:
> Panel( ):用默認布局方式創(chuàng)建一個面板
> Panel(LayoutManager layout):用指定布局方式創(chuàng)建一個面板
> 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()等方法為組件設置大小和在容器中的位置,且使得策略模式的優(yōu)點將被全部忽略,容器能應付調整大小的事件,代碼的可重用性也大大降低,還會導致程序的系統(tǒng)相關。
  首先: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的事件處理機制
  能產(chǎn)生事件的組件叫做事件源(如按鈕),可給事件源注冊一個事件監(jiān)聽器,當事件源發(fā)生事件時,事件監(jiān)聽器就代替事件源對發(fā)生的事件進行處理,這就是所謂的委托事件處理機制。
  注意:事件監(jiān)聽器不一定是包容事件源的容器對象,只要一個對象實現(xiàn)了事件監(jiān)聽器接口就能成為事件監(jiān)聽器。這樣處理可使程序中的事件處理代碼與GUI代碼分離,有利于優(yōu)化程序結構。
  在程序中編寫“事件處理”程序段時,通常可以分為以下幾個步驟:
(1)確定事件類型
(2)為部件增加一個該事件的監(jiān)測器:通常名為XXXListener。這些接口包含在java.awt.event和javax.swing.event包中
(3)增加事件處理程序
總體來說,Java事件處理有3部分主要內容:
事件對象:表示事件的內容
事件源:哪個控件上發(fā)生了事件
Listener:事件發(fā)生了誰來處理
  表8.1  Java事件類、對應接口及接口中的方法 P177
ActionEvent一些常用方法:
(1)public String getActionCommand( ):返回事件源的標簽
(2)public Object getSource( ):返回產(chǎn)生事件的對象名
(3)public int getModifiers( ):返回事件發(fā)生時功能控制鍵的狀態(tài),它們可能是功能鍵常數(shù):SHIFT_MASK、CTRL_MASK、ALT_MASK 
表8.1 Java事件類、對應接口及接口中的方法
事件類/接口名稱
接口的方法及產(chǎn)生事件的用戶操作
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)
文本行、文本區(qū)中修改內容時
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標記的類,稱為適配器類,它們是一些抽象類,其中聲明的方法與相應的接口的方法完全相同,也是空方法,但在使用它們繼承創(chuàng)建新類時,可以不實現(xiàn)所有的方法,只要實現(xiàn)需要的方法即可。
  例如:class EnclosingClass{
      ……
      static class NestedClass{……}
      class InnerClass{……}
     }
  被包容的類可以無條件地使用包容它的類的所有成員,包括私有成員,被包容的類的作用域僅限于包容它的類
  和類的其他成員一樣,被包容的類可以被聲明為靜態(tài)類,非靜態(tài)被包容類稱為內部類(inner class),也可以聲明為抽象類或最終類,這些和一般類聲明是完全相同的?!?br/>例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(); } } }
   
   作業(yè):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());
    } 
   
   }

查看更多