8.1 組件
組件(Component)是構(gòu)成GUI的基本要素,通過(guò)對(duì)不同事件的響應(yīng)來(lái)完成和用戶的交互或組件之間的交互。
AWT是Java語(yǔ)言提供的用戶界面設(shè)計(jì)工具,AWT的基本思想是將一個(gè)窗口看做一系列嵌套的構(gòu)件。最外層可以是窗口、菜單條、按鈕或包容器等,而包容器又可以包含其他的構(gòu)件或包容器。
java.awt包提供了基本的java程序的GUI設(shè)計(jì)工具。主要包括下述三個(gè)概念,每個(gè)概念對(duì)應(yīng)著一個(gè)類:
* 構(gòu)件——Component,它是該包的核心。是一個(gè)抽象類,其他構(gòu)件都是從它衍生出來(lái)的。
* 容器——Container,由Component類衍生而來(lái),用來(lái)管理構(gòu)件。
* 布局管理器——LayoutManager,確定容器內(nèi)構(gòu)件的布局。
AWT的界面由組件組成,所有組件都是通過(guò)繼承Component組件類實(shí)現(xiàn)。組件主要有兩種:
?。?)基本組件:Button(按鈕)、Lable(標(biāo)簽)、TextArea(文本區(qū))、TextField(文本框)、List(列表)、Canvas(作圖區(qū))、Ssrollbar(滑動(dòng)條)、Checkbox(復(fù)選框)、Choice(選擇框)、Menu(菜單)、Mnebar(菜單條)。
(2)容器組件:窗口組件Window,Dialog,Applet,F(xiàn)rame,Panel。容器組件可以容納AWT組件,也可以包含在AWT容器中。容器最高父類為Container類。
AWT類庫(kù)的基本層次結(jié)構(gòu):
Component
Button
Canvas
Checkbox
CheckboxGroup
Choice
Container
Label
List
Scrollbar
Textcomponent
panel
window
TextArea
TextField
Applet
Frame
Dialog
8.1.1 標(biāo)簽
1.創(chuàng)建標(biāo)簽(Label)
標(biāo)簽的功能是顯示單行的字符串。
2.標(biāo)簽Label的構(gòu)造方法:
(1)Label( ):建立一個(gè)新的Label
?。?)Label(String text):以text建立一個(gè)新的Label
?。?)Label(String text,int alignment):以text和指定的布局建立一個(gè)新的Label
alignment有3種,分別用Label類的3個(gè)常量LEFT(0)(默認(rèn)),CENTER(1)和RIGHT(2)來(lái)表示左對(duì)齊、居中對(duì)齊和右對(duì)齊。
例:Label la1=new Label();
Label la2=new Label("計(jì)算機(jī)");//按文本區(qū)域大小顯示
Label la3=new Label("網(wǎng)絡(luò)",Label.RIGHT);//與("網(wǎng)絡(luò)",2)等價(jià)
add(la1);
add(la2);
add(la3);
add(new Label("技術(shù)",Label.CENTER));
3.標(biāo)簽的常用方法:
?。?)public int getAlignment( )返回當(dāng)前的對(duì)齊方式
?。?)public String getText( )返回當(dāng)前顯示的字符串
?。?)public void setAlignment(int alignment)設(shè)置對(duì)齊方式
?。?)public void setText(String label)設(shè)置顯示的字符串
例:la1.setText(la2.getText()); //將標(biāo)簽la1顯示成la2的內(nèi)容
la1.setAlignment(2); //設(shè)置標(biāo)簽la1的對(duì)齊方式
add(la1);
8.1.2 按鈕(Button)
1.創(chuàng)建按鈕
2.按鈕的構(gòu)造方法
?。?)Button( ):創(chuàng)建一個(gè)沒(méi)有標(biāo)題的按鈕
?。?)Button(String label):創(chuàng)建一個(gè)有顯示標(biāo)題的按鈕
例: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( ):返回按鈕的顯示標(biāo)題
?。?)public void setLabel(String label):設(shè)置按鈕上的顯示標(biāo)題
例:String s=b2.getLabel(); //獲得b2按鈕的標(biāo)題“確定”
b1.setLabel(s); // 將b1按鈕的標(biāo)題改為s 值“確定”
add(b1);
8.1.3 選項(xiàng)框(Choice)(下拉列表框)
1.創(chuàng)建選項(xiàng)框
每次只能選擇其中的一項(xiàng)。
2.選項(xiàng)框的常用方法
?。?)public void addItem(String item):向選項(xiàng)框中加入選項(xiàng)item
?。?)public int countItems( ):返回選項(xiàng)框中的選項(xiàng)個(gè)數(shù)(此方法已不用)
改為:getItemCount( ):
?。?)public String getItem(int index):返回指定下標(biāo)值的某個(gè)選項(xiàng)
?。?)public int getSelectedIndex( ):返回被選中的選項(xiàng)的下標(biāo)值
?。?)public String getSelectedItem( ):返回被選中的選項(xiàng)
?。?)public void select(int pos):選擇指定下標(biāo)值的選項(xiàng)
(7)public void select(String str):選擇指定的選項(xiàng)
?。?)Choice( ):構(gòu)造一下拉選項(xiàng)框
?。?)public void add(String item):向選項(xiàng)框中加入選項(xiàng)item,同(1)
(10)public void insert(String item,int index):在指定位置插入選項(xiàng)
?。?1)public void remove(int index):刪除指定位置選項(xiàng)
?。?2)public void remove(String item):刪除指定字符串
(13)public void removeAll( ):刪除所有選項(xiàng)
?。?4)public Object[] getSelectedObject( ):返回當(dāng)前選中項(xiàng)的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(); //標(biāo)簽對(duì)象L1
Label L2=new Label();
Choice c=new Choice(); //下拉列表對(duì)象c
public void init(){
for(int i=0;i<6;i++)
c.addItem(description[i]); //將description數(shù)組內(nèi)容作為選項(xiàng)加入
L1.setText(c.getItem(2)); //將標(biāo)簽顯示成“yellow”
c.addItem("紅色"); //在最后加入"紅色"選項(xiàng),同c.add("紅色");
String s=Integer.toString(c.getItemCount()); //獲得下拉列表選項(xiàng)數(shù) 7個(gè)
L2.setText(s); //標(biāo)簽L2顯示s值
c.insert("蘭",1); //在1的位置插入"蘭"選項(xiàng),"blue"等往后退
c.select(3); //將第3選項(xiàng)"yellow"設(shè)為當(dāng)前選項(xiàng)
c.remove(4); //將第4選項(xiàng)"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(); //下拉列表對(duì)象c
public void init()
{ t.setEditable(false); //設(shè)置文本區(qū)域?yàn)椴豢删庉?,用戶不可輸入?nèi)容
for(int i=0;i<9;i++)
c.addItem(description[i]); //將description數(shù)組內(nèi)容作為選項(xiàng)加入
add(t); add(c);
c.addItemListener(this);}
public void itemStateChanged(ItemEvent e)
{t.append("\n"+"index: "+ c.getSelectedIndex()+ "\n"+c.getSelectedItem()+ "is selected");}}
//將所選擇的序號(hào)和內(nèi)容顯示在文本區(qū)域中
8.1.4 復(fù)選框(Checkbox)和選項(xiàng)按鈕(CheckboxGroup)
1.創(chuàng)建復(fù)選框
復(fù)選框構(gòu)造方法:
Checkbox( ):創(chuàng)建一個(gè)無(wú)顯示內(nèi)容的復(fù)選框
Checkbox(String label):創(chuàng)建一個(gè)指定顯示內(nèi)容的復(fù)選框
CheckboxGroup( ):創(chuàng)建一個(gè)選項(xiàng)組
Checkbox(String label,CheckboxGroup cbGroup,boolean state):
創(chuàng)建一個(gè)指定顯示內(nèi)容字符串,屬于選項(xiàng)按鈕組cbGroup且狀態(tài)為state的選項(xiàng)按鈕
復(fù)選框和選項(xiàng)按鈕常用方法:
public void setLabel(String label):設(shè)置復(fù)選框或選項(xiàng)按鈕的標(biāo)簽為label
public void setState(boolean state):設(shè)置復(fù)選框或選項(xiàng)按鈕的狀態(tài)
public boolean getState( ):獲得復(fù)選框或選項(xiàng)按鈕的狀態(tài)
public String getLabel( ):獲得復(fù)選框或選項(xiàng)按鈕的標(biāo)簽
例: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復(fù)選框,標(biāo)簽是"小肥牛"
Checkbox c2=new Checkbox("小肥羊");
Checkbox c3=new Checkbox("蜀王");
p1.add(c1); p1.add(c2); p1.add(c3);
Choice c=new Choice(); //新建下拉列表對(duì)象c
c.add(c1.getLabel()); //將c1復(fù)選框的標(biāo)簽加入到c的下拉列表框中
c.add(c2.getLabel());
c.add(c3.getLabel());
p1.add(c);
c1.setLabel("金滿樓"); //將c1的標(biāo)簽改為“金滿樓”
c2.setState(true); //設(shè)置c2的狀態(tài)為選中
f.add(p1); f.pack(); f.show();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0); } }); } }
運(yùn)行結(jié)果:
2.選項(xiàng)按鈕
選項(xiàng)按鈕構(gòu)造方法: CheckboxGroup( )
常用方法:
public CheckboxGroup getCheckboxGroup( ):返回選項(xiàng)按鈕所屬的復(fù)選框組
public void setCheckboxGroup(CheckboxGroup g ):設(shè)置選項(xiàng)按鈕所屬的復(fù)選框組
注:要生成選項(xiàng)按鈕,必須先生成一個(gè)類CheckboxGroup的對(duì)象:
CheckboxGroup c=new CheckboxGroup( );
然后再使用下面語(yǔ)句:
Checkbox c1=new Checkbox(“Label”,c,false);
第一參數(shù)是選項(xiàng)按鈕的標(biāo)簽,第二個(gè)是按鈕組對(duì)象,第三個(gè)是狀態(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)
構(gòu)造方法:
List( ) :新建一個(gè)空的列表框
List(int i ,boolean b) :新建一個(gè)指定行數(shù)i的列表框,b為true表示可以多選,false則只能單選;
常用成員方法:
public int getItemCount( ) :返回列表內(nèi)的項(xiàng)目數(shù)//現(xiàn)改為getItemCount()
public String getItem(int index):返回下標(biāo)為index指定的列表項(xiàng)
public synchronized void add(String item):增加一項(xiàng)item
public synchronized void addItem(String item):同上
public synchronized void removeAll( ):清空列表
public synchronized void remove(int index):刪除指定下標(biāo)項(xiàng)
public synchronized void remove(String item):刪除指定選項(xiàng)
public synchronized int getSelectedIndex( ):獲取選定項(xiàng)的下標(biāo)
public synchronized int[] getSelectedIndexs( ):獲取多個(gè)選定項(xiàng)的下標(biāo)
public synchronized String getSelectedItem( ): 獲取選定項(xiàng)內(nèi)容
public synchronized String[] getSelectedItems( ): 獲取多個(gè)選定項(xiàng)內(nèi)容
public synchronized void select(int index ): 選定指定下標(biāo)的項(xiàng)
public synchronized void deselect(int index ): 取消對(duì)指定下標(biāo)項(xiàng)的選擇
public synchronized boolean isIndexSelected(int index ): 判斷指定下標(biāo)項(xiàng)是否被選擇
public boolean isMultipleMode( ): 判斷列表是否支持多行選擇
public void setMultipleMode(boolean bl ): 設(shè)置列表是否支持多行選擇
例:
8.1.6 單行文本框(TextField)
文本框的構(gòu)造方法
?。?)TextField( ):創(chuàng)建一個(gè)默認(rèn)長(zhǎng)度的文本框
(2)TextField( int columns):創(chuàng)建一個(gè)列數(shù)是columns的文本框(即寬度)
?。?)TextField(String text ):創(chuàng)建一個(gè)帶有初始文本內(nèi)容的文本框
?。?)TextField(String text,int columns ):創(chuàng)建一個(gè)帶有初始文本內(nèi)容并具有指定列數(shù)的文本框
文本框的常用方法
(1)public void setEchoChar(char c):設(shè)定用戶輸入字符的回顯字符
(2)public void setText(String t) :設(shè)定文本框的文本內(nèi)容
(3)public String getText( ) :返回文本框中的文本內(nèi)容
(4)public void setEditable(boolean b) :設(shè)定文本框是否只讀屬性,false為只讀
(5)public int getColumns( ) :返回文本框的列數(shù)
(6)public void setColumns( ) :設(shè)置文本框的列數(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個(gè)漢字
t3=new TextField("網(wǎng)絡(luò)");
t4=new TextField("計(jì)算機(jī)",2); //只顯示出“計(jì)算”
add(t1);add(t2);add(t3);add(t4); add(l1);
L1.setText(t4.getText()); //L1獲得t4的內(nèi)容
t1.setEchoChar('*'); //設(shè)置掩碼為“*”
t2.setText("Java!"); // 將t2內(nèi)容改為“Java!!!”
t3.setEditable(false); }} // 將t3設(shè)為只讀
8.1.7 文本區(qū)(TextArea)
文本區(qū)的構(gòu)造方法
(1)TextArea( ):創(chuàng)建一個(gè)默認(rèn)大小的文本區(qū)
(2)TextArea(int rows,int columns):創(chuàng)建一個(gè)指定行和列數(shù)的文本區(qū)
(3)TextArea(String text):創(chuàng)建一個(gè)帶有初始文本內(nèi)容的文本區(qū)
(4)TextArea(String text,int rows,int columns):創(chuàng)建一個(gè)帶有初始文本內(nèi)容并具有指定行和列數(shù)的文本區(qū)
(5)TextArea(String text,int rows,int columns,int scrollbars):在(4)的基礎(chǔ)上添加滾動(dòng)條,scrollbars取值:1(SCROLLBARS_VERTICAL_ONLY)(僅有垂直),2(SCROLLBARS_HORIZONTAL_ONLY)(僅有水平),3(SCROLLBARS_NONE)(無(wú)滾動(dòng)條),4(SCROLLBARS_BOTH)(水平、垂直均有)(除1,2,3數(shù)字以外均都有水平垂直滾動(dòng)條)
文本區(qū)的常用方法
(1)public void append(Sting str):在文本區(qū)尾部添加文本
(2)public void insert(String str,int pos):在文本區(qū)指定位置插入文本
(3)public void setText(String t):設(shè)定文本區(qū)內(nèi)容
(4)public int getRows( ):返回文本區(qū)的行數(shù)
(5)public void setRows(int rows):設(shè)定文本區(qū)的行數(shù)
(6)public int getColumns( ):返回文本區(qū)的列數(shù)
(7)public void setColumns(int Columns):設(shè)定文本區(qū)的列數(shù)
(8)public void setEditable(boolean b):設(shè)定文本區(qū)是否只讀屬性
(9)public void replaceRange(String str,int start,int end):從start到end的文本替換為str的內(nèi)容
例: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)絡(luò)專業(yè)"); //a2后追加“網(wǎng)絡(luò)專業(yè)”(\n換行)
a3.setEditable(false); // 將a3設(shè)為只讀
a3.insert("園林",2); //在第2個(gè)字符插入“園林”
a4.replaceRange("安慶",2,4); //將a4文本區(qū)中第2~4的字符改為“安慶”
add(a1);add(a2);add(a3);add(a4); } }
8.2 組件布局管理
布局:就是容器中組件的擺放方式,常用的布局管理器有:
1.FlowLayout(順序)(默認(rèn)):
將組件依次擺放,每個(gè)組件若不設(shè)置其大小都將被壓縮到最小尺寸。
2.BorderLayout(邊界布局):
將組件按north,south,west,east,center五個(gè)位置來(lái)擺放。
3.CardLayout(卡片布局):
前后依次排列,每次只顯示一個(gè)卡片。
4.GridLayout(網(wǎng)格布局):
將顯示區(qū)域劃分為若干行列,每個(gè)組件占一格。
8.2.1 順序布局(FlowLayout)
構(gòu)造函數(shù):
FlowLayout( ):建立一個(gè)新的FlowLayout布局,默認(rèn)居中對(duì)齊,組件間有5個(gè)單位的水平和垂直間距。
FlowLayout(int align ):按align建立一個(gè)新的FlowLayout布局,默認(rèn)居中對(duì)齊,組件間有5個(gè)單位的水平和垂直間距。
FlowLayout(int align,int h,int v):按align建立一個(gè)新的FlowLayout布局,齊,組件間有h水平和v垂直間距。
FlowLayout共有5種排列方式CENTER(中)、LEFT(左)、RIGHT(右)、LEADING(頭)、TAILING(尾)。
8.2.2 邊界布局(BorderLayout)
構(gòu)造函數(shù):
BorderLayout( ):建立一個(gè)組件間沒(méi)有間距的BorderLayout
BorderLayout(int h,int v):建立一個(gè)組件間有間距的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)); //設(shè)置為邊界布局,間距為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)
構(gòu)造函數(shù):
CardLayout( ):
建立組件間沒(méi)有水平與垂直間距的、新的CardLayout。
CardLayout( ):建立組件間沒(méi)有水平間距為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("卡片號(hào)為:"+i)); }
card.show(this,String.valueOf(2)); } }
8.2.4 網(wǎng)格布局(GridLayout)
構(gòu)造函數(shù):
GridLayout( ):建立一個(gè)新的默認(rèn)是1行1列的GridLayout
GridLayout(int r,int c):建立一個(gè)r行c列的GridLayout
GridLayout(int r,int c,int h,int v):建立一個(gè)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)); // 設(shè)置3行3列共9個(gè)網(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()); // 加一個(gè)空標(biāo)簽
add(b4);add(b5);add(b6);
add(new Label("label2")); } }
網(wǎng)袋布局(GridBagLayout)(補(bǔ)充)
網(wǎng)袋布局管理器中引入了一個(gè)輔助類GirdBagConstraints類,它可以指定構(gòu)件的3個(gè)信息:
(1)構(gòu)件單元在容器中的大小和位置,其高度和寬度可能占幾個(gè)行和列。
(2)單元中構(gòu)件的大小和位置
(3)容器縮放時(shí),單元發(fā)生的變化。
設(shè)置構(gòu)件的大小、位置信息,要按如下步驟進(jìn)行:
(1)創(chuàng)建一個(gè)GridBagConstraints類的對(duì)象(如果沒(méi)有的話)
(2)按照此構(gòu)件的大小、位置信息設(shè)置此對(duì)象的各實(shí)例變量的值。
(3)調(diào)用GridBagLayout的setConstraints方法設(shè)置此構(gòu)件的大小和位置信息,GridBagConstraint對(duì)象可以一次創(chuàng)建、多次使用。
構(gòu)造函數(shù)
GridBagLayout():建立一個(gè)新的GridBagLayout
GridBagConstraints():建立一個(gè)新的GridBagConstraints對(duì)象
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對(duì)象。其中:
* gridwidth和gridheight:用來(lái)設(shè)置組件所占的單位長(zhǎng)度和高度,默認(rèn)為1。
* Weightx和weighty:用來(lái)設(shè)置當(dāng)窗口變大時(shí),組件跟著變大的比例,默認(rèn)為0,最大為1。數(shù)字越大表示組件變大的比例越大
* anchor:當(dāng)兩個(gè)組件大不不同時(shí),相對(duì)于大組件來(lái)說(shuō)小的放在什么位置,一共有9個(gè)值:CENTER(默認(rèn))、NORTH、NORTHEAST、EAST、SOUTHEAST、SOUTH、SOUTHWEST、WEST、NORTHWEST。
* Fill:當(dāng)組件所處的位置有剩余空間時(shí),此參數(shù)設(shè)置為將組件填滿的方向,一共有4個(gè)值:NONE(默認(rèn))、VERTICAL、HORIZONTAL、BOTH。
* insets:設(shè)置組件間彼此的間距,有4個(gè)參數(shù)分別表示組件上、左、下、右4個(gè)方向的間距,默認(rèn)為(0,0,0,0)
* ipadx和ipady:設(shè)置組件邊框離組件中心的距離,也就是組件的大小,默認(rèn)為0。
8.2.5 面板(Panel)的使用
面板是一個(gè)無(wú)邊框的容器,可以包容其他組件或另一個(gè)面板。面板目的是為了分層次、分區(qū)域管理各種組件。面板實(shí)際上是一個(gè)必須放在大容器(Applet或Frame)中的小容器。
例P173:import java.awt.*;
import java.applet.Applet;
public class SC extends Applet{
public void init(){
setLayout(new BorderLayout());
setForeground(Color.black); //設(shè)置前景色
setFont(new Font("Arial",Font.PLAIN,20)); //設(shè)置字體,風(fēng)格,字號(hào)
add("North",new Label("我在Applet中",Label.CENTER));
Panel panel1=new Panel();
add("West",panel1); //在西邊加入panel1對(duì)象
panel1.setBackground(Color.blue); //設(shè)置panel1的背景色
panel1.setForeground(Color.red);
panel1.setLayout(new BorderLayout()); //在panel1中設(shè)置新布局
panel1.add("East",new Button("東"));
panel1.add("West",new Button("西"));
panel1.add("Center",new Label("我在Panel1中"));
Panel panel2=new Panel();
add("East",panel2); ////在總布局的東邊加入panel2對(duì)象
panel2.setBackground(Color.green);
panel2.setLayout(new BorderLayout());
panel2.add("North",new Label("我在Panel2中"));
panel2.add("South",new Button("我在Panel2中")); }}
當(dāng)容器中的組件較多時(shí),用一個(gè)布局管理器來(lái)管理容器的所有組件就有局限,但一個(gè)容器又只能有一個(gè)布局管理器,可以通過(guò)疊加多個(gè)透明容器(如Panel)來(lái)實(shí)現(xiàn)。
面板和組件的常用方法:
> Panel( ):用默認(rèn)布局方式創(chuàng)建一個(gè)面板
> Panel(LayoutManager layout):用指定布局方式創(chuàng)建一個(gè)面板
> public Component add(Component comp):為容器添加一個(gè)組件
> public Component add(Component comp,int index):將組件添加到隊(duì)列的指定位置
> public void add(Component comp,Object constraints):按照限制條件添加組件
> public void remove(Component comp):去除指定組件
> public void setFont(font f):設(shè)定組件的字體
> public void setSize(Dimension d):設(shè)定組件的寬和高
> public void setVisible(boolean b):設(shè)定組件是否可見(jiàn)
> public void setLocation(int x,int y):以設(shè)定組件的位置
> public void setBackground(Color c):設(shè)定組件的背景色
> public void setForeground(Color c):設(shè)定組件的前景色
> public void setBounds(int x,int y,int widty,int height):設(shè)定組件的位置和大小
> public void setName(String name):設(shè)定組件的名稱
> public String getName():返回組件的名稱
> public int getX():返回組件的X坐標(biāo)
> public int getY():返回組件的Y坐標(biāo)
> public int getHeight():返回組件的高
> public int getWidth():返回組件的寬
> public void paint(Graphics g):畫出容器
> public void update(Graphics g):用背景色清除組件,設(shè)定畫筆為前景色,調(diào)用paint方法重畫組件。
> Public void repaint():立即調(diào)用組件的update方法
8.2.6 手工布局
Java允許使用手工布局放置各個(gè)組件,這種方法比較靈活,但用戶必須使用setLocation()、setSize()、setBounds()等方法為組件設(shè)置大小和在容器中的位置,且使得策略模式的優(yōu)點(diǎn)將被全部忽略,容器能應(yīng)付調(diào)整大小的事件,代碼的可重用性也大大降低,還會(huì)導(dǎo)致程序的系統(tǒng)相關(guān)。
首先:setLayout(null);語(yǔ)句關(guān)閉默認(rèn)的布局管理器
例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通過(guò)委托型事件處理機(jī)制解決如何對(duì)事件作出響應(yīng)的問(wèn)題
8.3.2 Java的事件處理機(jī)制
能產(chǎn)生事件的組件叫做事件源(如按鈕),可給事件源注冊(cè)一個(gè)事件監(jiān)聽(tīng)器,當(dāng)事件源發(fā)生事件時(shí),事件監(jiān)聽(tīng)器就代替事件源對(duì)發(fā)生的事件進(jìn)行處理,這就是所謂的委托事件處理機(jī)制。
注意:事件監(jiān)聽(tīng)器不一定是包容事件源的容器對(duì)象,只要一個(gè)對(duì)象實(shí)現(xiàn)了事件監(jiān)聽(tīng)器接口就能成為事件監(jiān)聽(tīng)器。這樣處理可使程序中的事件處理代碼與GUI代碼分離,有利于優(yōu)化程序結(jié)構(gòu)。
在程序中編寫“事件處理”程序段時(shí),通??梢苑譃橐韵聨讉€(gè)步驟:
(1)確定事件類型
(2)為部件增加一個(gè)該事件的監(jiān)測(cè)器:通常名為XXXListener。這些接口包含在java.awt.event和javax.swing.event包中
(3)增加事件處理程序
總體來(lái)說(shuō),Java事件處理有3部分主要內(nèi)容:
事件對(duì)象:表示事件的內(nèi)容
事件源:哪個(gè)控件上發(fā)生了事件
Listener:事件發(fā)生了誰(shuí)來(lái)處理
表8.1 Java事件類、對(duì)應(yīng)接口及接口中的方法 P177
ActionEvent一些常用方法:
(1)public String getActionCommand( ):返回事件源的標(biāo)簽
(2)public Object getSource( ):返回產(chǎn)生事件的對(duì)象名
(3)public int getModifiers( ):返回事件發(fā)生時(shí)功能控制鍵的狀態(tài),它們可能是功能鍵常數(shù):SHIFT_MASK、CTRL_MASK、ALT_MASK
表8.1 Java事件類、對(duì)應(yīng)接口及接口中的方法
事件類/接口名稱
接口的方法及產(chǎn)生事件的用戶操作
ActionEvent單擊事件類
ActionListener單擊事件接口
actionPerformed(ActionEvent e) 單擊按鈕、文本行中單擊鼠標(biāo)、雙擊列表框選項(xiàng)
ComponentEvent組件事件類
ComponentListener接口
componentMoved(ComponentEvent e)移動(dòng)組件時(shí)
componentHidden(ComponentEvent e)隱藏組件時(shí)
componentResized(ComponentEvent e)改變組件大小時(shí)
componentShown(ComponentEvent e)顯示組件時(shí)
ContainerEvent容器事件類
ContainerListener接口
componentAdded(ContainerEvent e)添加組件時(shí)
componentRemoved(ContainerEvent e)添加組件時(shí)
FocusEvent焦點(diǎn)事件類
FocusListener接口
focusGained(FocusEvent e)獲得焦點(diǎn)時(shí)
focusLost(FocusEvent e)失去焦點(diǎn)時(shí)
ItemEvent選擇事件類
ItemListener接口
itemStateChanged(ItemEvent e)選擇復(fù)選框、選項(xiàng)框、單擊列表框、選中帶復(fù)選框的菜單項(xiàng)
KeyEvent鍵盤擊鍵事件類
KeyListener接口
keyPressed(KeyEvent e)按下鍵盤時(shí)
keyReleased(KeyEvent e)釋放鍵盤時(shí)
MouseEvent鼠標(biāo)事件類
MouseListener鼠標(biāo)按鈕事件接口
mouseClicked(MouseEvent e)單擊鼠標(biāo)時(shí)
mouseEntered(MouseEvent e)鼠標(biāo)進(jìn)入時(shí)
mouseExited(MouseEvent e)鼠標(biāo)離開(kāi)時(shí)
mousePressed(MouseEvent e)按下鼠標(biāo)時(shí)
mouseReleased(MouseEvent e)放開(kāi)鼠標(biāo)時(shí)
MouseEvent鼠標(biāo)事件類
MouseMotionListener接口
mouseDragged(MouseEvent e)拖拽鼠標(biāo)時(shí)
mouseMoved(MouseEvent e)鼠標(biāo)移動(dòng)時(shí)
TextEvent文本事件類
TextListener接口
textValueChanged(TextEvent e)
文本行、文本區(qū)中修改內(nèi)容時(shí)
WindowEvent窗口事件類
WindowListener接口
windowsOpened(WindowEvent e)打開(kāi)窗口時(shí)
windowsClosed(WindowEvent e)關(guān)閉窗口后
windowsClosing(WindowEvent e)關(guān)閉窗口時(shí)
windowsActivated(WindowEvent e)激活窗口時(shí)
windowsDeactivated(WindowEvent e)窗口失去焦點(diǎn)時(shí)
windowsIconified(WindowEvent e)窗口縮小為圖標(biāo)時(shí)
windowsDeiconified(WindowEvent e)窗口復(fù)原時(shí)
例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("這是一個(gè)選項(xiàng)事件例子"));
add(area);
add(new Label(" 請(qǐng)選擇中國(guó)的大城市:"));
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("請(qǐng)選擇中國(guó)最大的城市:"));
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()選項(xiàng)標(biāo)簽
8.3.4 事件適配器類與類的包容
在java.awt.event包中還聲明了一組帶Adapter標(biāo)記的類,稱為適配器類,它們是一些抽象類,其中聲明的方法與相應(yīng)的接口的方法完全相同,也是空方法,但在使用它們繼承創(chuàng)建新類時(shí),可以不實(shí)現(xiàn)所有的方法,只要實(shí)現(xiàn)需要的方法即可。
例如:class EnclosingClass{
……
static class NestedClass{……}
class InnerClass{……}
}
被包容的類可以無(wú)條件地使用包容它的類的所有成員,包括私有成員,被包容的類的作用域僅限于包容它的類
和類的其他成員一樣,被包容的類可以被聲明為靜態(tài)類,非靜態(tài)被包容類稱為內(nèi)部類(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(); } } }
作業(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("喜歡的活動(dòng):");
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("聽(tīng)音樂(lè)");
l.add("看電視");
l.add("看電影");
l.add("看小說(shuō)");
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("喜歡的活動(dòng):"+l.getSelectedItem());
}
}