面向?qū)ο蟮某绦蛟O(shè)計(jì)java張白一第三版第10章_第1頁(yè)
面向?qū)ο蟮某绦蛟O(shè)計(jì)java張白一第三版第10章_第2頁(yè)
面向?qū)ο蟮某绦蛟O(shè)計(jì)java張白一第三版第10章_第3頁(yè)
面向?qū)ο蟮某绦蛟O(shè)計(jì)java張白一第三版第10章_第4頁(yè)
面向?qū)ο蟮某绦蛟O(shè)計(jì)java張白一第三版第10章_第5頁(yè)
已閱讀5頁(yè),還剩137頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第10章常用組件GUI設(shè)計(jì)10.1布局管理器10.2窗口與面板容器10.3事件響應(yīng)原理10.4JLable組件10.5JButton組件與JToggleButton組件10.6JCheckBox和JRadioButton組件10.7JComboBox組件10.8JList組件10.9JTextField與JTextArea組件10.1布?局?管?理?器

Java程序的GUI界面定義是由AWT類和Swing類來(lái)完成的。Java在布局管理上采用了容器和布局管理相分離的方案。也就是說(shuō),容器只管將組件放入其中,而不管這些組件放置在容器中的位置和大小,而將布局的管理任務(wù)交給專門的布局管理器接口類(LayoutManager)的實(shí)現(xiàn)類來(lái)完成。每個(gè)容器都有一個(gè)缺省的布局管理器,當(dāng)容器需要對(duì)某個(gè)組件進(jìn)行定位或判斷其尺寸大小時(shí),就會(huì)調(diào)用其相應(yīng)的布局管理器。當(dāng)然也可以不用缺省的布局管理器,而是通過(guò)setLayout(?)方法來(lái)為其指定新的布局管理器。一旦確定了布局管理方式,容器的組件就可以使用add(?)方法加入組件了。包中共定義了五種布局管理器類,分別是BorderLayout、FlowLayout、CardLayout、GridLayout和GridBagLayout。這五個(gè)類都是類的直接子類,且每個(gè)布局管理器對(duì)應(yīng)一種布局策略。

包中定義了4種布局管理器,分別是BoxLayout、ScrollPaneLayout、ViewportLayout和OverlayLayout。

下面介紹BorderLayout、FlowLayout、CardLayout、GridLayout和BoxLayout這幾種常用的布局策略。

類是類的直接子類。BorderLayout的布局策略是把容器內(nèi)的空間劃分為如圖所示的東、西、南、北、中五個(gè)區(qū)域。每個(gè)區(qū)域最多只能包含一個(gè)組件,并通過(guò)相應(yīng)的常量NORTH、SOUTH、EAST、WEST、CENTER進(jìn)行標(biāo)識(shí)。BorderLayout是JApplet的默認(rèn)布局模式。布局方式是根據(jù)組件大小和容器大小的約束對(duì)組件進(jìn)行布局。NORTH和SOUTH組件可以在水平方向上拉伸,而EAST和WEST組件可以在垂直方向上拉伸,CENTER組件在水平和垂直方向上都可拉伸,從而填充所有剩余空間。如果某個(gè)區(qū)域沒(méi)有分配組件,則其他組件可以占據(jù)它的空間。圖10.1BorderLayout布局策略BorderLayout類有兩個(gè)構(gòu)造方法。

(1)BorderLayout(?)方法:用于創(chuàng)建一個(gè)各組件間的水平、垂直間隔均為0的BorderLayout類的對(duì)象。

(2)?BorderLayout(inthgap,intvgap)方法:用于創(chuàng)建一個(gè)各組件間的水平間隔為hgap、垂直間隔為vgap的BorderLayout類的對(duì)象。

BorderLayout僅指定了五個(gè)區(qū)域的位置,如果容器中需要加入的組件超過(guò)五個(gè),就必須使用容器的嵌套或改用其他的布局策略。

【示例程序C10_1.java】使用BorderLayout的布局策略在五個(gè)位置分別加入四個(gè)按鈕和一個(gè)標(biāo)簽,當(dāng)點(diǎn)擊按鈕時(shí),標(biāo)簽的文本就是按鈕的標(biāo)簽的文本。import.*;

import.*;

publicclassC10_1extendsJApplet

{Containercp=getContentPane();

publicvoidinit(?){

cp.add(newJButton(“North”),);

cp.add(newJButton(“South”),);

cp.add(newJButton(“East”),);

cp.add(newJButton(“West”),);

cp.add(newJButton(“Center”),);

}

}

該程序的運(yùn)行結(jié)果如圖所示。圖10.2程序C10_1運(yùn)行結(jié)果程序說(shuō)明:

(1)“Containercp=getContentPane(?);”語(yǔ)句表示創(chuàng)建一個(gè)返回此窗體的contentPane對(duì)象。該對(duì)象的布局為BorderLayout。

(2)“cp.add(newJButton("North"),);”語(yǔ)句表示容器按照BorderLayout的布局策略,創(chuàng)建一個(gè)標(biāo)簽為“North”的按鈕對(duì)象,將其添加到的NORTH區(qū)域。add(?)方法是Container類提供的方法,表示將組件添加到容器中。

注意:若沒(méi)有設(shè)置組件的相關(guān)位置,BorderLayout將以Center作為默認(rèn)值。當(dāng)兩個(gè)組件被安排在相同位置時(shí),將會(huì)出現(xiàn)位置錯(cuò)誤,但系統(tǒng)不給予提示。10.1.2FlowLayout

類是類的直接子類。FlowLayout的布局策略是按照加入容器中的組件的先后順序從左向右排列,當(dāng)一行排滿之后就轉(zhuǎn)到下一行繼續(xù)從左至右排列,每一行中的組件都居中排列。FlowLayout是Applet缺省使用的布局編輯模式。

FlowLayout類有三個(gè)構(gòu)造方法。

(1)?FlowLayout(?)方法:用于創(chuàng)建一個(gè)版面設(shè)定為居中對(duì)齊、各組件的水平及垂直間隔為5個(gè)像素點(diǎn)的FlowLayout類的對(duì)象。(2)?FlowLayout(intalign)方法:用于創(chuàng)建一個(gè)版面按給出的align值對(duì)齊,各組件的水平及垂直間隔為5個(gè)像素的對(duì)象。align的值可以是1或(居中對(duì)齊)、2或(右對(duì)齊)、3或(左對(duì)齊)方式。

(3)?FlowLayout(intalign,inthgap,intvgap)方法:用于創(chuàng)建一個(gè)既指定對(duì)齊方式,又指定組件間間隔的FlowLayout類的對(duì)象。參數(shù)align的作用及取值同上,參數(shù)hgap指定組件間的水平間隔,參數(shù)vgap指定各組件間的垂直間隔,間隔單位為像素點(diǎn)值。對(duì)于一個(gè)原本不使用FlowLayout布局編輯器的容器,若需要使用該布局策略,可以用setLayout(newFlowLayout(?))方法設(shè)置。該方法是所有容器的父類Container的方法,用于為容器設(shè)定布局編輯器。

【示例程序C10_2.java】使用FlowLayout的布局策略,在容器中放入三個(gè)按鈕。

import.*;

import.*;

publicclassC10_2extendsJApplet

