![面向?qū)ο蟮某绦蛟O(shè)計java張白一第三版第10章_第1頁](http://file4.renrendoc.com/view/41bd7c5465f4743f367a9e9ab078e389/41bd7c5465f4743f367a9e9ab078e3891.gif)
![面向?qū)ο蟮某绦蛟O(shè)計java張白一第三版第10章_第2頁](http://file4.renrendoc.com/view/41bd7c5465f4743f367a9e9ab078e389/41bd7c5465f4743f367a9e9ab078e3892.gif)
![面向?qū)ο蟮某绦蛟O(shè)計java張白一第三版第10章_第3頁](http://file4.renrendoc.com/view/41bd7c5465f4743f367a9e9ab078e389/41bd7c5465f4743f367a9e9ab078e3893.gif)
![面向?qū)ο蟮某绦蛟O(shè)計java張白一第三版第10章_第4頁](http://file4.renrendoc.com/view/41bd7c5465f4743f367a9e9ab078e389/41bd7c5465f4743f367a9e9ab078e3894.gif)
![面向?qū)ο蟮某绦蛟O(shè)計java張白一第三版第10章_第5頁](http://file4.renrendoc.com/view/41bd7c5465f4743f367a9e9ab078e389/41bd7c5465f4743f367a9e9ab078e3895.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第10章常用組件GUI設(shè)計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類來完成的。Java在布局管理上采用了容器和布局管理相分離的方案。也就是說,容器只管將組件放入其中,而不管這些組件放置在容器中的位置和大小,而將布局的管理任務(wù)交給專門的布局管理器接口類(LayoutManager)的實現(xiàn)類來完成。每個容器都有一個缺省的布局管理器,當(dāng)容器需要對某個組件進行定位或判斷其尺寸大小時,就會調(diào)用其相應(yīng)的布局管理器。當(dāng)然也可以不用缺省的布局管理器,而是通過setLayout(?)方法來為其指定新的布局管理器。一旦確定了布局管理方式,容器的組件就可以使用add(?)方法加入組件了。包中共定義了五種布局管理器類,分別是BorderLayout、FlowLayout、CardLayout、GridLayout和GridBagLayout。這五個類都是類的直接子類,且每個布局管理器對應(yīng)一種布局策略。
包中定義了4種布局管理器,分別是BoxLayout、ScrollPaneLayout、ViewportLayout和OverlayLayout。
下面介紹BorderLayout、FlowLayout、CardLayout、GridLayout和BoxLayout這幾種常用的布局策略。
類是類的直接子類。BorderLayout的布局策略是把容器內(nèi)的空間劃分為如圖所示的東、西、南、北、中五個區(qū)域。每個區(qū)域最多只能包含一個組件,并通過相應(yīng)的常量NORTH、SOUTH、EAST、WEST、CENTER進行標(biāo)識。BorderLayout是JApplet的默認布局模式。布局方式是根據(jù)組件大小和容器大小的約束對組件進行布局。NORTH和SOUTH組件可以在水平方向上拉伸,而EAST和WEST組件可以在垂直方向上拉伸,CENTER組件在水平和垂直方向上都可拉伸,從而填充所有剩余空間。如果某個區(qū)域沒有分配組件,則其他組件可以占據(jù)它的空間。圖10.1BorderLayout布局策略BorderLayout類有兩個構(gòu)造方法。
(1)BorderLayout(?)方法:用于創(chuàng)建一個各組件間的水平、垂直間隔均為0的BorderLayout類的對象。
(2)?BorderLayout(inthgap,intvgap)方法:用于創(chuàng)建一個各組件間的水平間隔為hgap、垂直間隔為vgap的BorderLayout類的對象。
BorderLayout僅指定了五個區(qū)域的位置,如果容器中需要加入的組件超過五個,就必須使用容器的嵌套或改用其他的布局策略。
【示例程序C10_1.java】使用BorderLayout的布局策略在五個位置分別加入四個按鈕和一個標(biāo)簽,當(dāng)點擊按鈕時,標(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”),);
}
}
該程序的運行結(jié)果如圖所示。圖10.2程序C10_1運行結(jié)果程序說明:
(1)“Containercp=getContentPane(?);”語句表示創(chuàng)建一個返回此窗體的contentPane對象。該對象的布局為BorderLayout。
(2)“cp.add(newJButton("North"),);”語句表示容器按照BorderLayout的布局策略,創(chuàng)建一個標(biāo)簽為“North”的按鈕對象,將其添加到的NORTH區(qū)域。add(?)方法是Container類提供的方法,表示將組件添加到容器中。
注意:若沒有設(shè)置組件的相關(guān)位置,BorderLayout將以Center作為默認值。當(dāng)兩個組件被安排在相同位置時,將會出現(xiàn)位置錯誤,但系統(tǒng)不給予提示。10.1.2FlowLayout
類是類的直接子類。FlowLayout的布局策略是按照加入容器中的組件的先后順序從左向右排列,當(dāng)一行排滿之后就轉(zhuǎn)到下一行繼續(xù)從左至右排列,每一行中的組件都居中排列。FlowLayout是Applet缺省使用的布局編輯模式。
FlowLayout類有三個構(gòu)造方法。
(1)?FlowLayout(?)方法:用于創(chuàng)建一個版面設(shè)定為居中對齊、各組件的水平及垂直間隔為5個像素點的FlowLayout類的對象。(2)?FlowLayout(intalign)方法:用于創(chuàng)建一個版面按給出的align值對齊,各組件的水平及垂直間隔為5個像素的對象。align的值可以是1或(居中對齊)、2或(右對齊)、3或(左對齊)方式。
(3)?FlowLayout(intalign,inthgap,intvgap)方法:用于創(chuàng)建一個既指定對齊方式,又指定組件間間隔的FlowLayout類的對象。參數(shù)align的作用及取值同上,參數(shù)hgap指定組件間的水平間隔,參數(shù)vgap指定各組件間的垂直間隔,間隔單位為像素點值。對于一個原本不使用FlowLayout布局編輯器的容器,若需要使用該布局策略,可以用setLayout(newFlowLayout(?))方法設(shè)置。該方法是所有容器的父類Container的方法,用于為容器設(shè)定布局編輯器。
【示例程序C10_2.java】使用FlowLayout的布局策略,在容器中放入三個按鈕。
import.*;
import.*;
publicclassC10_2extendsJApplet
{Containercp=getContentPane(?); //創(chuàng)建一個返回此窗體的ContentPane對象
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);
}
}
該程序的運行結(jié)果如圖所示。圖是使用FlowLayout(3)構(gòu)造方法的效果。圖10.3程序C10_2運行結(jié)果圖10.4使用FlowLayout(3)時的情況10.1.3CardLayout
CardLayout的版面布局方式是將每個組件看成一張卡片,如同撲克牌一樣將組件堆疊起來,而每次顯示在屏幕上的只能是最上面的一個組件,這個被顯示的組件將占據(jù)所有的容器空間。當(dāng)容器第一次顯示時,第一個添加到CardLayout對象的組件為可見組件。程序中可通過表所示的方法選擇顯示其中的卡片。表10.1CardLayout類的常用成員方法
CardLayout類有兩個構(gòu)造方法。
(1)?CardLayout(?)方法:使用默認(間隔為0)方式創(chuàng)建一個CardLayout(?)類對象。
(2)?CardLayout(inthgap,intvgap)方法:使用hgap指定的水平間隔和vgap指定的垂直間隔創(chuàng)建一個CardLayout(?)類對象。
CardLayout類的常用成員方法見表。
【示例程序C10_3.java】使用CardLayout的布局在容器中放入三個按鈕,顯示第二個按鈕。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
}
}
該程序的運行結(jié)果如圖所示。
注意:在程序中語句“add("a",bt1);”中的字符串“a”是為組件分配的字符串名字,其目的是讓布局管理器根據(jù)名字調(diào)用要顯示的組件。圖10.5程C10_3的運行結(jié)果10.1.4GridLayout
如果界面上需要放置的組件較多,且這些組件的大小又基本一致(例如計算器、遙控器的面板)時,使用GridLayout的布局策略是最佳的選擇。GridLayout的布局策略是把容器分成大小相等的矩形,一個矩形中放置一個組件,而每個組件按添加的順序從左向右、從上向下地占據(jù)這些網(wǎng)格。
GridLayout類有三種構(gòu)造方法。
(1)?GridLayout(?)方法:按默認(1行1列)方式創(chuàng)建一個GridLayout布局。
(2)?GridLayout(introws,intcols)方法:創(chuàng)建一個具有rows行、cols列的GridLayout布局。(3)?GridLayout(introws,intcols,inthgap,intvgap)方法:按指定的行數(shù)rows、列數(shù)cols、水平間隔hgap和垂直間隔vgap創(chuàng)建一個GridLayout布局。
【示例程序C10_4.java】使用GridLayout的布局策略,在容器中放入4個按鈕。
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”));
}
}
該程序的運行結(jié)果如圖所示。圖10.6程序C10_4的運行結(jié)果10.1.5BoxLayout
BoxLayout是Swing所提供的布局管理器,它的繼承關(guān)系如下:
BoxLayout只有兩種排列方式,一種是水平方式,另一種是垂直方式。我們可以使用BoxLayout所提供的兩個常量X_AXIS、Y_AXIS來指明組件在容器中是水平還是垂直排列的。BoxLayout類與Box類結(jié)合,可以提供多樣化的布局。通常的做法是使用若干個Box容器,由于Box容器的默認布局是BoxLayout,而且只能使用這個布局,因此,每一個Box容器中組件的排列方式也只能按水平或垂直方式排列。1.BoxLayout和Box的構(gòu)造函數(shù)
創(chuàng)建BoxLayout類的對象的構(gòu)造方法是:
BoxLayout(Containertarget,intaxis)
其中,target是容器對象;axis指明target中組件的排列方式,其值可為表示水平排列的,或為表示垂直排列的。
Box類的構(gòu)造方法是:
Box(intaxis)
這個構(gòu)造方法中的axis參數(shù)用以指定Box中的組件是按水平還是垂直方式排列的。axis的值可以用或指定,也可使用Box類提供的兩個方法creatHorizontalBox(?)與creatVerticalBox(?)來指定。2.BoxLayout類和Box類的常用成員方法
表列出了BoxLayout類和Box類的常用成員方法。
為方便布局管理,Box類還提供了4種透明組件Glue、Strut、Rigid和Filler,可以將這些透明組件插入其他組件的中間,使各個組件產(chǎn)生分開的效果。這4種透明組件的作用分別如下。
(1)?Glue:將Glue兩邊的組件擠到容器的兩端。
(2)?Strut:將Strut兩端的組件按水平或垂直方向指定的大小分開。表10.2BoxLayout類和Box類的常用成員方法
(3)?Rigid:可以設(shè)置二維的限制,將組件按水平或垂直方向指定的大小分開。
(4)?Filler:不僅可以設(shè)置二維的限制,將組件按水平或垂直方向指定的大小分開,而且還可以設(shè)置最大、較佳、最小的長寬大小。
這4種組件的具體用法請參閱示例程序和。3.使用BoxLayout時需要注意的事項
(1)當(dāng)組件按BoxLayout布局排列好后,不管窗口縮小或放大都不會變動。
(2)當(dāng)使用水平排列方式時,若放進去的組件不等高,則系統(tǒng)將會使所有的組件與最高組件等高。
(3)當(dāng)放在同一行的組件超出容器的寬度時,系統(tǒ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(?));
}
}
該程序的運行結(jié)果如圖所示。圖10.7程序C10_51的運行結(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è)置按鈕的最大長度
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);
);
}
}
該程序的運行結(jié)果如圖所示。圖10.8程序C10_52的運行結(jié)果10.2窗口與面板容器
10.2.1JFrame容器
JFrame是JavaApplication程序的圖形用戶界面容器,是帶有標(biāo)題和邊框的頂層窗口。窗體的默認布局為BorderLayout。JFrame類包含支持任何通用窗口特性的基本功能,如最小化窗口、移動窗口、重新設(shè)定窗口大小等。JFrame容器作為頂層容器,不能被其他容器所包含,但可以被其他容器創(chuàng)建并彈出成為獨立的容器。JFrame類的繼承關(guān)系如下:
使用JFrame容器時需要注意以下幾點:
(1)可以使用JFrame(?)方法創(chuàng)建一個無標(biāo)簽的JFrame對象,也可以使用JFrame(Stringtitle)方法創(chuàng)建一個標(biāo)簽為title的JFrame對象,還可以使用專門的方法getTitle(?)和setTitle(String)來獲取或指定JFrame的標(biāo)題。(2)使用setSize(intx,inty)方法設(shè)置JFrame容器的大小。
(3)創(chuàng)建的JFrame是不可見的,若要使其可見,則需要使用給出實際參數(shù)為true的setVisible(boolean)方法。
(4)向JFrame中添加組件時,必須先取得ContentPane,然后再使用add(?)方法把組件加入到此ContentPane中,而不能像AWT中的Frame那樣直接調(diào)用add(?)方法。
(5)?JFrame類可以引發(fā)WindowEvent類代表的所有七種窗口事件(見第11章)。(6)每個JFrame在其右上角都有三個控制圖標(biāo)(如圖所示),分別代表最小化、最大化和關(guān)閉窗口的操作。其中,JFrame可自動完成窗口的最小化和最大化操作,而關(guān)閉窗口的操作不能通過點擊關(guān)閉圖標(biāo)來實現(xiàn),但可以使用下述三個方法之一來關(guān)閉窗口:
①設(shè)置一個按鈕,當(dāng)用戶點擊此按鈕時關(guān)閉窗口;
②用WINDOWS_CLOSING事件做出響應(yīng),關(guān)閉窗口;
③使用菜單命令。
無論使用哪一種方法,都需要用到關(guān)閉JFrame的System.exit(0)方法。下面通過示例程序來說明JFrame容器的使用。
【示例程序C10_6.java】創(chuàng)建一個窗口并顯示。
import.*;
import.*;
publicclassC10_6
{
publicC10_6(?)
{//CreateandsetuptheJFrame
JFramef=newJFrame(“FrameDemo”);
);
JLabellb=newJLabel(“這是JFrame”);
lb.setPreferredSize(newDimension(175,100));(?).);
(); //調(diào)整窗口
f.setVisible(true); //顯示這個JFrame
}
publicstaticvoidmain(String[?]args)
{C10_6cc=newC10_6(?);
}
}
該程序的運行結(jié)果如圖所示。圖10.9程序C10_6的運行結(jié)果程序說明:
(1)程序中的“);”語句表示設(shè)置用戶在此窗體上發(fā)起“close”時默認執(zhí)行的操作。
(2)“(?).);”語句表示添加標(biāo)簽對象到返回此窗體的ContentPane對象容器中。10.2.2JPanel容器
在設(shè)計用戶界面時,為了更合理地安排各組件在窗口的位置,可以考慮將所需組件先排列在一個容器中,然后將其作為一個整體嵌入窗口。Panel和JPanel就是這樣一類被稱為面板的容器。它們是一類無邊框的,不能被移動、放大、縮小或關(guān)閉的容器。AWT中的Panel與Swing中的JPanel的區(qū)別是:JPanel支持雙緩沖(DoubleBuffering)功能,在處理動畫上較少發(fā)生畫面閃爍的情況。JPanel類的繼承關(guān)系如下:
不能把JPanel作為一個圖形界面程序最底層的容器,也不能指明JPanel的大小。JPanel總是作為一個容器組件被加入到JFrame、JApplet等其他容器中,當(dāng)然,JPanel也可以加入到JPanel容器中。JPanel的大小由包含在它里邊的組件、包容它的那個容器的布局策略,以及該容器中的其他組件所決定。
建立一個JPanel時,首先使用表中所列JPanel類構(gòu)造方法創(chuàng)建JPanel類的對象,然后調(diào)用setLayout(?)方法設(shè)置組件在面板上的排列方式,最后將所需組件加入面板。表10.3JPanel類的構(gòu)造方法
【示例程序C10_7.java】創(chuàng)建一個JFrame窗口對象和兩個JPanel面板對象,將面板對象添加到窗口對象中。
import.*;
import.*;
publicclassC10_7extendsJFrame
{JLabel[]lb=newJLabel[3]; //創(chuàng)建標(biāo)簽數(shù)組
JPanelpa1=newJPanel(); //創(chuàng)建面板對象
JPanelpa2=newJPanel(newGridLayout(1,2));
publicC10_7()
{setLayout(newGridLayout(2,1));
for(inti=0;i<;i++) //設(shè)置每個標(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)簽顏色顯示出來
}
pa1.add(lb[0]); //加載第0個標(biāo)簽在面板上
pa2.add(lb[1],BorderLayout.NORTH);//加載第1個標(biāo)簽在面板上
pa2.add(lb[2],BorderLayout.SOUTH);//加載第2個標(biāo)簽在面板上
add(pa1); //將pa1的對象添加到cc的對象中
add(pa2);
setTitle("JPanelDemo");pack();
setVisible(true);
}
publicstaticvoidmain(String[]arg)
{
C10_7cc=newC10_7();
}
}
該程序的運行結(jié)果如圖所示。
程序說明:在JFrame容器cc的對象中放入了pa1和pa2的對象,pa1的對象中放入了一個標(biāo)簽組件,pa2的對象中放入了兩個標(biāo)簽組件。圖10.10程序C10_7的運行結(jié)果10.3事件響應(yīng)原理
設(shè)計并實現(xiàn)圖形用戶界面的工作主要有兩方面:一是創(chuàng)建組成界面的各種成分和元素,指定它們的屬性和位置關(guān)系,根據(jù)具體需要排列它們,從而構(gòu)成完整的圖形用戶界面的物理外觀;二是定義圖形用戶界面的事件和各界面元素對不同事件的響應(yīng),從而實現(xiàn)圖形用戶界面與用戶的交互功能。圖形用戶界面之所以能為廣大用戶所喜愛并最終成為事實上的標(biāo)準(zhǔn),很重要的一點就在于圖形用戶界面的事件驅(qū)動機制,它可以根據(jù)產(chǎn)生的事件來決定執(zhí)行相應(yīng)的程序段。事件(Event)代表了某對象可執(zhí)行的操作及其狀態(tài)的變化。例如,在圖形用戶界面中,用戶可以通過移動鼠標(biāo)對特定圖形界面元素進行單擊、雙擊等操作來實現(xiàn)輸入/輸出操作。10.3.1委托事件模型
Java采用委托事件模型來處理事件。委托事件模型由事件源、事件(Event)及事件監(jiān)聽器(Listener)組成。委托事件模型的特點是將事件的處理委托給事件監(jiān)聽器,而不是組件本身。
1.事件源與事件
如果在一個圖形用戶界面上,點擊按鈕后改變了界面上的內(nèi)容,這就意味著這個界面上的按鈕組件可以觸發(fā)一個事件。我們稱這個按鈕組件是事件源。因此,事件源是能夠接收外部事件的源體(一些組件),是事件的產(chǎn)生者。事件源會在事件產(chǎn)生時,將與該事件及事件源相關(guān)的信息封裝在事件中。當(dāng)事件被觸發(fā)時,事件將被一個或多個“事件監(jiān)聽器”接收,事件監(jiān)聽器負責(zé)處理事件。所以,事件發(fā)生的地方可以與事件處理的地方分離開。
2.事件監(jiān)聽器
事件監(jiān)聽器是實現(xiàn)事件監(jiān)聽的接口類。事件監(jiān)聽器不斷地監(jiān)聽事件源的動作,當(dāng)事件源產(chǎn)生一個事件,監(jiān)聽器接收到事件源的通知后,就調(diào)用特定的方法執(zhí)行指定的動作。3.委托事件模型的實現(xiàn)步驟
委托事件模型的實現(xiàn)步驟如下:
(1)建立事件源對象;
(2)為事件源對象選擇合適的事件監(jiān)聽器;
(3)為監(jiān)聽器添加適當(dāng)?shù)奶幚矸椒ǎ?/p>
(4)為監(jiān)聽器與事件源建立聯(lián)系。10.3.2事件類的繼承關(guān)系
包中提供了處理由組件所激發(fā)的各類事件的接口和類。常用事件類的繼承關(guān)系如圖所示。
Java中的事件類可分為高級事件類和低級事件類。低級事件是基于組件和容器的事件。常見的低級事件類是ComponentEvent(組件事件)和ContainerEvent(容器事件)。高級事件是基于語義的事件,它可以不和特定的動作相關(guān)聯(lián),而是依賴于觸發(fā)此事件的類。常見的高級事件是ActionEvent(動作事件)、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)聽器
Swing組件是構(gòu)建在AWT庫之上的、具有一些改進功能的Swing組件庫。由于Swing組件庫的功能改進覆蓋于AWT核心事件處理特性之上,由基本的動作監(jiān)聽到焦點管理,從而使得Swing組件的事件處理更為簡單。
所有的Swing組件都是的子類,它們具有如下繼承關(guān)系:
的各種Swing組件(見圖9.2)因此,可以利用類與類提供的事件及事件監(jiān)聽器來處理諸如鼠標(biāo)和鍵盤操作等低級事件。
不同事件需要不同的事件監(jiān)聽器(接口類),事件與事件監(jiān)聽器之間的關(guān)系如表所示。監(jiān)聽器要用對應(yīng)的處理方法來處理事件。而每個監(jiān)聽器都有相應(yīng)的成員方法,我們處理事件的程序代碼要寫在對應(yīng)的成員方法體中。表列出了各事件監(jiān)聽器與各成員方法之間的對應(yīng)關(guān)系。表10.5事件與事件監(jiān)聽器之間的關(guān)系
表10.6各事件監(jiān)聽器與各成員方法之間的關(guān)系10.4JLable組件
JLable組件被稱為標(biāo)簽,它是一個靜態(tài)組件,也是標(biāo)準(zhǔn)組件中最簡單的一個組件。每個標(biāo)簽用一個標(biāo)簽類的對象表示,可以顯示一行靜態(tài)文本。標(biāo)簽只起信息說明的作用,而不接受用戶的輸入,也無事件響應(yīng)。
創(chuàng)建JLable類對象的構(gòu)造方法如表所示。
當(dāng)創(chuàng)建了一個標(biāo)簽對象后,就可以引用JLable類的成員方法重新設(shè)置標(biāo)簽,或獲取標(biāo)簽信息。JLable類的常用成員方法如表所示。表10.7JLable類對象的構(gòu)造方法
表10.8JLable類的常用成員方法
10.5JButton組件與JToggleButton組件
JButton組件與JToggleButton組件通常被稱為按鈕,它是一個具有按下、抬起兩種狀態(tài)的組件。用戶可以指定按下按鈕(單擊事件)時所執(zhí)行的操作(事件響應(yīng))。按鈕上通常有一行文字(標(biāo)簽)或一個圖標(biāo)以表明它的功能。此外,Swing組件中的按鈕還可以實現(xiàn)下述效果:
(1)改變按鈕的圖標(biāo),即一個按鈕可以有多個圖標(biāo),可根據(jù)Swing按鈕所處的狀態(tài)而自動變換不同的圖標(biāo)。(2)為按鈕加入提示,即當(dāng)鼠標(biāo)在按鈕上稍做停留時,在按鈕邊可出現(xiàn)提示,當(dāng)鼠標(biāo)移出按鈕時,提示自動消失。
(3)在按鈕上設(shè)置快捷鍵。
(4)設(shè)置默認按鈕,即通過回車鍵運行此按鈕的功能。
10.5.1常用組件的繼承關(guān)系
由于本章所述組件所使用的成員方法主要是繼承自其直接父類或更高層父類的成員方法,為了正確地使用這些組件,有必要了解每個組件的繼承關(guān)系。本章所述組件的繼承關(guān)系如下:
.JRadioButton其中,AbstractButton類是一個抽象類,這個類提供了許多組件需要使用的成員方法和事件驅(qū)動方法。
10.5.2AbstractButton類的常用成員方法
按照面向?qū)ο笾谐橄笈c繼承的原則,Java在AbstractButton類中提供了許多成員方法,為其子類繼承和使用提供了方便。表列出了該類的常用成員方法。表10.9AbstractButton類的常用成員方法
10.5.3JButton類的構(gòu)造方法
按鈕可分為有、無文本的和有、無圖標(biāo)的等幾種情況,因此,系統(tǒng)提供了表所示的JButton類的構(gòu)造方法來創(chuàng)建這幾種按鈕對象。
10.5.4JToggleButton類的構(gòu)造方法
JToggleButton按鈕與JButton按鈕的區(qū)別僅在于:當(dāng)按下JButton按鈕并釋放鼠標(biāo)后,按鈕會自動彈起;當(dāng)按下JToggleButton按鈕并釋放鼠標(biāo)后,按鈕不會自動彈起,除非再按一次。表列出了JToggleButton類的構(gòu)造方法。表10.10JButton類的構(gòu)造方法
表10.11JToggleButton類的構(gòu)造方法
10.5.5ActionEvent事件及其響應(yīng)
從表、表和表可以得到ActionEvent事件類與事件源和事件監(jiān)聽器之間的關(guān)系。如果希望在所設(shè)計的用戶界面上利用按鈕激發(fā)一個動作事件,利用Java的委托事件模型處理這個事件,則需要了解ActionEvent事件及其響應(yīng)原理。
1.ActionEvent事件
ActionEvent事件是發(fā)生了組件定義的動作的語義事件,簡稱為動作事件。能觸發(fā)這個事件的動作包括:單擊一個按鈕,雙擊一個列表中的選項,選擇了一個菜單項,在文本框中輸入回車等。2.獲取事件源的方法
要處理事件必須要得到事件源,有兩種方法可以得到事件源。
(1)?getActionCommand(?)方法:是ActionEvent類的方法,用來獲取事件源對象的標(biāo)簽或事先為這個對象設(shè)置的命令名。
(2)?getSource(?)方法:是EventObject類的方法,該類是ActionEvent類的父類,用來獲取最初發(fā)生事件的事件源對象。3.動作事件的響應(yīng)
我們用單擊按鈕觸發(fā)事件并處理該事件的過程來說明動作事件的響應(yīng)原理。如果要使按鈕能夠觸發(fā)ActionEvent事件,需要做下面一些工作:
首先,創(chuàng)建一個按鈕對象,引用按鈕的AbstractButton類的addActionListener(?)方法,將一個ActionListener對象添加到按鈕中,即為按鈕注冊監(jiān)聽器(ActionListener)對象,以接收按鈕觸發(fā)的事件。
其次,在程序的監(jiān)聽器的actionPerformed(?)方法中編寫事件的處理程序。這樣,當(dāng)用戶單擊按鈕時,則觸發(fā)了ActionEvent事件。該事件被傳遞給ActionListener監(jiān)聽器對象,監(jiān)聽器對象引用它的actionPerformed(?)方法來完成事件響應(yīng)。
ActionEvent事件處理程序的結(jié)構(gòu)如下。
(1)將響應(yīng)動作事件所需要的業(yè)務(wù)邏輯封裝在實現(xiàn)監(jiān)聽器接口的類中:
ClassClickActionimplementsActionListener
{
publicvoidactionPerformed(ActionEvente)
{
//響應(yīng)動作事件所需要的業(yè)務(wù)邏輯
}
}在actionPerformed(?)方法體中寫入處理此事件的程序代碼。在方法體中可以引用ActionEvent事件的getSource(?)方法來獲取引發(fā)事件的對象,也可以引用getActionCommand(?)方法來獲取對象標(biāo)簽或事先為這個對象設(shè)置的命令名。
(2)創(chuàng)建事件源并注冊完成所需業(yè)務(wù)邏輯的監(jiān)聽器:
ActionListenerclick=newClickAction(?);//創(chuàng)建監(jiān)聽器對象
JButtonbtn=newJButton(?); //創(chuàng)建按鈕對象
btn.addActionListener(click);
//注冊監(jiān)聽器對象
這樣,當(dāng)事件發(fā)生時,注冊的監(jiān)聽器對象就可以接收來自事件源的事件。(3)引用監(jiān)聽器的actionPerformed(?)方法來完成事件響應(yīng)。
下面通過一個具體的程序來說明按鈕的事件響應(yīng)。10.5.6應(yīng)用舉例
【示例程序C10_8.java】編寫一個單擊按鈕時改變標(biāo)簽文本與按鈕文本的內(nèi)容的程序。
packagech10;
import.*;
import.*r;
import.*;
//聲明該類實現(xiàn)ActionListener接口,監(jiān)聽器對象是C10_8類的對象
publicclassC10_8extendsJAppletimplementsActionListener{Containercp=getContentPane();//創(chuàng)建窗口容器對象
Iconro=newImageIcon(getClass().getResource("/image/G1.gif"));//創(chuàng)建圖標(biāo)對象
Iconge=newImageIcon(getClass().getResource("/image/G2.gif"));
Iconpr=newImageIcon(getClass().getResource("/image/G3.gif"));
JButtonbt=newJButton();//創(chuàng)建按鈕對象
Iconicon=newImageIcon(getClass().getResource("/image/G4.jpg"));
JLabellb=new);//創(chuàng)建標(biāo)簽對象
publicvoidinit(){
bt.setRolloverEnabled(true);//將按鈕圖標(biāo)變化功能打開
bt.setText("OK");//添加按鈕文本
);//將按鈕文字放在圖標(biāo)中間
);//設(shè)置按鈕文字在圖標(biāo)下方
);//添加標(biāo)簽在JApple界面的北部位置上
);
bt.setIcon(ge);//設(shè)置鼠標(biāo)離開按鈕的圖標(biāo)
bt.setRolloverIcon(ro);//設(shè)置鼠標(biāo)在按鈕上的圖標(biāo)
bt.setPressedIcon(pr);//設(shè)置鼠標(biāo)按下按鈕的圖標(biāo)
bt.addActionListener(this);//注冊監(jiān)聽器對象到事件源
}publicvoidactionPerformed(ActionEvente)
{//actionPerformed()方法在單擊bt時被系統(tǒng)自動調(diào)用
()==bt)//判斷動作事件是否由bt引發(fā)的
{
if("()))//修改標(biāo)簽文本
("你好!");
else
lb.setText("Hello");
()))//修改按鈕文本
("確定"); else
bt.setText(“OK”);
}
}
}
該程序的運行結(jié)果如圖所示。(a)鼠標(biāo)單擊前的結(jié)果(b)鼠標(biāo)單擊后的結(jié)果圖10.12程序C10_8的運行結(jié)果程序說明:
(1)?當(dāng)向JApplet中添加Swing組件時要使用JApplet的getContentPane(?)方法獲得一個Container對象,再引用這個Container對象的add(?)方法將JComponent及其子類對象添加到JApplet中。
(2)程序中創(chuàng)建的按鈕有一個圖標(biāo),根據(jù)鼠標(biāo)的移動來改變圖標(biāo)。
(3)publicclassC10_8extendsJAppletimplementsActionListener中的ActionListener接口類僅僅包含了一個抽象方法actionPerformed(ActionEvente)。ActionEvent類e的對象代表產(chǎn)生的動作事件。當(dāng)單擊按鈕觸發(fā)一個動作事件時,注冊的監(jiān)聽器對象就可以接收來自事件源的事件,并調(diào)用actionPerformed(ActionEvente)方法對該事件進行處理。在方法體中調(diào)用(?)方法來獲取引發(fā)事件的事件源(按鈕)對象。(4)為事件源注冊監(jiān)聽器對象,注冊的監(jiān)聽器對象就可以接收來自事件源的事件。在這個程序中,bt是事件源,使用bt.addActionListener(this)來注冊監(jiān)聽器對象。其中this為監(jiān)聽器對象,addActionListener()方法是AbstractButton類提供的方法。
(5)程序中使用了AbstractButton類的成員方法,詳細描述見表。
(6)圖片(image)文件夾的位置在圖所示的src中。程序中加載圖片的語句是:
newImageIcon(getClass(?).getResource("/image/G1.gif"));
該語句表示通過得到類的對象的給定名稱(本例中是/image/G1.gif)的資源,創(chuàng)建一個圖標(biāo)對象。圖10.13image文件夾的位置10.6JCheckBox和JRadioButton組件
JCheckBox組件被稱為復(fù)選框(也稱檢測框),它提供“選中/ON”和“未選中/OFF”兩種狀態(tài)。用戶點擊某復(fù)選框就會改變該復(fù)選框原有的狀態(tài)。JRadioButton組件被稱為選項按鈕,在Java中JRadioButton組件與JCheckBox組件功能完全一樣,只是圖形不同,復(fù)選框為方形圖標(biāo),選項按鈕為圓形圖標(biāo)。由于目前所使用軟件的RadioButton多為單選按鈕,即在同類的一組組件中,用戶只能選擇其中之一為ON,其余為OFF。Java為了與其他系統(tǒng)保持一致,專門提供了類,這個類的功能就是實現(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)造方法見表。表10.12JCheckBox類的構(gòu)造方法
表10.13JRadioButton類的構(gòu)造方法
10.6.3ItemEvent事件及其響應(yīng)
從表、表和表可以得到ItemEvent事件類與事件源和事件監(jiān)聽器之間的關(guān)系。如果希望在所設(shè)計的用戶界面上利用復(fù)選框激發(fā)一個選擇事件,利用Java的委托事件模型處理這個事件,則需要了解ItemEvent事件及其響應(yīng)原理。
1.ItemEvent事件
ItemEvent事件是事件源的選項被選定或取消的語義事件(簡稱為選擇事件),是在用戶已選中選定項或取消選定項時由ItemSelectable對象(例如,復(fù)選框)生成的。引發(fā)這類事件的動作包括:(1)改變復(fù)選框JCheckBox對象的選中或不選中狀態(tài);
(2)改變單選按鈕JRadioButton對象的選中或不選中狀態(tài);
(3)改變下拉列表框JComboBox對象中選項的選中或不選中狀態(tài);
(4)改變菜單項JMenuItem對象中選項的選中或不選中狀態(tài);
(5)改變JCheckBoxMenuItem對象中選項的選中或不選中狀態(tài)。2.獲取ItemEvent事件源的方法
得到ItemEvent事件源主要有三個方法。
(1)?ItemSelectablegetItemSelectable(?)方法:是ItemEvent類的方法,用來獲取返回產(chǎn)生事件的ItemSelectable對象,例如JCheckBox中選擇的項。此外,ItemEvent事件也可以使用其父類EventObject類提供的getSource(?)方法返回引發(fā)選中狀態(tài)變化的事件源。(2)?ObjectgetItem(?)方法:是ItemEvent類的方法,用來獲取返回受事件影響的項,例如JComboBox中的具體item。通過調(diào)用這個方法可以知道用戶選中了哪個選項。
(3)?intgetStateChange(?)方法:是ItemEvent類的方法,用來獲取返回狀態(tài)更改的類型(已選定或已取消選定)。通常用ItemEvent類的靜態(tài)常量SELECTED(代表選項被選中)和DESELECTED(代表選項被放棄或不選)來表達。3.選擇事件的響應(yīng)
我們用復(fù)選框選擇觸發(fā)事件并處理該事件的過程來說明選擇事件的響應(yīng)原理。如果要使復(fù)選框能夠觸發(fā)ItemEvent事件,應(yīng)該做下述工作:
首先,創(chuàng)建一組復(fù)選框?qū)ο?,引用?fù)選框的AbstractButton類的addItemListener(?)方法,將一個ItemListener對象添加到復(fù)選框中,即為復(fù)選框注冊監(jiān)聽器(ItemListener)對象,以接收復(fù)選框觸發(fā)的事件。
其次,在程序的監(jiān)聽器的itemStateChanged(?)方法中編寫事件的處理程序。這樣就可以選擇復(fù)選框組件時觸發(fā)ItemEvent事件了。該事件被傳遞給ItemListener監(jiān)聽器對象,它避開處理具體鼠標(biāo)移動和鼠標(biāo)單擊的細節(jié)問題,轉(zhuǎn)而處理諸如“已選中選定項”或“已取消選定項”之類的語義事件,引用它的itemStateChanged(?)方法來完成事件響應(yīng)。
ItemEvent事件處理的程序結(jié)構(gòu)如下。
(1)將響應(yīng)選擇事件所需要的業(yè)務(wù)邏輯封裝在實現(xiàn)監(jiān)聽器接口的類中:ClassSelectActionimplementsItemListener
{
publicvoiditemStateChanged(ItemEvente)
{
//處理選擇事件所需要的業(yè)務(wù)邏輯
}
}
在itemStateChanged(?)方法體中寫入處理此事件的程序代碼。也可以在方法體中引用ItemEvent事件的(?)方法獲得引發(fā)選擇事件的事件源對象,引用getStateChange(?)方法獲取選擇事件之后的狀態(tài)。(2)創(chuàng)建事件源并注冊完成所需業(yè)務(wù)邏輯的監(jiān)聽器:
ItemListenerselect=newSelectAction(?); //創(chuàng)建監(jiān)聽器對象
JCheckBoxcb=newJCheckBox(?); //創(chuàng)建復(fù)選框?qū)ο?/p>
cb.addItemListener(select);
//注冊監(jiān)聽器對象
這樣,當(dāng)事件發(fā)生時,注冊的監(jiān)聽器對象就可以接收來自事件源的事件了。
(3)引用監(jiān)聽器的itemStateChanged(?)方法來完成事件響應(yīng)。
下面通過一個具體的程序來說明按鈕的事件響應(yīng)。10.6.4應(yīng)用舉例
【示例程序C10_9.java】根據(jù)復(fù)選框及單選按鈕來改變標(biāo)簽組件的文本大小及顏色。
import.*;
import.*;
import.*;
publicclassC10_9extendsJAppletimplementsItemListener,ActionListener
{inti1=0,i2=0,i3=0;intfonti=10;
Fontfont;
Containerctp=getContentPane();
JLabellb=newJLabel("請選擇");
JCheckBoxcb1,cb2,cb3; //聲明復(fù)選框?qū)ο?/p>
JRadioButtonr1,r2,r3; //聲明按鈕對象
ButtonGroupbg=newButtonGroup(); //創(chuàng)建按鈕組對象,實現(xiàn)JRadioButton多選一功能
publicvoidinit()
{ctp.setLayout(newFlowLayout());//設(shè)置布局方式為流式布局
cb1=newJCheckBox("紅色",false);//創(chuàng)建復(fù)選框
cb1.addItemListener(this); //為事件源注冊監(jiān)聽器對象
ctp.add(cb1); //添加復(fù)選框到界面上
cb2=newJCheckBox("綠色",false);
cb2.addItemListener(this);
ctp.add(cb2);
cb3=newJCheckBox("藍色",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("藍色".()))
{())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));
}
}
該程序的運行結(jié)果如圖所示。
在這個程序中,語句“ctp.setLayout(newFlowLayout(?));”表示設(shè)置布局方式為流式布局,這種布局是指將JApplet界面上的組件按照添加順序從左向右排列,一行排滿后再排下一行。程序中用到的有些方法是AbstractButton類的成員方法。圖10.14程序C10_9的運行結(jié)果10.7JComboBox組件
JComboBox組件被稱為下拉列表框,其特點是將所有選項折疊收藏在一起,只顯示最前面的或被用戶選中的一個。如果希望看到其他的選項,只需單擊下拉列表框右邊的下三角按鈕就可以彈出所有選項的列表。用戶可在這個列表中進行選擇,或者直接輸入所需的選項。下拉列表與選項按鈕類似,一次只能選擇一項。10.7.1JComboBox類的構(gòu)造方法和成員方法
創(chuàng)建JComboBox類的構(gòu)造方法和常用的成員方法列于表中。
10.7.2事件響應(yīng)
JComboBox組件能夠響應(yīng)的事件分為選擇事件與動作事件。若用戶選取下拉列表中的選擇項時,則激發(fā)選擇事件,使用ItemListener事件監(jiān)聽器進行處理;若用戶在JComboBox上直接輸入選擇項并回車,則激發(fā)動作事件,使用ActionListener事件監(jiān)聽器進行處理。
下面通過一個具體的程序來說明按鈕的事件響應(yīng)。表10.14JComboBox類的構(gòu)造方法和常用的成員方法
10.7.3應(yīng)用舉例
【示例程序C10_10.java】在JComboBox組件中添加4個學(xué)生的名字選項,當(dāng)點擊下拉列表選擇項時得到學(xué)生的名字,將他的成績用標(biāo)簽文本顯示。
import.*;
import.*;
import.*;
publicclassC10_10extendsJAppletimplementsItemListener
{Containerctp=getContentPane();
JLabellb1=newJLabel(“姓名:”),
lb2=newJLabel("英語:"),lb3=newJLabel(“”);
Stringname[]={“李林”,“趙欣”,“張揚”,“童梅”},
score[]={“80”,“94”,“75”,“87”};
JComboBoxcbx=newJComboBox();//創(chuàng)建下拉式列表框?qū)ο?/p>
publicvoidinit()
{
ctp.setLayout(newFlowLayout());//設(shè)置流式布局
for(intj=0;j<name.length;j++)//添加選項到下拉式列表框?qū)ο笾?/p>
cbx.addItem(name[j]);
ctp.add(lb1);
ctp.add(cbx); //添加下拉式列表框?qū)ο蟮饺萜魃?/p>
cbx.addItemListener(this);//注冊監(jiān)聽器對象到事件源
ctp.add(lb2);
ctp.add(lb3);
}publicvoiditemStateChanged(ItemEvente)
{
intc=0;
Stringstr=((); //獲取所選項給str
for(inti=0;i<name.length;i++)
if(str.equals(name[i])) //判斷str是否是name數(shù)組中某個元素的內(nèi)容
c=(); //將該選項的下標(biāo)給c
lb3.setText(score[c]); //獲取該學(xué)生的成績
}
}程序說明:下拉式列表框產(chǎn)生ItemEvent代表的選擇事件。該程序中的語句“cbx.addItemListener(this);”表示注冊監(jiān)聽器對象到事件源。當(dāng)用戶單擊下拉列表中的某個選項時,系統(tǒng)自動產(chǎn)生一個包含這個事件有關(guān)信息的ItemEvent類e的對象,并把該對象作為實際參數(shù)傳遞給被自動調(diào)用的監(jiān)聽器的選擇事件響應(yīng)方法itemStateChanged(ItemEvente)。在這個方法中通過調(diào)用ItemEvent事件的方法(?)獲得引發(fā)當(dāng)前選擇事件的下拉列表事件源(被選中的項),調(diào)用getSelectedIndex(?)獲取該選項的下標(biāo)值,從而得到name數(shù)組的下標(biāo)值,最終將這個元素的內(nèi)容作為新的標(biāo)簽文本輸出。
該程序的運行結(jié)果見圖。圖10.15程序C10_10的運行結(jié)果10.8JList組件
JList稱為列表組件,它將所有選項放入列表框中。如果將JList放入滾動面板(JScrollPane)中,則會出現(xiàn)滾動菜單效果。利用JList提供的成員方法,用戶可以指定顯示在列表框中的選項個數(shù),而多余的選項則可通過列表的上下滾動來顯現(xiàn)。
JList組件與JComboBox組件的最大區(qū)別是:JComboBox組件一次只能選擇一項,而JList組件一次可以選擇一項或多項。選擇多項時可以是連續(xù)區(qū)間選擇(按住Shift鍵進行選擇),也可以是不連續(xù)的選擇(按住Ctrl鍵進行選擇)。10.8.1JList類的構(gòu)造方法和成員方法
表列出了JList類對象的構(gòu)造方法和常用的成員方法。表10.15JList類的構(gòu)造方法和常用的成員方法
10.8.2ListSelectionEvent事件及其響應(yīng)
JList組件的事件處理一般可分為兩種:一種是當(dāng)用戶單擊列表框中的某一個選項并選中它時,將產(chǎn)生ListSelectionEvent類的選擇事件,此事件是Swing的事件;另一種是當(dāng)用戶雙擊列表框中的某個選項時,則產(chǎn)生MouseEvent類的動作事件。
若希望實現(xiàn)JList的ListSelectionEvent事件,首先必須聲明實現(xiàn)監(jiān)聽器的接口類ListSelectionListener,并通過JList類的addListSelectionListener(?)方法將監(jiān)聽器對象注冊到事件源中;其次,在ListSelectionListener接口的valueChanged(ListSelectionEvente)方法體中寫入有關(guān)代碼。這樣就可以響應(yīng)ListSelectionEvent事件了。
下面通過示例程序來加以說明。10.8.3應(yīng)用舉例
【示例程序C10_11.java】設(shè)置
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025單位保潔服務(wù)合同范本
- 2025商業(yè)超市供貨合同
- 2《憲法是根本法》(說課稿) -統(tǒng)編版道德與法治六年級上冊
- 農(nóng)村房屋翻新合同范例
- 養(yǎng)殖場長期租賃合同范例
- 勞務(wù)分包結(jié)算合同范本
- 2024-2025學(xué)年高中地理 第一章 環(huán)境與環(huán)境問題 1.1 人類與環(huán)境的關(guān)系說課稿 中圖版選修6
- 兩月工程合同范本
- 勞務(wù)合同范本劉律師
- 浦東鋼結(jié)構(gòu)吊裝施工方案
- 兒童哮喘的防治與治療
- 人教版PEP版小學(xué)英語三年級下冊Unit 4 Healthy food Part A課件
- 2024年陜西省中考道德與法治真題(A卷)(原卷版)
- (2024)湖北省公務(wù)員考試《行測》真題及答案解析
- 金融警示教育案例
- 對口升學(xué)語文模擬試卷(3)-江西?。ń馕霭妫?/a>
- 反恐防暴器械與戰(zhàn)術(shù)應(yīng)用講解
- 電商平臺客服人員績效考核手冊
- 【課件】第五單元化學(xué)反應(yīng)的定量關(guān)系新版教材單元分析九年級化學(xué)人教版(2024)上冊
- 04S519小型排水構(gòu)筑物(含隔油池)圖集
- 山東省威海乳山市(五四制)2023-2024學(xué)年八年級下學(xué)期期末考試化學(xué)試題(解析版)
評論
0/150
提交評論