{Containercp=getContentPane(?); //創(chuàng)建一個(gè)返回此窗體的ContentPane對(duì)象

JButtonbutton1,button2,button3;publicvoidinit(?){

cp.setLayout(newFlowLayout(?)); //設(shè)置容器的布局為FlowLayout策略

button1=newJButton(“Ok”);

button2=newJButton(“Open”);

button3=newJButton(“Close”);

cp.add(button1);

cp.add(button2);

cp.add(button3);

}

}

該程序的運(yùn)行結(jié)果如圖所示。圖是使用FlowLayout(3)構(gòu)造方法的效果。圖10.3程序C10_2運(yùn)行結(jié)果圖10.4使用FlowLayout(3)時(shí)的情況10.1.3CardLayout

CardLayout的版面布局方式是將每個(gè)組件看成一張卡片,如同撲克牌一樣將組件堆疊起來(lái),而每次顯示在屏幕上的只能是最上面的一個(gè)組件,這個(gè)被顯示的組件將占據(jù)所有的容器空間。當(dāng)容器第一次顯示時(shí),第一個(gè)添加到CardLayout對(duì)象的組件為可見(jiàn)組件。程序中可通過(guò)表所示的方法選擇顯示其中的卡片。表10.1CardLayout類的常用成員方法

CardLayout類有兩個(gè)構(gòu)造方法。

(1)?CardLayout(?)方法:使用默認(rèn)(間隔為0)方式創(chuàng)建一個(gè)CardLayout(?)類對(duì)象。

(2)?CardLayout(inthgap,intvgap)方法:使用hgap指定的水平間隔和vgap指定的垂直間隔創(chuàng)建一個(gè)CardLayout(?)類對(duì)象。

CardLayout類的常用成員方法見(jiàn)表。

【示例程序C10_3.java】使用CardLayout的布局在容器中放入三個(gè)按鈕,顯示第二個(gè)按鈕。import.*;

import.*;

publicclassC10_3extendsJApplet

{JButtonbt1=newJButton("按鈕A");

JButtonbt2=newJButton("按鈕B");

JButtonbt3=newJButton("按鈕C");

Containercp=getContentPane(?);

//設(shè)置CardLayout布局

CardLayoutcard=newCardLayout(20,20);

publicvoidinit(?)

{cp.setLayout(card);

cp.add("a",bt1);cp.add(“b”,bt2);cp.add(“c”,bt3);

card.next(cp);//顯示按鈕B

}

}

該程序的運(yùn)行結(jié)果如圖所示。

注意:在程序中語(yǔ)句“add("a",bt1);”中的字符串“a”是為組件分配的字符串名字,其目的是讓布局管理器根據(jù)名字調(diào)用要顯示的組件。圖10.5程C10_3的運(yùn)行結(jié)果10.1.4GridLayout

如果界面上需要放置的組件較多,且這些組件的大小又基本一致(例如計(jì)算器、遙控器的面板)時(shí),使用GridLayout的布局策略是最佳的選擇。GridLayout的布局策略是把容器分成大小相等的矩形,一個(gè)矩形中放置一個(gè)組件,而每個(gè)組件按添加的順序從左向右、從上向下地占據(jù)這些網(wǎng)格。

GridLayout類有三種構(gòu)造方法。

(1)?GridLayout(?)方法:按默認(rèn)(1行1列)方式創(chuàng)建一個(gè)GridLayout布局。

(2)?GridLayout(introws,intcols)方法:創(chuàng)建一個(gè)具有rows行、cols列的GridLayout布局。(3)?GridLayout(introws,intcols,inthgap,intvgap)方法:按指定的行數(shù)rows、列數(shù)cols、水平間隔hgap和垂直間隔vgap創(chuàng)建一個(gè)GridLayout布局。

【示例程序C10_4.java】使用GridLayout的布局策略,在容器中放入4個(gè)按鈕。

import.*;

import.*;

publicclassC10_4extendsJApplet

{JButtonbt1=newJButton(“按鈕A”);

JButtonbt2=newJButton(“按鈕B”);

Containercp=getContentPane();

//設(shè)置GridLayout布局GridLayoutgrid=newGridLayout(2,2,20,30);

publicvoidinit()

{cp.setLayout(grid);

cp.add(bt1);

cp.add(bt2);

cp.add(newJButton(“按鈕C”));

cp.add(newJButton(“按鈕D”));

}

}

該程序的運(yùn)行結(jié)果如圖所示。圖10.6程序C10_4的運(yùn)行結(jié)果10.1.5BoxLayout

BoxLayout是Swing所提供的布局管理器,它的繼承關(guān)系如下:

BoxLayout只有兩種排列方式,一種是水平方式,另一種是垂直方式。我們可以使用BoxLayout所提供的兩個(gè)常量X_AXIS、Y_AXIS來(lái)指明組件在容器中是水平還是垂直排列的。BoxLayout類與Box類結(jié)合,可以提供多樣化的布局。通常的做法是使用若干個(gè)Box容器,由于Box容器的默認(rèn)布局是BoxLayout,而且只能使用這個(gè)布局,因此,每一個(gè)Box容器中組件的排列方式也只能按水平或垂直方式排列。1.BoxLayout和Box的構(gòu)造函數(shù)

創(chuàng)建BoxLayout類的對(duì)象的構(gòu)造方法是:

BoxLayout(Containertarget,intaxis)

其中,target是容器對(duì)象;axis指明target中組件的排列方式,其值可為表示水平排列的,或?yàn)楸硎敬怪迸帕械摹?/p>

Box類的構(gòu)造方法是:

Box(intaxis)

這個(gè)構(gòu)造方法中的axis參數(shù)用以指定Box中的組件是按水平還是垂直方式排列的。axis的值可以用或指定,也可使用Box類提供的兩個(gè)方法creatHorizontalBox(?)與creatVerticalBox(?)來(lái)指定。2.BoxLayout類和Box類的常用成員方法

表列出了BoxLayout類和Box類的常用成員方法。

為方便布局管理,Box類還提供了4種透明組件Glue、Strut、Rigid和Filler,可以將這些透明組件插入其他組件的中間,使各個(gè)組件產(chǎn)生分開(kāi)的效果。這4種透明組件的作用分別如下。

(1)?Glue:將Glue兩邊的組件擠到容器的兩端。

(2)?Strut:將Strut兩端的組件按水平或垂直方向指定的大小分開(kāi)。表10.2BoxLayout類和Box類的常用成員方法

(3)?Rigid:可以設(shè)置二維的限制,將組件按水平或垂直方向指定的大小分開(kāi)。

(4)?Filler:不僅可以設(shè)置二維的限制,將組件按水平或垂直方向指定的大小分開(kāi),而且還可以設(shè)置最大、較佳、最小的長(zhǎng)寬大小。

這4種組件的具體用法請(qǐng)參閱示例程序和。3.使用BoxLayout時(shí)需要注意的事項(xiàng)

(1)當(dāng)組件按BoxLayout布局排列好后,不管窗口縮小或放大都不會(huì)變動(dòng)。

(2)當(dāng)使用水平排列方式時(shí),若放進(jìn)去的組件不等高,則系統(tǒng)將會(huì)使所有的組件與最高組件等高。

(3)當(dāng)放在同一行的組件超出容器的寬度時(shí),系統(tǒng)不會(huì)自動(dòng)換行,需要用戶自行處理。

【示例程序C10_51.java】使用BoxLayout布局策略,將各組件按要求排列。import;

import;

import;

import;

import;

publicclassC10_51extendsJApplet{

publicvoidaddComponentsToPane(Containerpane){

pane.setLayout(newBoxLayout(pane,));

addAButton("Button1",pane);

addAButton("Long-NamedButton4",pane);

addAButton("5",pane);

}privatevoidaddAButton(Stringtext,Containercontainer){

JButtonbutton=newJButton(text);

);

container.add(button);

}

@Override

publicvoidinit(?){

addComponentsToPane(getContentPane(?));

}

}

該程序的運(yùn)行結(jié)果如圖所示。圖10.7程序C10_51的運(yùn)行結(jié)果注:程序中的“@Override”是要求系統(tǒng)幫助檢查重載方法書寫的正確性(下同)。

【示例程序C10_52.java】使用BoxLayout和Box,將各組件按要求排列。

import;

import;

import;

import;

import;

import;

publicclassC10_52extendsJApplet{

JButtonb1=newJButton(“Top”);

JButtonb2=newJButton("Middle1");JButtonb3=newJButton("Bottom");

JButtonb4=newJButton("Left");

JButtonb5=newJButton("Right");

@Override

publicvoidinit(?){

Containercp=getContentPane(?);

//按垂直排列

BoxvBox=(?);

b1.setMaximumSize(newDimension(200,200));//設(shè)置按鈕的最大長(zhǎng)度

vBox.add(Box.createVerticalStrut(10));//加入垂直透明組件Strut,間隔為10像素

vBox.add(b1);

vBox.add(Box.createVerticalStrut(10));vBox.add(b2);vBox.add(b3);

);

//按水平排列

BoxhBox=();

hBox.add(b4);

());//加入水平透明組件Glue,組件擠到兩邊

hBox.add(b5);

);

}

}

該程序的運(yùn)行結(jié)果如圖所示。圖10.8程序C10_52的運(yùn)行結(jié)果10.2窗口與面板容器

10.2.1JFrame容器

JFrame是JavaApplication程序的圖形用戶界面容器,是帶有標(biāo)題和邊框的頂層窗口。窗體的默認(rèn)布局為BorderLayout。JFrame類包含支持任何通用窗口特性的基本功能,如最小化窗口、移動(dòng)窗口、重新設(shè)定窗口大小等。JFrame容器作為頂層容器,不能被其他容器所包含,但可以被其他容器創(chuàng)建并彈出成為獨(dú)立的容器。JFrame類的繼承關(guān)系如下:

使用JFrame容器時(shí)需要注意以下幾點(diǎn):

(1)可以使用JFrame(?)方法創(chuàng)建一個(gè)無(wú)標(biāo)簽的JFrame對(duì)象,也可以使用JFrame(Stringtitle)方法創(chuàng)建一個(gè)標(biāo)簽為title的JFrame對(duì)象,還可以使用專門的方法getTitle(?)和setTitle(String)來(lái)獲取或指定JFrame的標(biāo)題。(2)使用setSize(intx,inty)方法設(shè)置JFrame容器的大小。

(3)創(chuàng)建的JFrame是不可見(jiàn)的,若要使其可見(jiàn),則需要使用給出實(shí)際參數(shù)為true的setVisible(boolean)方法。

(4)向JFrame中添加組件時(shí),必須先取得ContentPane,然后再使用add(?)方法把組件加入到此ContentPane中,而不能像AWT中的Frame那樣直接調(diào)用add(?)方法。

(5)?JFrame類可以引發(fā)WindowEvent類代表的所有七種窗口事件(見(jiàn)第11章)。(6)每個(gè)JFrame在其右上角都有三個(gè)控制圖標(biāo)(如圖所示),分別代表最小化、最大化和關(guān)閉窗口的操作。其中,JFrame可自動(dòng)完成窗口的最小化和最大化操作,而關(guān)閉窗口的操作不能通過(guò)點(diǎn)擊關(guān)閉圖標(biāo)來(lái)實(shí)現(xiàn),但可以使用下述三個(gè)方法之一來(lái)關(guān)閉窗口:

①設(shè)置一個(gè)按鈕,當(dāng)用戶點(diǎn)擊此按鈕時(shí)關(guān)閉窗口;

②用WINDOWS_CLOSING事件做出響應(yīng),關(guān)閉窗口;

③使用菜單命令。

無(wú)論使用哪一種方法,都需要用到關(guān)閉JFrame的System.exit(0)方法。下面通過(guò)示例程序來(lái)說(shuō)明JFrame容器的使用。

【示例程序C10_6.java】創(chuàng)建一個(gè)窗口并顯示。

import.*;

import.*;

publicclassC10_6

{

publicC10_6(?)

{//CreateandsetuptheJFrame

JFramef=newJFrame(“FrameDemo”);

);

JLabellb=newJLabel(“這是JFrame”);

lb.setPreferredSize(newDimension(175,100));(?).);

(); //調(diào)整窗口

f.setVisible(true); //顯示這個(gè)JFrame

}

publicstaticvoidmain(String[?]args)

{C10_6cc=newC10_6(?);

}

}

該程序的運(yùn)行結(jié)果如圖所示。圖10.9程序C10_6的運(yùn)行結(jié)果程序說(shuō)明:

(1)程序中的“);”語(yǔ)句表示設(shè)置用戶在此窗體上發(fā)起“close”時(shí)默認(rèn)執(zhí)行的操作。

(2)“(?).);”語(yǔ)句表示添加標(biāo)簽對(duì)象到返回此窗體的ContentPane對(duì)象容器中。10.2.2JPanel容器

在設(shè)計(jì)用戶界面時(shí),為了更合理地安排各組件在窗口的位置,可以考慮將所需組件先排列在一個(gè)容器中,然后將其作為一個(gè)整體嵌入窗口。Panel和JPanel就是這樣一類被稱為面板的容器。它們是一類無(wú)邊框的,不能被移動(dòng)、放大、縮小或關(guān)閉的容器。AWT中的Panel與Swing中的JPanel的區(qū)別是:JPanel支持雙緩沖(DoubleBuffering)功能,在處理動(dòng)畫上較少發(fā)生畫面閃爍的情況。JPanel類的繼承關(guān)系如下:

不能把JPanel作為一個(gè)圖形界面程序最底層的容器,也不能指明JPanel的大小。JPanel總是作為一個(gè)容器組件被加入到JFrame、JApplet等其他容器中,當(dāng)然,JPanel也可以加入到JPanel容器中。JPanel的大小由包含在它里邊的組件、包容它的那個(gè)容器的布局策略,以及該容器中的其他組件所決定。

建立一個(gè)JPanel時(shí),首先使用表中所列JPanel類構(gòu)造方法創(chuàng)建JPanel類的對(duì)象,然后調(diào)用setLayout(?)方法設(shè)置組件在面板上的排列方式,最后將所需組件加入面板。表10.3JPanel類的構(gòu)造方法

【示例程序C10_7.java】創(chuàng)建一個(gè)JFrame窗口對(duì)象和兩個(gè)JPanel面板對(duì)象,將面板對(duì)象添加到窗口對(duì)象中。

import.*;

import.*;

publicclassC10_7extendsJFrame

{JLabel[]lb=newJLabel[3]; //創(chuàng)建標(biāo)簽數(shù)組

JPanelpa1=newJPanel(); //創(chuàng)建面板對(duì)象

JPanelpa2=newJPanel(newGridLayout(1,2));

publicC10_7()

{setLayout(newGridLayout(2,1));

for(inti=0;i<;i++) //設(shè)置每個(gè)標(biāo)簽的屬性{lb[i]=newJLabel("標(biāo)簽"+(i+1),JLabel.CENTER);

); //設(shè)置標(biāo)簽顏色

());//設(shè)置標(biāo)簽邊框

lb[i].setOpaque(true); //讓組件變?yōu)椴煌该?,使?biāo)簽顏色顯示出來(lái)

}

pa1.add(lb[0]); //加載第0個(gè)標(biāo)簽在面板上

pa2.add(lb[1],BorderLayout.NORTH);//加載第1個(gè)標(biāo)簽在面板上

pa2.add(lb[2],BorderLayout.SOUTH);//加載第2個(gè)標(biāo)簽在面板上

add(pa1); //將pa1的對(duì)象添加到cc的對(duì)象中

add(pa2);

setTitle("JPanelDemo");pack();

setVisible(true);

}

publicstaticvoidmain(String[]arg)

{

C10_7cc=newC10_7();

}

}

該程序的運(yùn)行結(jié)果如圖所示。

程序說(shuō)明:在JFrame容器cc的對(duì)象中放入了pa1和pa2的對(duì)象,pa1的對(duì)象中放入了一個(gè)標(biāo)簽組件,pa2的對(duì)象中放入了兩個(gè)標(biāo)簽組件。圖10.10程序C10_7的運(yùn)行結(jié)果10.3事件響應(yīng)原理

設(shè)計(jì)并實(shí)現(xiàn)圖形用戶界面的工作主要有兩方面:一是創(chuàng)建組成界面的各種成分和元素,指定它們的屬性和位置關(guān)系,根據(jù)具體需要排列它們,從而構(gòu)成完整的圖形用戶界面的物理外觀;二是定義圖形用戶界面的事件和各界面元素對(duì)不同事件的響應(yīng),從而實(shí)現(xiàn)圖形用戶界面與用戶的交互功能。圖形用戶界面之所以能為廣大用戶所喜愛(ài)并最終成為事實(shí)上的標(biāo)準(zhǔn),很重要的一點(diǎn)就在于圖形用戶界面的事件驅(qū)動(dòng)機(jī)制,它可以根據(jù)產(chǎn)生的事件來(lái)決定執(zhí)行相應(yīng)的程序段。事件(Event)代表了某對(duì)象可執(zhí)行的操作及其狀態(tài)的變化。例如,在圖形用戶界面中,用戶可以通過(guò)移動(dòng)鼠標(biāo)對(duì)特定圖形界面元素進(jìn)行單擊、雙擊等操作來(lái)實(shí)現(xiàn)輸入/輸出操作。10.3.1委托事件模型

Java采用委托事件模型來(lái)處理事件。委托事件模型由事件源、事件(Event)及事件監(jiān)聽(tīng)器(Listener)組成。委托事件模型的特點(diǎn)是將事件的處理委托給事件監(jiān)聽(tīng)器,而不是組件本身。

1.事件源與事件

如果在一個(gè)圖形用戶界面上,點(diǎn)擊按鈕后改變了界面上的內(nèi)容,這就意味著這個(gè)界面上的按鈕組件可以觸發(fā)一個(gè)事件。我們稱這個(gè)按鈕組件是事件源。因此,事件源是能夠接收外部事件的源體(一些組件),是事件的產(chǎn)生者。事件源會(huì)在事件產(chǎn)生時(shí),將與該事件及事件源相關(guān)的信息封裝在事件中。當(dāng)事件被觸發(fā)時(shí),事件將被一個(gè)或多個(gè)“事件監(jiān)聽(tīng)器”接收,事件監(jiān)聽(tīng)器負(fù)責(zé)處理事件。所以,事件發(fā)生的地方可以與事件處理的地方分離開(kāi)。

2.事件監(jiān)聽(tīng)器

事件監(jiān)聽(tīng)器是實(shí)現(xiàn)事件監(jiān)聽(tīng)的接口類。事件監(jiān)聽(tīng)器不斷地監(jiān)聽(tīng)事件源的動(dòng)作,當(dāng)事件源產(chǎn)生一個(gè)事件,監(jiān)聽(tīng)器接收到事件源的通知后,就調(diào)用特定的方法執(zhí)行指定的動(dòng)作。3.委托事件模型的實(shí)現(xiàn)步驟

委托事件模型的實(shí)現(xiàn)步驟如下:

(1)建立事件源對(duì)象;

(2)為事件源對(duì)象選擇合適的事件監(jiān)聽(tīng)器;

(3)為監(jiān)聽(tīng)器添加適當(dāng)?shù)奶幚矸椒ǎ?/p>

(4)為監(jiān)聽(tīng)器與事件源建立聯(lián)系。10.3.2事件類的繼承關(guān)系

包中提供了處理由組件所激發(fā)的各類事件的接口和類。常用事件類的繼承關(guān)系如圖所示。

Java中的事件類可分為高級(jí)事件類和低級(jí)事件類。低級(jí)事件是基于組件和容器的事件。常見(jiàn)的低級(jí)事件類是ComponentEvent(組件事件)和ContainerEvent(容器事件)。高級(jí)事件是基于語(yǔ)義的事件,它可以不和特定的動(dòng)作相關(guān)聯(lián),而是依賴于觸發(fā)此事件的類。常見(jiàn)的高級(jí)事件是ActionEvent(動(dòng)作事件)、AdjustmentEvent(調(diào)整事件)、ItemEvent(選擇事件)和TextEvent(文本事件)。圖10.11常用事件類的繼承關(guān)系10.3.3事件與事件源的關(guān)系

事件由事件源產(chǎn)生,不同的事件源產(chǎn)生不同的事件。Swing中常用的事件類和事件源的關(guān)系如表所示。表10.4常用的事件類和事件源的關(guān)系

10.3.4Swing中的事件與事件監(jiān)聽(tīng)器

Swing組件是構(gòu)建在AWT庫(kù)之上的、具有一些改進(jìn)功能的Swing組件庫(kù)。由于Swing組件庫(kù)的功能改進(jìn)覆蓋于AWT核心事件處理特性之上,由基本的動(dòng)作監(jiān)聽(tīng)到焦點(diǎn)管理,從而使得Swing組件的事件處理更為簡(jiǎn)單。

所有的Swing組件都是的子類,它們具有如下繼承關(guān)系:

的各種Swing組件(見(jiàn)圖9.2)因此,可以利用類與類提供的事件及事件監(jiān)聽(tīng)器來(lái)處理諸如鼠標(biāo)和鍵盤操作等低級(jí)事件。

不同事件需要不同的事件監(jiān)聽(tīng)器(接口類),事件與事件監(jiān)聽(tīng)器之間的關(guān)系如表所示。監(jiān)聽(tīng)器要用對(duì)應(yīng)的處理方法來(lái)處理事件。而每個(gè)監(jiān)聽(tīng)器都有相應(yīng)的成員方法,我們處理事件的程序代碼要寫在對(duì)應(yīng)的成員方法體中。表列出了各事件監(jiān)聽(tīng)器與各成員方法之間的對(duì)應(yīng)關(guān)系。表10.5事件與事件監(jiān)聽(tīng)器之間的關(guān)系

表10.6各事件監(jiān)聽(tīng)器與各成員方法之間的關(guān)系10.4JLable組件

JLable組件被稱為標(biāo)簽,它是一個(gè)靜態(tài)組件,也是標(biāo)準(zhǔn)組件中最簡(jiǎn)單的一個(gè)組件。每個(gè)標(biāo)簽用一個(gè)標(biāo)簽類的對(duì)象表示,可以顯示一行靜態(tài)文本。標(biāo)簽只起信息說(shuō)明的作用,而不接受用戶的輸入,也無(wú)事件響應(yīng)。

創(chuàng)建JLable類對(duì)象的構(gòu)造方法如表所示。

當(dāng)創(chuàng)建了一個(gè)標(biāo)簽對(duì)象后,就可以引用JLable類的成員方法重新設(shè)置標(biāo)簽,或獲取標(biāo)簽信息。JLable類的常用成員方法如表所示。表10.7JLable類對(duì)象的構(gòu)造方法

表10.8JLable類的常用成員方法

10.5JButton組件與JToggleButton組件

JButton組件與JToggleButton組件通常被稱為按鈕,它是一個(gè)具有按下、抬起兩種狀態(tài)的組件。用戶可以指定按下按鈕(單擊事件)時(shí)所執(zhí)行的操作(事件響應(yīng))。按鈕上通常有一行文字(標(biāo)簽)或一個(gè)圖標(biāo)以表明它的功能。此外,Swing組件中的按鈕還可以實(shí)現(xiàn)下述效果:

(1)改變按鈕的圖標(biāo),即一個(gè)按鈕可以有多個(gè)圖標(biāo),可根據(jù)Swing按鈕所處的狀態(tài)而自動(dòng)變換不同的圖標(biāo)。(2)為按鈕加入提示,即當(dāng)鼠標(biāo)在按鈕上稍做停留時(shí),在按鈕邊可出現(xiàn)提示,當(dāng)鼠標(biāo)移出按鈕時(shí),提示自動(dòng)消失。

(3)在按鈕上設(shè)置快捷鍵。

(4)設(shè)置默認(rèn)按鈕,即通過(guò)回車鍵運(yùn)行此按鈕的功能。

10.5.1常用組件的繼承關(guān)系

由于本章所述組件所使用的成員方法主要是繼承自其直接父類或更高層父類的成員方法,為了正確地使用這些組件,有必要了解每個(gè)組件的繼承關(guān)系。本章所述組件的繼承關(guān)系如下:

.JRadioButton其中,AbstractButton類是一個(gè)抽象類,這個(gè)類提供了許多組件需要使用的成員方法和事件驅(qū)動(dòng)方法。

10.5.2AbstractButton類的常用成員方法

按照面向?qū)ο笾谐橄笈c繼承的原則,Java在AbstractButton類中提供了許多成員方法,為其子類繼承和使用提供了方便。表列出了該類的常用成員方法。表10.9AbstractButton類的常用成員方法

10.5.3JButton類的構(gòu)造方法

按鈕可分為有、無(wú)文本的和有、無(wú)圖標(biāo)的等幾種情況,因此,系統(tǒng)提供了表所示的JButton類的構(gòu)造方法來(lái)創(chuàng)建這幾種按鈕對(duì)象。

10.5.4JToggleButton類的構(gòu)造方法

JToggleButton按鈕與JButton按鈕的區(qū)別僅在于:當(dāng)按下JButton按鈕并釋放鼠標(biāo)后,按鈕會(huì)自動(dòng)彈起;當(dāng)按下JToggleButton按鈕并釋放鼠標(biāo)后,按鈕不會(huì)自動(dòng)彈起,除非再按一次。表列出了JToggleButton類的構(gòu)造方法。表10.10JButton類的構(gòu)造方法

表10.11JToggleButton類的構(gòu)造方法

10.5.5ActionEvent事件及其響應(yīng)

從表、表和表可以得到ActionEvent事件類與事件源和事件監(jiān)聽(tīng)器之間的關(guān)系。如果希望在所設(shè)計(jì)的用戶界面上利用按鈕激發(fā)一個(gè)動(dòng)作事件,利用Java的委托事件模型處理這個(gè)事件,則需要了解ActionEvent事件及其響應(yīng)原理。

1.ActionEvent事件

ActionEvent事件是發(fā)生了組件定義的動(dòng)作的語(yǔ)義事件,簡(jiǎn)稱為動(dòng)作事件。能觸發(fā)這個(gè)事件的動(dòng)作包括:?jiǎn)螕粢粋€(gè)按鈕,雙擊一個(gè)列表中的選項(xiàng),選擇了一個(gè)菜單項(xiàng),在文本框中輸入回車等。2.獲取事件源的方法

要處理事件必須要得到事件源,有兩種方法可以得到事件源。

(1)?getActionCommand(?)方法:是ActionEvent類的方法,用來(lái)獲取事件源對(duì)象的標(biāo)簽或事先為這個(gè)對(duì)象設(shè)置的命令名。

(2)?getSource(?)方法:是EventObject類的方法,該類是ActionEvent類的父類,用來(lái)獲取最初發(fā)生事件的事件源對(duì)象。3.動(dòng)作事件的響應(yīng)

我們用單擊按鈕觸發(fā)事件并處理該事件的過(guò)程來(lái)說(shuō)明動(dòng)作事件的響應(yīng)原理。如果要使按鈕能夠觸發(fā)ActionEvent事件,需要做下面一些工作:

首先,創(chuàng)建一個(gè)按鈕對(duì)象,引用按鈕的AbstractButton類的addActionListener(?)方法,將一個(gè)ActionListener對(duì)象添加到按鈕中,即為按鈕注冊(cè)監(jiān)聽(tīng)器(ActionListener)對(duì)象,以接收按鈕觸發(fā)的事件。

其次,在程序的監(jiān)聽(tīng)器的actionPerformed(?)方法中編寫事件的處理程序。這樣,當(dāng)用戶單擊按鈕時(shí),則觸發(fā)了ActionEvent事件。該事件被傳遞給ActionListener監(jiān)聽(tīng)器對(duì)象,監(jiān)聽(tīng)器對(duì)象引用它的actionPerformed(?)方法來(lái)完成事件響應(yīng)。

ActionEvent事件處理程序的結(jié)構(gòu)如下。

(1)將響應(yīng)動(dòng)作事件所需要的業(yè)務(wù)邏輯封裝在實(shí)現(xiàn)監(jiān)聽(tīng)器接口的類中:

ClassClickActionimplementsActionListener

{

publicvoidactionPerformed(ActionEvente)

{

//響應(yīng)動(dòng)作事件所需要的業(yè)務(wù)邏輯

}

}在actionPerformed(?)方法體中寫入處理此事件的程序代碼。在方法體中可以引用ActionEvent事件的getSource(?)方法來(lái)獲取引發(fā)事件的對(duì)象,也可以引用getActionCommand(?)方法來(lái)獲取對(duì)象標(biāo)簽或事先為這個(gè)對(duì)象設(shè)置的命令名。

(2)創(chuàng)建事件源并注冊(cè)完成所需業(yè)務(wù)邏輯的監(jiān)聽(tīng)器:

ActionListenerclick=newClickAction(?);//創(chuàng)建監(jiān)聽(tīng)器對(duì)象

JButtonbtn=newJButton(?); //創(chuàng)建按鈕對(duì)象

btn.addActionListener(click);

//注冊(cè)監(jiān)聽(tīng)器對(duì)象

這樣,當(dāng)事件發(fā)生時(shí),注冊(cè)的監(jiān)聽(tīng)器對(duì)象就可以接收來(lái)自事件源的事件。(3)引用監(jiān)聽(tīng)器的actionPerformed(?)方法來(lái)完成事件響應(yīng)。

下面通過(guò)一個(gè)具體的程序來(lái)說(shuō)明按鈕的事件響應(yīng)。10.5.6應(yīng)用舉例

【示例程序C10_8.java】編寫一個(gè)單擊按鈕時(shí)改變標(biāo)簽文本與按鈕文本的內(nèi)容的程序。

packagech10;

import.*;

import.*r;

import.*;

//聲明該類實(shí)現(xiàn)ActionListener接口,監(jiān)聽(tīng)器對(duì)象是C10_8類的對(duì)象

publicclassC10_8extendsJAppletimplementsActionListener{Containercp=getContentPane();//創(chuàng)建窗口容器對(duì)象

Iconro=newImageIcon(getClass().getResource("/image/G1.gif"));//創(chuàng)建圖標(biāo)對(duì)象

Iconge=newImageIcon(getClass().getResource("/image/G2.gif"));

Iconpr=newImageIcon(getClass().getResource("/image/G3.gif"));

JButtonbt=newJButton();//創(chuàng)建按鈕對(duì)象

Iconicon=newImageIcon(getClass().getResource("/image/G4.jpg"));

JLabellb=new);//創(chuàng)建標(biāo)簽對(duì)象

publicvoidinit(){

bt.setRolloverEnabled(true);//將按鈕圖標(biāo)變化功能打開(kāi)

bt.setText("OK");//添加按鈕文本

);//將按鈕文字放在圖標(biāo)中間

);//設(shè)置按鈕文字在圖標(biāo)下方

);//添加標(biāo)簽在JApple界面的北部位置上

);

bt.setIcon(ge);//設(shè)置鼠標(biāo)離開(kāi)按鈕的圖標(biāo)

bt.setRolloverIcon(ro);//設(shè)置鼠標(biāo)在按鈕上的圖標(biāo)

bt.setPressedIcon(pr);//設(shè)置鼠標(biāo)按下按鈕的圖標(biāo)

bt.addActionListener(this);//注冊(cè)監(jiān)聽(tīng)器對(duì)象到事件源

}publicvoidactionPerformed(ActionEvente)

{//actionPerformed()方法在單擊bt時(shí)被系統(tǒng)自動(dòng)調(diào)用

()==bt)//判斷動(dòng)作事件是否由bt引發(fā)的

{

if("()))//修改標(biāo)簽文本

("你好!");

else

lb.setText("Hello");

()))//修改按鈕文本

("確定"); else

bt.setText(“OK”);

}

}

}

該程序的運(yùn)行結(jié)果如圖所示。(a)鼠標(biāo)單擊前的結(jié)果(b)鼠標(biāo)單擊后的結(jié)果圖10.12程序C10_8的運(yùn)行結(jié)果程序說(shuō)明:

(1)?當(dāng)向JApplet中添加Swing組件時(shí)要使用JApplet的getContentPane(?)方法獲得一個(gè)Container對(duì)象,再引用這個(gè)Container對(duì)象的add(?)方法將JComponent及其子類對(duì)象添加到JApplet中。

(2)程序中創(chuàng)建的按鈕有一個(gè)圖標(biāo),根據(jù)鼠標(biāo)的移動(dòng)來(lái)改變圖標(biāo)。

(3)publicclassC10_8extendsJAppletimplementsActionListener中的ActionListener接口類僅僅包含了一個(gè)抽象方法actionPerformed(ActionEvente)。ActionEvent類e的對(duì)象代表產(chǎn)生的動(dòng)作事件。當(dāng)單擊按鈕觸發(fā)一個(gè)動(dòng)作事件時(shí),注冊(cè)的監(jiān)聽(tīng)器對(duì)象就可以接收來(lái)自事件源的事件,并調(diào)用actionPerformed(ActionEvente)方法對(duì)該事件進(jìn)行處理。在方法體中調(diào)用(?)方法來(lái)獲取引發(fā)事件的事件源(按鈕)對(duì)象。(4)為事件源注冊(cè)監(jiān)聽(tīng)器對(duì)象,注冊(cè)的監(jiān)聽(tīng)器對(duì)象就可以接收來(lái)自事件源的事件。在這個(gè)程序中,bt是事件源,使用bt.addActionListener(this)來(lái)注冊(cè)監(jiān)聽(tīng)器對(duì)象。其中this為監(jiān)聽(tīng)器對(duì)象,addActionListener()方法是AbstractButton類提供的方法。

(5)程序中使用了AbstractButton類的成員方法,詳細(xì)描述見(jiàn)表。

(6)圖片(image)文件夾的位置在圖所示的src中。程序中加載圖片的語(yǔ)句是:

newImageIcon(getClass(?).getResource("/image/G1.gif"));

該語(yǔ)句表示通過(guò)得到類的對(duì)象的給定名稱(本例中是/image/G1.gif)的資源,創(chuàng)建一個(gè)圖標(biāo)對(duì)象。圖10.13image文件夾的位置10.6JCheckBox和JRadioButton組件

JCheckBox組件被稱為復(fù)選框(也稱檢測(cè)框),它提供“選中/ON”和“未選中/OFF”兩種狀態(tài)。用戶點(diǎn)擊某復(fù)選框就會(huì)改變?cè)搹?fù)選框原有的狀態(tài)。JRadioButton組件被稱為選項(xiàng)按鈕,在Java中JRadioButton組件與JCheckBox組件功能完全一樣,只是圖形不同,復(fù)選框?yàn)榉叫螆D標(biāo),選項(xiàng)按鈕為圓形圖標(biāo)。由于目前所使用軟件的RadioButton多為單選按鈕,即在同類的一組組件中,用戶只能選擇其中之一為ON,其余為OFF。Java為了與其他系統(tǒng)保持一致,專門提供了類,這個(gè)類的功能就是實(shí)現(xiàn)諸如JRadioButton、JRadioButtonMenuItem與JToggleButton等組件的多選一功能。ButtonGroup類可被AbstractButton類的子類所使用。10.6.1JCheckBox類的構(gòu)造方法

創(chuàng)建復(fù)選框?qū)ο笫褂肑CheckBox類的構(gòu)造方法,如表所示。

10.6.2JRadioButton類的構(gòu)造方法

JRadioButton類的構(gòu)造方法見(jiàn)表。表10.12JCheckBox類的構(gòu)造方法

表10.13JRadioButton類的構(gòu)造方法

10.6.3ItemEvent事件及其響應(yīng)

從表、表和表可以得到ItemEvent事件類與事件源和事件監(jiān)聽(tīng)器之間的關(guān)系。如果希望在所設(shè)計(jì)的用戶界面上利用復(fù)選框激發(fā)一個(gè)選擇事件,利用Java的委托事件模型處理這個(gè)事件,則需要了解ItemEvent事件及其響應(yīng)原理。

1.ItemEvent事件

ItemEvent事件是事件源的選項(xiàng)被選定或取消的語(yǔ)義事件(簡(jiǎn)稱為選擇事件),是在用戶已選中選定項(xiàng)或取消選定項(xiàng)時(shí)由ItemSelectable對(duì)象(例如,復(fù)選框)生成的。引發(fā)這類事件的動(dòng)作包括:(1)改變復(fù)選框JCheckBox對(duì)象的選中或不選中狀態(tài);

(2)改變單選按鈕JRadioButton對(duì)象的選中或不選中狀態(tài);

(3)改變下拉列表框JComboBox對(duì)象中選項(xiàng)的選中或不選中狀態(tài);

(4)改變菜單項(xiàng)JMenuItem對(duì)象中選項(xiàng)的選中或不選中狀態(tài);

(5)改變JCheckBoxMenuItem對(duì)象中選項(xiàng)的選中或不選中狀態(tài)。2.獲取ItemEvent事件源的方法

得到ItemEvent事件源主要有三個(gè)方法。

(1)?ItemSelectablegetItemSelectable(?)方法:是ItemEvent類的方法,用來(lái)獲取返回產(chǎn)生事件的ItemSelectable對(duì)象,例如JCheckBox中選擇的項(xiàng)。此外,ItemEvent事件也可以使用其父類EventObject類提供的getSource(?)方法返回引發(fā)選中狀態(tài)變化的事件源。(2)?ObjectgetItem(?)方法:是ItemEvent類的方法,用來(lái)獲取返回受事件影響的項(xiàng),例如JComboBox中的具體item。通過(guò)調(diào)用這個(gè)方法可以知道用戶選中了哪個(gè)選項(xiàng)。

(3)?intgetStateChange(?)方法:是ItemEvent類的方法,用來(lái)獲取返回狀態(tài)更改的類型(已選定或已取消選定)。通常用ItemEvent類的靜態(tài)常量SELECTED(代表選項(xiàng)被選中)和DESELECTED(代表選項(xiàng)被放棄或不選)來(lái)表達(dá)。3.選擇事件的響應(yīng)

我們用復(fù)選框選擇觸發(fā)事件并處理該事件的過(guò)程來(lái)說(shuō)明選擇事件的響應(yīng)原理。如果要使復(fù)選框能夠觸發(fā)ItemEvent事件,應(yīng)該做下述工作:

首先,創(chuàng)建一組復(fù)選框?qū)ο螅脧?fù)選框的AbstractButton類的addItemListener(?)方法,將一個(gè)ItemListener對(duì)象添加到復(fù)選框中,即為復(fù)選框注冊(cè)監(jiān)聽(tīng)器(ItemListener)對(duì)象,以接收復(fù)選框觸發(fā)的事件。

其次,在程序的監(jiān)聽(tīng)器的itemStateChanged(?)方法中編寫事件的處理程序。這樣就可以選擇復(fù)選框組件時(shí)觸發(fā)ItemEvent事件了。該事件被傳遞給ItemListener監(jiān)聽(tīng)器對(duì)象,它避開(kāi)處理具體鼠標(biāo)移動(dòng)和鼠標(biāo)單擊的細(xì)節(jié)問(wèn)題,轉(zhuǎn)而處理諸如“已選中選定項(xiàng)”或“已取消選定項(xiàng)”之類的語(yǔ)義事件,引用它的itemStateChanged(?)方法來(lái)完成事件響應(yīng)。

ItemEvent事件處理的程序結(jié)構(gòu)如下。

(1)將響應(yīng)選擇事件所需要的業(yè)務(wù)邏輯封裝在實(shí)現(xiàn)監(jiān)聽(tīng)器接口的類中:ClassSelectActionimplementsItemListener

{

publicvoiditemStateChanged(ItemEvente)

{

//處理選擇事件所需要的業(yè)務(wù)邏輯

}

}

在itemStateChanged(?)方法體中寫入處理此事件的程序代碼。也可以在方法體中引用ItemEvent事件的(?)方法獲得引發(fā)選擇事件的事件源對(duì)象,引用getStateChange(?)方法獲取選擇事件之后的狀態(tài)。(2)創(chuàng)建事件源并注冊(cè)完成所需業(yè)務(wù)邏輯的監(jiān)聽(tīng)器:

ItemListenerselect=newSelectAction(?); //創(chuàng)建監(jiān)聽(tīng)器對(duì)象

JCheckBoxcb=newJCheckBox(?); //創(chuàng)建復(fù)選框?qū)ο?/p>

cb.addItemListener(select);

//注冊(cè)監(jiān)聽(tīng)器對(duì)象

這樣,當(dāng)事件發(fā)生時(shí),注冊(cè)的監(jiān)聽(tīng)器對(duì)象就可以接收來(lái)自事件源的事件了。

(3)引用監(jiān)聽(tīng)器的itemStateChanged(?)方法來(lái)完成事件響應(yīng)。

下面通過(guò)一個(gè)具體的程序來(lái)說(shuō)明按鈕的事件響應(yīng)。10.6.4應(yīng)用舉例

【示例程序C10_9.java】根據(jù)復(fù)選框及單選按鈕來(lái)改變標(biāo)簽組件的文本大小及顏色。

import.*;

import.*;

import.*;

publicclassC10_9extendsJAppletimplementsItemListener,ActionListener

{inti1=0,i2=0,i3=0;intfonti=10;

Fontfont;

Containerctp=getContentPane();

JLabellb=newJLabel("請(qǐng)選擇");

JCheckBoxcb1,cb2,cb3; //聲明復(fù)選框?qū)ο?/p>

JRadioButtonr1,r2,r3; //聲明按鈕對(duì)象

ButtonGroupbg=newButtonGroup(); //創(chuàng)建按鈕組對(duì)象,實(shí)現(xiàn)JRadioButton多選一功能

publicvoidinit()

{ctp.setLayout(newFlowLayout());//設(shè)置布局方式為流式布局

cb1=newJCheckBox("紅色",false);//創(chuàng)建復(fù)選框

cb1.addItemListener(this); //為事件源注冊(cè)監(jiān)聽(tīng)器對(duì)象

ctp.add(cb1); //添加復(fù)選框到界面上

cb2=newJCheckBox("綠色",false);

cb2.addItemListener(this);

ctp.add(cb2);

cb3=newJCheckBox("藍(lán)色",false);

cb3.addItemListener(this);

ctp.add(cb3);

r1=newJRadioButton("10");

r1.addActionListener(this);

ctp.add(r1); //加載按鈕到界面上

r2=newJRadioButton("16");

r2.addActionListener(this);

ctp.add(r2);r3=newJRadioButton("24");

r3.addActionListener(this);

ctp.add(r3);

bg.add(r1); //加載按鈕到按鈕組

bg.add(r2);

bg.add(r3);

ctp.add(lb); //加載標(biāo)簽到界面上

}

publicvoiditemStateChanged(ItemEvente)

{JCheckBoxcbx=(JCheckBox)e.getItem();

if("紅色".equals(cbx.getText()))

{if(e.getStateChange()==ItemEvent.SELECTED)i1=255;//判斷組件是否被選

elsei1=0;}

if("綠色".equals(cbx.getText()))

{()==ItemEvent.SELECTED)i2=255;

elsei2=0;}

if("藍(lán)色".()))

{())i3=255; //判斷組件是否被選

elsei3=0;}

font=newFont("宋體",Font.BOLD,fonti);

lb.setFont(font);

lb.setForeground(newColor(i1,i2,i3));

}

publicvoidactionPerformed(ActionEvente)

{Stringrbt=();if("10".equals(rbt))fonti=10;

elseif("16".equals(rbt))fonti=16;

elsefonti=24;

font=newFont("宋體",Font.BOLD,fonti);

lb.setFont(font);

lb.setForeground(newColor(i1,i2,i3));

}

}

該程序的運(yùn)行結(jié)果如圖所示。

在這個(gè)程序中,語(yǔ)句“ctp.setLayout(newFlowLayout(?));”表示設(shè)置布局方式為流式布局,這種布局是指將JApplet界面上的組件按照添加順序從左向右排列,一行排滿后再排下一行。程序中用到的有些方法是AbstractButton類的成員方法。圖10.14程序C10_9的運(yùn)行結(jié)果10.7JComboBox組件

JComboBox組件被稱為下拉列表框,其特點(diǎn)是將所有選項(xiàng)折疊收藏在一起,只顯示最前面的或被用戶選中的一個(gè)。如果希望看到其他的選項(xiàng),只需單擊下拉列表框右邊的下三角按鈕就可以彈出所有選項(xiàng)的列表。用戶可在這個(gè)列表中進(jìn)行選擇,或者直接輸入所需的選項(xiàng)。下拉列表與選項(xiàng)按鈕類似,一次只能選擇一項(xiàng)。10.7.1JComboBox類的構(gòu)造方法和成員方法

創(chuàng)建JComboBox類的構(gòu)造方法和常用的成員方法列于表中。

10.7.2事件響應(yīng)

JComboBox組件能夠響應(yīng)的事件分為選擇事件與動(dòng)作事件。若用戶選取下拉列表中的選擇項(xiàng)時(shí),則激發(fā)選擇事件,使用ItemListener事件監(jiān)聽(tīng)器進(jìn)行處理;若用戶在JComboBox上直接輸入選擇項(xiàng)并回車,則激發(fā)動(dòng)作事件,使用ActionListener事件監(jiān)聽(tīng)器進(jìn)行處理。

下面通過(guò)一個(gè)具體的程序來(lái)說(shuō)明按鈕的事件響應(yīng)。表10.14JComboBox類的構(gòu)造方法和常用的成員方法

10.7.3應(yīng)用舉例

【示例程序C10_10.java】在JComboBox組件中添加4個(gè)學(xué)生的名字選項(xiàng),當(dāng)點(diǎn)擊下拉列表選擇項(xiàng)時(shí)得到學(xué)生的名字,將他的成績(jī)用標(biāo)簽文本顯示。

import.*;

import.*;

import.*;

publicclassC10_10extendsJAppletimplementsItemListener

{Containerctp=getContentPane();

JLabellb1=newJLabel(“姓名:”),

lb2=newJLabel("英語(yǔ):"),lb3=newJLabel(“”);

Stringname[]={“李林”,“趙欣”,“張揚(yáng)”,“童梅”},

score[]={“80”,“94”,“75”,“87”};

JComboBoxcbx=newJComboBox();//創(chuàng)建下拉式列表框?qū)ο?/p>

publicvoidinit()

{

ctp.setLayout(newFlowLayout());//設(shè)置流式布局

for(intj=0;j<name.length;j++)//添加選項(xiàng)到下拉式列表框?qū)ο笾?/p>

cbx.addItem(name[j]);

ctp.add(lb1);

ctp.add(cbx); //添加下拉式列表框?qū)ο蟮饺萜魃?/p>

cbx.addItemListener(this);//注冊(cè)監(jiān)聽(tīng)器對(duì)象到事件源

ctp.add(lb2);

ctp.add(lb3);

}publicvoiditemStateChanged(ItemEvente)

{

intc=0;

Stringstr=((); //獲取所選項(xiàng)給str

for(inti=0;i<name.length;i++)

if(str.equals(name[i])) //判斷str是否是name數(shù)組中某個(gè)元素的內(nèi)容

c=(); //將該選項(xiàng)的下標(biāo)給c

lb3.setText(score[c]); //獲取該學(xué)生的成績(jī)

}

}程序說(shuō)明:下拉式列表框產(chǎn)生ItemEvent代表的選擇事件。該程序中的語(yǔ)句“cbx.addItemListener(this);”表示注冊(cè)監(jiān)聽(tīng)器對(duì)象到事件源。當(dāng)用戶單擊下拉列表中的某個(gè)選項(xiàng)時(shí),系統(tǒng)自動(dòng)產(chǎn)生一個(gè)包含這個(gè)事件有關(guān)信息的ItemEvent類e的對(duì)象,并把該對(duì)象作為實(shí)際參數(shù)傳遞給被自動(dòng)調(diào)用的監(jiān)聽(tīng)器的選擇事件響應(yīng)方法itemStateChanged(ItemEvente)。在這個(gè)方法中通過(guò)調(diào)用ItemEvent事件的方法(?)獲得引發(fā)當(dāng)前選擇事件的下拉列表事件源(被選中的項(xiàng)),調(diào)用getSelectedIndex(?)獲取該選項(xiàng)的下標(biāo)值,從而得到name數(shù)組的下標(biāo)值,最終將這個(gè)元素的內(nèi)容作為新的標(biāo)簽文本輸出。

該程序的運(yùn)行結(jié)果見(jiàn)圖。圖10.15程序C10_10的運(yùn)行結(jié)果10.8JList組件

JList稱為列表組件,它將所有選項(xiàng)放入列表框中。如果將JList放入滾動(dòng)面板(JScrollPane)中,則會(huì)出現(xiàn)滾動(dòng)菜單效果。利用JList提供的成員方法,用戶可以指定顯示在列表框中的選項(xiàng)個(gè)數(shù),而多余的選項(xiàng)則可通過(guò)列表的上下滾動(dòng)來(lái)顯現(xiàn)。

JList組件與JComboBox組件的最大區(qū)別是:JComboBox組件一次只能選擇一項(xiàng),而JList組件一次可以選擇一項(xiàng)或多項(xiàng)。選擇多項(xiàng)時(shí)可以是連續(xù)區(qū)間選擇(按住Shift鍵進(jìn)行選擇),也可以是不連續(xù)的選擇(按住Ctrl鍵進(jìn)行選擇)。10.8.1JList類的構(gòu)造方法和成員方法

表列出了JList類對(duì)象的構(gòu)造方法和常用的成員方法。表10.15JList類的構(gòu)造方法和常用的成員方法

10.8.2ListSelectionEvent事件及其響應(yīng)

JList組件的事件處理一般可分為兩種:一種是當(dāng)用戶單擊列表框中的某一個(gè)選項(xiàng)并選中它時(shí),將產(chǎn)生ListSelectionEvent類的選擇事件,此事件是Swing的事件;另一種是當(dāng)用戶雙擊列表框中的某個(gè)選項(xiàng)時(shí),則產(chǎn)生MouseEvent類的動(dòng)作事件。

若希望實(shí)現(xiàn)JList的ListSelectionEvent事件,首先必須聲明實(shí)現(xiàn)監(jiān)聽(tīng)器的接口類ListSelectionListener,并通過(guò)JList類的addListSelectionListener(?)方法將監(jiān)聽(tīng)器對(duì)象注冊(cè)到事件源中;其次,在ListSelectionListener接口的valueChanged(ListSelectionEvente)方法體中寫入有關(guān)代碼。這樣就可以響應(yīng)ListSelectionEvent事件了。

下面通過(guò)示例程序來(lái)加以說(shuō)明。10.8.3應(yīng)用舉例

【示例程序C10_11.java】設(shè)置

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論