版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
Java圖形用戶界面Java界面設(shè)計的用途Java的圖形界面工具包,可以用于工具類軟件開發(fā)、管理類軟件開發(fā)、通用客戶端開發(fā)、銀行客戶端軟件開發(fā)、Eclipse插件開發(fā)等方向。在許多知名的大型軟件中,都能夠見到Java的身影,如思維導(dǎo)圖軟件、Eclipse、IDEA開發(fā)環(huán)境等。2AWT簡介AbstractWindowsToolkit(AWT)是最原始的JavaGUI工具包。它是一個非常簡單的具有有限GUI組件、布局管理器和事件的工具包(如窗體、文本標(biāo)簽、按鈕、菜單等)。3Swing簡介Swing是Sun開發(fā)的一個經(jīng)過仔細(xì)設(shè)計的、靈活而強大的GUI工具包。Swing是在AWT組件基礎(chǔ)上構(gòu)建的。Swing使用了AWT的事件模型和支持類,例如Colors、Images和Graphics。Swing組件、布局管理器以及事件比AWT提供的組件集更為廣泛,完全滿足各種開發(fā)需求。4SWT簡介SWT也是基于一個對等體實現(xiàn)的,在這一點上它與AWT非常類似?;赟WT的GUI既具有主機外觀,又具有主機的性能。這樣就避免了使用AWT和Swing而引起的大部分問題。
SWT是IBM為它的Eclipse集成開發(fā)環(huán)境而開發(fā)的圖形用戶界面工具。SWT可以在Eclipse環(huán)境外使用,而且提供對操作系統(tǒng)本地圖形用戶界面的直接訪問。因此,基于SWT的Java應(yīng)用程序擁有本地的圖形用戶界面并且可以和本地別的應(yīng)用程序和部件集成在一起。
5如何選擇GUI工具包AWT、Swing、SWT是Java中的三大GUI工具包,其中Swing是最靈活、強大的GUI工具包,所以在界面開發(fā)中,首選Swing,它可以勝任絕大多數(shù)開發(fā)工作。67本講內(nèi)容1、AWT事件處理模型2、布局管理器3、Swing簡介4、Swing組件和容器8用AWT生成圖形化用戶界面
抽象窗口工具包AWT(AbstractWindowToolkit)是API為Java程序提供的建立圖形用戶界面GUI(GraphicsUserInterface)工具集,AWT可用于Java的applet和applications中。它支持圖形用戶界面編程的功能包括:用戶界面組件;事件處理模型;圖形和圖像工具,包括形狀、顏色和字體類;布局管理器,可以進行靈活的窗口布局而與特定窗口的尺寸和屏幕分辨率無關(guān);數(shù)據(jù)傳送類,可以通過本地平臺的剪貼板來進行剪切和粘貼。
91用AWT生成圖形化用戶界面java.awt包中包含了一個完整的類集以支持GUI程序的設(shè)計(重量級構(gòu)件)事件類字體類GraphicsComponent顏色類布局管理類java.lang.ObjectCheckboxContainerButton…WindowPanelAppletDialogFrameList圖象類菜單類101.1java.awt包java.awt包中提供了GUI設(shè)計所使用的類和接口。java.awt包提供了基本的java程序的GUI設(shè)計工具。主要包括下述三個概念:組件—Component容器—Container布局管理器--LayoutManager111.2組件和容器Java的圖形用戶界面的最基本組成部分是組件(Component),組件是一個可以以圖形化的方式顯示在屏幕上并能與用戶進行交互的對象,例如一個按鈕,一個標(biāo)簽等。組件不能獨立地顯示出來,必須將組件放在一定的容器中才可以顯示出來。類java.awt.Component是許多組件類的父類,Component類中封裝了組件通用的方法和屬性,如圖形的組件對象、大小、顯示位置、前景色和背景色、邊界、可見性等,因此許多組件類也就繼承了Component類的成員方法和成員變量,相應(yīng)的成員方法包括:
getComponentAt(intx,inty) getFont() getForeground() getName()
getSize() paint(Graphicsg)
repaint() update()
setVisible(booleanb) setSize(Dimensiond)
setName(Stringname)等121.2組件和容器容器(Container)也是一個類,實際上是Component的子類,因此容器本身也是一個組件,具有組件的所有性質(zhì),但是它的主要功能是容納其它組件和容器。布局管理器(LayoutManager):每個容器都有一個布局管理器,當(dāng)容器需要對某個組件進行定位或判斷其大小尺寸時,就會調(diào)用其對應(yīng)的布局管理器。為了使我們生成的圖形用戶界面具有良好的平臺無關(guān)性,Java語言中,提供了布局管理器這個工具來管理組件在容器中的布局,而不使用直接設(shè)置組件位置和大小的方式。
131.2組件和容器在程序中安排組件的位置和大小時,應(yīng)該注意以下兩點:1.容器中的布局管理器負(fù)責(zé)各個組件的大小和位置,因此用戶無法在這種情況下設(shè)置組件的這些屬性。如果試圖使用Java語言提供的setLocation(),setSize(),setBounds()等方法,則都會被布局管理器覆蓋。2.如果用戶確實需要親自設(shè)置組件大小或位置,則應(yīng)取消該容器的布局管理器,方法為:
setLayout(null);141.3常用容器容器java.awt.Container是Component的子類,一個容器可以容納多個組件,并使它們成為一個整體。容器可以簡化圖形化界面的設(shè)計,以整體結(jié)構(gòu)來布置界面。所有的容器都可以通過add()方法向容器中添加組件。有三種類型的容器:Window、Panel、ScrollPane,常用的有Panel,Frame,Applet。151.3常用容器-Frame1.Frame
例:
importjava.awt.*;
publicclassMyFrameextendsFrame{
publicstaticvoidmain(Stringargs[]){
MyFramefr=newMyFrame("HelloOutThere!");//構(gòu)造方法
fr.setSize(200,200); //設(shè)置Frame的大小,缺省為(0,0)
fr.setBackground(Color.red);//設(shè)置Frame的背景,缺省為紅色
fr.setVisible(true); //設(shè)置Frame為可見,缺省為不可見
}
publicMyFrame(Stringstr){
super(str);//調(diào)用父類的構(gòu)造方法
}}161.3常用容器-Frame一般我們要生成一個窗口,通常是用Window的子類Frame來進行實例化,而不是直接用到Window類。Frame的外觀就像我們平常在windows系統(tǒng)下見到的窗口,有標(biāo)題、邊框、菜單、大小等等。每個Frame的對象實例化以后,都是沒有大小和不可見的,因此必須調(diào)用setSize()來設(shè)置大小,調(diào)用setVisible(true)來設(shè)置該窗口為可見的。另外,AWT在實際的運行過程中是調(diào)用所在平臺的圖形系統(tǒng),因此同樣一段AWT程序在不同的操作系統(tǒng)平臺下運行所看到的圖形系統(tǒng)是不一樣的。例如在windows下運行,則顯示的窗口是windows風(fēng)格的窗口;而在UNIX下運行時,則顯示的是UNIX風(fēng)格的窗口。171.3常用容器2.PanelPanel與Frame類似,可以添加到Frame中。181.4LayoutManager布局管理器Java為了實現(xiàn)跨平臺的特性并且獲得動態(tài)的布局效果,Java將容器內(nèi)的所有組件安排給一個"布局管理器"負(fù)責(zé)管理,如:排列順序,組件的大小、位置,當(dāng)窗口移動或調(diào)整大小后組件如何變化等功能授權(quán)給對應(yīng)的容器布局管理器來管理,不同的布局管理器使用不同算法和策略,容器可以通過選擇不同的布局管理器來決定布局。布局管理器主要包括:FlowLayout,BorderLayout,GridLayout,CardLayout,GridBagLayout:191.4布局管理器-FlowLayout1.FlowLayout
FlowLayout是Panel,Applet的缺省布局管理器。其組件的放置規(guī)律是從上到下、從左到右進行放置,如果容器足夠?qū)?,第一個組件先添加到容器中第一行的最左邊,后續(xù)的組件依次添加到上一個組件的右邊,如果當(dāng)前行已放置不下該組件,則放置到下一行的最左邊。 當(dāng)容器的大小發(fā)生變化時,用FlowLayout管理的組件會發(fā)生變化,其變化規(guī)律是:組件的大小不變,但是相對位置會發(fā)生變化。例如上圖中有三個按鈕都處于同一行,但是如果把該窗口變窄,窄到剛好能夠放下一個按鈕,則第二個按鈕將折到第二行,第三個按鈕將折到第三行。按鈕"Open"本來在按鈕"OK"的右邊,但是現(xiàn)在跑到了下面,所以說"組件的大小不變,但是相對位置會發(fā)生變化"。201.4布局管理器-FlowLayout構(gòu)造方法主要下面幾種:FlowLayout(FlowLayout.RIGHT,20,40);
/*第一個參數(shù)表示組件的對齊方式,指組件在這一行中的位置是居中對齊、居右對齊還是居左對齊,第二個參數(shù)是組件之間的橫向間隔,第三個參數(shù)是組件之間的縱向間隔,單位是象素。*/FlowLayout(FlowLayout.LEFT);
//居左對齊,橫向間隔和縱向間隔都是缺省值5個象素FlowLayout();//缺省的對齊方式居中對齊,橫向間隔和縱向間隔都是缺省值5個象素例:
Framef=newFrame();
f.setLayout(newFlowLayout());
f.add(newButton("button1"));
f.add(newButton("button2"));
f.add(newButton("button3"));211.4布局管理器-BorderLayout
BorderLayout是Window,F(xiàn)rame和Dialog的缺省布局管理器。BorderLayout布局管理器把容器分成5個區(qū)域:North,South,East,West和Center,每個區(qū)域只能放置一個組件。
f.setLayout(newBorderLayout());
f.add("North",newButton("North"));
//第一個參數(shù)表示把按鈕添加到容器的North區(qū)域在使用BorderLayout的時候,如果容器的大小發(fā)生變化,其變化規(guī)律為:組件的相對位置不變,大小發(fā)生變化。例如容器變高了,則North、South區(qū)域不變,West、Center、East區(qū)域變高;如果容器變寬了,West、East區(qū)域不變,North、Center、South區(qū)域變寬。不一定所有的區(qū)域都有組件,如果四周的區(qū)域(West、East、North、South區(qū)域)沒有組件,則由Center區(qū)域去補充,但是如果Center區(qū)域沒有組件,則保持空白:CenterNorthSouthWestEast221.4布局管理器-GridLayout使容器中各個組件呈網(wǎng)格狀布局,平均占據(jù)容器的空間。
Framef=newFrame("GridLayout");
f.setLayout(newGridLayout(3,2));
//容器平均分成3行2列共6格
f.add(newButton("1"));//添加到第一行的第一格
f.add(newButton("2"));//添加到第一行的下一格
...
f.add(newButton("6"));//添加到第二行的第三格231.4布局管理器-CardLayout CardLayout布局管理器能夠幫助用戶處理兩個以至更多的成員共享同一顯示空間,它把容器分成許多層,每層的顯示空間占據(jù)整個容器的大小,但是每層只允許放置一個組件,當(dāng)然每層都可以利用Panel來實現(xiàn)復(fù)雜的用戶界面。牌布局管理器(CardLayout)就象一副疊得整整齊齊的撲克牌一樣,有54張牌,但是你只能看見最上面的一張牌,每一張牌就相當(dāng)于牌布局管理器中的每一層。
241.4布局管理器容器的嵌套
在復(fù)雜的圖形用戶界面設(shè)計中,為了使布局更加易于管理,具有簡潔的整體風(fēng)格,一個包含了多個組件的容器本身也可以作為一個組件加到另一個容器中去,容器中再添加容器,這樣就形成了容器的嵌套。下面是一個容器嵌套的例子。例:
f=newFrame("GUIexample3");
bw=newButton("West");
bc=newButton("Workspaceregion");
f.add(bw,"West"); f.add(bc,"Center");
p=newPanel();
f.add(p,"North");
bfile=newButton("File"); bhelp=newButton("Help");
p.add(bfile); p.add(bhelp);
f.pack(); f.setVisible(true);251.4布局管理器小結(jié):
1.Frame是一個頂級窗口。Frame的缺省布局管理器為BorderLayout。
2.Panel無法單獨顯示,必須添加到某個容器中。Panel的缺省布局管理器為FlowLayout。
3.當(dāng)把Panel作為一個組件添加到某個容器中后,該Panel仍然可以有自己的布局管理器。因此,可以利用Panel使得BorderLayout中某個區(qū)域顯示多個組件,達(dá)到設(shè)計復(fù)雜用戶界面的目的。
4.如果采用無布局管理器setLayout(null),則必須使用setLocation(),setSize(),setBounds()等方法手工設(shè)置組件的大小和位置,此方法會導(dǎo)致平臺相關(guān),不鼓勵使用。
262AWT事件處理模型
要能夠讓圖形界面接收用戶的操作,就必須給各個組件加上事件處理機制。在事件處理的過程中,主要涉及三類對象:
Event-事件,用戶對界面操作在java語言上的描述,以類的形式出現(xiàn),例如鍵盤操作對應(yīng)的事件類是KeyEvent。
EventSource-事件源,事件發(fā)生的場所,通常就是各個組件,例如按鈕Button。
Eventhandler-事件處理者,接收事件對象并對其進行處理的對象。27事件及處理機制組件(事件發(fā)生者)觸發(fā)一個相應(yīng)類型的事件此事件由相應(yīng)類型的Listener(事件監(jiān)聽者)接收并處理Button1事件發(fā)生者接收事件e,并做處理ActionListener事件監(jiān)聽者觸發(fā)ActionEvente點擊28事件及處理機制
調(diào)用按扭的addActionListener(
)
方法,為該按扭指定監(jiān)聽者。鼠標(biāo)單擊按扭ActionEvent事件
觸發(fā)publicvoidactionPerformed(ActionEvente)ActionListener接口ActionEvent事件監(jiān)聽者類監(jiān)聽者對象實現(xiàn)接口29實現(xiàn)步驟根據(jù)需要定義相應(yīng)類型的監(jiān)聽者類,在類的定義中完成事件的處理;創(chuàng)建事件監(jiān)聽者對象;為將會觸發(fā)事件的組件C注冊相應(yīng)的事件監(jiān)聽者對象(使用C的addXXXListener()方法)。例:ButtonAct.java30publicclassButtonActextendsFrame{.........publicButtonAct(){ .........//為b1注冊事件監(jiān)聽者B1 b1.addActionListener(newB1()); add(b1); .........}//利用innerclass結(jié)構(gòu)定義監(jiān)聽者類
classB1implementsActionListener{//利用actionPerformed方法進行事件處理
publicvoidactionPerformed(ActionEvente){ who.setText("Button1"); }}.........}///:~312.1事件類與AWT有關(guān)的所有事件類都由java.awt.AWTEvent類派生,它也是EventObject類的子類。AWT事件共有10類,可以歸為兩大類:低級事件和高級事件。java.util.EventObject類是所有事件對象的基礎(chǔ)父類,所有事件都是由它派生出來的。AWT的相關(guān)事件繼承于java.awt.AWTEvent類,這些AWT事件分為兩大類:低級事件和高級事件,低級事件是指基于組件和容器的事件,當(dāng)一個組件上發(fā)生事件,如:鼠標(biāo)的進入,點擊,拖放等,或組件的窗口開關(guān)等,觸發(fā)了組件事件。高級事件是基于語義的事件,它可以不和特定的動作相關(guān)聯(lián),而依賴于觸發(fā)此事件的類,如在TextField中按Enter鍵會觸發(fā)ActionEvent事件,滑動滾動條會觸發(fā)AdjustmentEvent事件,或是選中項目列表的某一條就會觸發(fā)ItemEvent事件。322.1事件類
低級事件
ComponentEvent(組件事件:組件尺寸的變化,移動)
ContainerEvent(容器事件:組件增加,移動)
WindowEvent(窗口事件:關(guān)閉窗口,窗口閉合,圖標(biāo)化)
FocusEvent(焦點事件:焦點的獲得和丟失)
KeyEvent(鍵盤事件:鍵按下、釋放)
MouseEvent(鼠標(biāo)事件:鼠標(biāo)單擊,移動)
高級事件(語義事件)
ActionEvent(動作事件:按鈕按下,TextField中按Enter鍵)
AdjustmentEvent(調(diào)節(jié)事件:在滾動條上移動滑塊以調(diào)節(jié)數(shù)值)
ItemEvent(項目事件:選擇項目,不選擇"項目改變")
TextEvent(文本事件,文本對象改變)332.2事件監(jiān)聽器每類事件都有對應(yīng)的事件監(jiān)聽器,監(jiān)聽器是接口,根據(jù)動作來定義方法。AWT的組件類中提供注冊和注銷監(jiān)聽器的方法:
注冊監(jiān)聽器:
publicvoidadd<ListenerType>(<ListenerType>listener);
注銷監(jiān)聽器:
publicvoidremove<ListenerType>(<ListenerType>listener);例如Button類:(查API)
publicclassButtonextendsComponent{
……
publicsynchronizedvoidaddActionListener(ActionListenerl);
publicsynchronizedvoidremoveActionListener(ActionListenerl);
……}342.3AWT事件及其相應(yīng)的監(jiān)聽器接口
1.可以聲明多個接口,接口之間用逗號隔開。
……implementsMouseMotionListener,MouseListener,WindowListener;2.可以由同一個對象監(jiān)聽一個事件源上發(fā)生的多種事件:
f.addMouseMotionListener(this);
f.addMouseListener(this);
f.addWindowListener(this);
則對象f上發(fā)生的多個事件都將被同一個監(jiān)聽器接收和處理。352.3AWT事件及其相應(yīng)的監(jiān)聽器接口3.事件處理者和事件源處在同一個類中。本例中事件源是Framef,事件處理者是類ThreeListener,其中事件源Framef是類ThreeListener的成員變量。在這里所有的事件偵聽器方法都要在主類中聲明。
publicclassThreeListenerimplementsMouseMotionListener,MouseListener,WindowListener{
f=newFrame("Threelistenersexample");
f.addMouseMotionListener(this);//注冊監(jiān)聽器MouseMotionListener
f.addMouseListener(this);//注冊監(jiān)聽器MouseListener
f.addWindowListener(this);//注冊監(jiān)聽器WindowListener}362.3AWT事件及其相應(yīng)的監(jiān)聽器接口4.可以通過事件對象獲得詳細(xì)資料,比如本例中就通過事件對象獲得了鼠標(biāo)發(fā)生時的坐標(biāo)值。
publicvoidmouseDragged(MouseEvente){
Strings="Mousedragging:X="+e.getX()+"Y="+e.getY();
tf.setText(s);}Java語言類的層次非常分明,因而只支持單繼承,為了實現(xiàn)多重繼承的能力,Java用接口來實現(xiàn),一個類可以實現(xiàn)多個接口,這種機制比多重繼承具有更簡單、靈活、更強的功能。在AWT中就經(jīng)常用到聲明和實現(xiàn)多個接口。記住無論實現(xiàn)了幾個接口,接口中已定義的方法必須一一實現(xiàn),如果對某事件不感興趣,可以不具體實現(xiàn)其方法,而用空的方法體來代替。但卻必須所有方法都要寫上。372.4事件適配器Java語言為一些Listener接口提供了適配器(Adapter)類。可以通過繼承事件所對應(yīng)的Adapter類,重寫需要方法,無關(guān)方法不用實現(xiàn)。事件適配器為我們提供了一種簡單的實現(xiàn)監(jiān)聽器的手段,可以縮短程序代碼。但是,由于java的單一繼承機制,當(dāng)需要多種監(jiān)聽器或此類已有父類時,就無法采用事件適配器了。382.4事件適配器1.事件適配器--EventAdapter
下例中采用了鼠標(biāo)適配器:
importjava.awt.*;
importjava.awt.event.*;
publicclassMouseClickHandlerextendsMouseAdaper{
publicvoidmouseClicked(MouseEvente)//只實現(xiàn)需要的方法
{……}}
java.awt.event包中定義的事件適配器類包括以下幾個:
1.ComponentAdapter(組件適配器)
2.ContainerAdapter(容器適配器)
3.FocusAdapter(焦點適配器)
4.KeyAdapter(鍵盤適配器)
5.MouseAdapter(鼠標(biāo)適配器)
6.MouseMotionAdapter(鼠標(biāo)運動適配器)
7.WindowAdapter(窗口適配器)392.4事件適配器2.用內(nèi)部類實現(xiàn)事件處理
內(nèi)部類(innerclass)是被定義于另一個類中的類,使用內(nèi)部類的主要原因是由于:
一個內(nèi)部類的對象可訪問外部類的成員方法和變量,包括私有的成員。
實現(xiàn)事件監(jiān)聽器時,采用內(nèi)部類、匿名類編程非常容易實現(xiàn)其功能。
編寫事件驅(qū)動程序,內(nèi)部類很方便。注意:使用的內(nèi)部類不能在靜態(tài)方法(如main方法)中調(diào)用。40
importjava.awt.*;
importjava.awt.event.*;
publicclassInnerClass{
privateFramef;
privateTextFieldtf;
publicInnerClass(){
f=newFrame("Innerclassesexample");
tf=newTextField(30);
}
publicvoidilaunchFrame(){
Labellabel=newLabel("Clickanddragthemouse");
f.add(label,BorderLayout.NORTH);
f.add(tf,BorderLayout.SOUTH);
f.addMouseMotionListener(newMyMouseMotionListener());/*參數(shù)為內(nèi)部類對象*/
f.setSize(300,200);
f.setVisible(true);
}
classMyMouseMotionListenerextendsMouseMotionAdapter{/*內(nèi)部類開始*/
publicvoidmouseDragged(MouseEvente){
Strings="Mousedragging:x="+e.getX()+"Y="+e.getY();
tf.setText(s);}
}; publicstaticvoidmain(Stringargs[]){
InnerClassobj=newInnerClass();
obj.launchFrame();
}
}//內(nèi)部類結(jié)束
}
412.4事件適配器3.匿名類(AnonymousClass)
當(dāng)一個內(nèi)部類的類聲名只是在創(chuàng)建此類對象時用了一次,而且要產(chǎn)生的新類需繼承于一個已有的父類或?qū)崿F(xiàn)一個接口,才能考慮用匿名類,由于匿名類本身無名,因此它也就不存在構(gòu)造方法,它需要顯示地調(diào)用一個無參的父類的構(gòu)造方法,并且重寫父類的方法。所謂的匿名就是該類連名字都沒有,只是顯示地調(diào)用一個無參的父類的構(gòu)造方法。f.addMouseMotionListener(newMouseMotionAdapter(){//匿名類開始
publicvoidmouseDragged(MouseEvente){
Strings="Mousedragging:x="+e.getX()+"Y="+e.getY();
tf.setText(s);}
});//匿名類結(jié)束423AWT組件庫本節(jié)從應(yīng)用的角度進一步介紹AWT的一些組件,目的使大家加深對AWT的理解,掌握如何用各種組件構(gòu)造圖形化用戶界面,學(xué)會控制組件的顏色和字體。下面是一些常用的組件的介紹:433AWT組件庫1.按鈕(Button)
按鈕是最常用的一個組件,其構(gòu)造方法是:Buttonb=newButton("Quit");
當(dāng)按鈕被點擊后,會產(chǎn)生ActionEvent事件,需ActionListener接口進行監(jiān)聽和處理事件。
ActionEvent的對象調(diào)用getActionCommand()方法可以得到按鈕的標(biāo)識名,缺省按鈕名為label。
用setActionCommand()可以為按鈕設(shè)置組件標(biāo)識符。
443AWT組件庫2.復(fù)選框(Checkbox)
復(fù)選框提供簡單的"on/off"開關(guān),旁邊顯示文本標(biāo)簽。
構(gòu)造方法如下:
setLayout(newGridLayout(3,1));
add(newCheckbox("one",null,true));
add(newCheckbox("two"));
add(newCheckbox("three"));
復(fù)選框用ItemListener來監(jiān)聽ItemEvent事件,當(dāng)復(fù)選框狀態(tài)改變時用getStateChange()獲取當(dāng)前狀態(tài)。使用getItem()獲得被修改復(fù)選框的字符串對象。classHandlerimplementsItemListener{
publicvoiditemStateChanged(ItemEventev){
Stringstate="deselected";
if(ev.getStateChange()==ItemEvent.SELECTED){
state="selected"
}
System.out.println(ev.getItem()+""+state);
}
}453AWT組件庫3.復(fù)選框組(CheckboxGroup)
使用復(fù)選框組,可以實現(xiàn)單選框的功能。方法如下:
setLayout(newGridLayout(3,1));
CheckboxGroupcbg=newCheckboxGroup();
add(newCheckbox("one",cbg,true));
add(newCheckbox("two",cbg,false));
add(newCheckbox("three",cbg,false));463AWT組件庫4.下拉式菜單(Choice)
下拉式菜單每次只能選擇其中的一項,它能夠節(jié)省顯示空間,適用于大量選項。
ChoiceColorchooser=newChoice();
Colorchooser.add("Green");
Colorchooser.add("Red");
Colorchooser.add("Blue");
Choice用ItemListener接口來進行監(jiān)聽473AWT組件庫5.Canvas
一個應(yīng)用程序必須繼承Canvas類才能獲得有用的功能,比如創(chuàng)建一個自定義組件。如果想在畫布上完成一些圖形處理,則Canvas類中的paint()方法必須被重寫。
Canvas組件監(jiān)聽各種鼠標(biāo),鍵盤事件。當(dāng)在Canvas組件中輸入字符時,必須先調(diào)用requestFocus()方法。
483AWT組件庫6.單行文本輸入?yún)^(qū)(TextField)
只能顯示一行,當(dāng)回車鍵被按下時,會發(fā)生ActionEvent事件,可以通過ActionListener中的actionPerformed()方法對事件進行相應(yīng)處理??梢允褂胹etEditable(boolean)方法設(shè)置為只讀屬性。
單行文本輸入?yún)^(qū)構(gòu)造方法如下:
TextFieldtf1,tf2,tf3,tf4:
tf1=newTextField();
tf2=newTextField("",20);//顯示區(qū)域為20列
tf3=newTextField("Hello!");//按文本區(qū)域大小顯示
tf4=newTextField("Hello!",30);//初始文本為Hello!,顯示區(qū)域為30列
493AWT組件庫7.文本輸入?yún)^(qū)(TextArea)
TextArea可以顯示多行多列的文本。使用setEditable(boolean)方法,可以將其設(shè)置為只讀的。在TextArea中可以顯示水平或垂直的滾動條。
要判斷文本是否輸入完畢,可以在TextArea旁邊設(shè)置一個按鈕,通過按鈕點擊產(chǎn)生的ActionEvent對輸入的文本進行處理。8.列表(List)
列表中提供了多個文本選項,列表支持滾動條,可以瀏覽多項
Listlst=newList(4,false);//兩個參數(shù)分別表示顯示的行數(shù)、是否允許多選
lst.add("Venus");
lst.add("Earth");
lst.add("JavaSoft");
lst.add("Mars");
cnt.add(lst);503AWT組件庫9.框架(Frame)
Frame是頂級窗口,可以顯示標(biāo)題,重置大小。當(dāng)Frame被關(guān)閉,將產(chǎn)生WindowEvent事件,F(xiàn)rame無法直接監(jiān)聽鍵盤輸入事件。
10.對話框(Dialog)
它是Window類的子類。對話框和一般窗口的區(qū)別在于它依賴于其它窗口。對話框分為非模式(non-modal)和模式(modal)兩種。11.文件對話框(Filedialog)
當(dāng)用戶想打開或存儲文件時,使用文件對話框進行操作。主要代碼如下:
FileDialogd=newFileDialog(ParentFr,"FileDialog");
d.setVisible(true);
Stringfilename=d.getFile();513AWT組件庫12.菜單(Menu)
無法直接將菜單添加到容器的某一位置,也無法使用布局管理器對其加以控制。菜單只能被添加?quot;菜單容器"(MenuBar)中。
13.MenuBar
只能被添加到Frame對象中,作為整個菜單樹的根基。
Framefr=newFrame("MenuBar");
MenuBarmb=newMenuBar();
fr.setMenuBar(mb);
fr.setSize(150,100);
fr.setVisible(true);523AWT組件庫14.Menu
下拉菜單。它可以被添加到MenuBar中或其它Menu中。
Framefr=newFrame("MenuBar");
MenuBarmb=newMenuBar();
fr.setMenuBar(mb);
Menum1=newMenu("File");
mb.add(m1);15.MenuItem
MenuItem是菜單樹中的"葉子節(jié)點"。MenuItem通常被添加到一個Menu中。對于MenuItem對象可以添加ActionListener,使其能夠完成相應(yīng)的操作。
Menum1=newMenu("File");
MenuItemmi1=newMenuItem("Save");53本講小結(jié)-AWT用AWT來生成圖形化用戶界面時,組件和容器的概念非常重要。組件是各種各樣的類,封裝了圖形系統(tǒng)的許多最小單位,例如按鈕、窗口等等;而容器也是組件,它的最主要的作用是裝載其它組件,但是象Panel這樣的容器也經(jīng)常被當(dāng)作組件添加到其它容器中,以便完成雜的界面設(shè)計。布局管理器是java語言與其它編程語言在圖形系統(tǒng)方面較為顯著的區(qū)別,容器中各個組件的位置是由布局管理器來決定的,共有5種布局管理器,每種布局管理器都有自己的放置規(guī)律。事件處理機制能夠讓圖形界面響應(yīng)用戶的操作,主要涉及到事件源、事件、事件處理者等三方,事件源就是圖形界面上的組件,事件就是對用戶操作的描述,而事件處理者是處理事件的類。因此,對于AWT中所提供的各個組件,我們都需要了解該組件經(jīng)常發(fā)生的事件以及處理該事件的相應(yīng)的監(jiān)聽器接口。544Swing簡介554.1簡介
前面我們學(xué)習(xí)了AWT,AWT是Swing的基礎(chǔ)。Swing的產(chǎn)生主要原因就是AWT不能滿足圖形化用戶界面發(fā)展的需要。AWT設(shè)計的初衷是支持開發(fā)小應(yīng)用程序的簡單用戶界面。例如AWT缺少剪貼板、打印支持、鍵盤導(dǎo)航等特性,而且原來的AWT甚至不包括彈出式菜單或滾動窗格等基本元素。
此外AWT還存在著嚴(yán)重的缺陷,人們使AWT適應(yīng)基于繼承的、具有很大伸縮性的事件模型,基于同位體的體系結(jié)構(gòu)也成為其致命的弱點。
隨著發(fā)展的需要,Swing出現(xiàn)了,Swing組件幾乎都是輕量組件,與重量組件相比,沒有本地的對等組件,不像重量組件要在它們自己的本地不透明窗體中繪制,輕量組件在它們的重量組件的窗口中繪制。564.1簡介Swing是由100%純Java實現(xiàn)的,Swing組件是用Java實現(xiàn)的輕量級(light-weight)組件,沒有本地代碼,不依賴操作系統(tǒng)的支持,這是它與AWT組件的最大區(qū)別。由于AWT組件通過與具體平臺相關(guān)的對等類(Peer)實現(xiàn),因此Swing比AWT組件具有更強的實用性。Swing在不同的平臺上表現(xiàn)一致,并且有能力提供本地窗口系統(tǒng)不支持的其它特性。Swing采用了一種MVC的設(shè)計范式,即"模型-視圖-控制"(Model-View-Controller),其中模型用來保存內(nèi)容,視圖用來顯示內(nèi)容,控制器用來控制用戶輸入。在AWT組件中,由于控制組件外觀的對等類與具體平臺相關(guān),使得AWT組件總是只有與本機相關(guān)的外觀。Swing使得程序在一個平臺上運行時能夠有不同的外觀。用戶可以選擇自己習(xí)慣的外觀。574.2Swing的類層次結(jié)構(gòu)在javax.swing包中,定義了兩種類型的組件:頂層容器(JFrame,JApplet,JDialog和JWindow)和輕量級組件。Swing組件都是AWT的Container類的直接子類和間接子類。java.awt.Component
-java.awt.Container
-java.awt.Window
-java.awt.Frame-javax.swing.JFrame
-javax.Dialog-javax.swing.JDialog
-javax.swing.JWindow
-java.awt.Applet-javax.swing.JApplet
-javax.swing.Box
-javax.swing.Jcomponet
584.2Swing的類層次結(jié)構(gòu) swing包是Swing提供的最大包,它包含將近100個類和25個接口,幾乎所有的Swing組件都在swing包中,只有JtableHeader和JtextComponent是例外,它們分別在swing.table和swing.text中。
swing.border包中定義了事件和事件監(jiān)聽器類,與AWT的event包類似。它們都包括事件類和監(jiān)聽器接口。
swing.pending包包含了沒有完全實現(xiàn)的Swing組件。
swing.table包中主要包括了表格組建(JTable)的支持類。
swing.tree同樣是JTree的支持類。
swing.text、swing.text.html、swing.text.html.parser和swing.text.rtf都是用于顯示和編輯文檔的包。
594.3Swing組件的多樣化Swing是AWT的擴展,它提供了許多新的圖形界面組件。Swing組件以"J"開頭,除了有與AWT類似的按鈕(JButton)、標(biāo)簽(JLabel)、復(fù)選框(JCheckBox)、菜單(JMenu)等基本組件外,還增加了一個豐富的高層組件集合,如表格(JTable)、樹(JTree)。604.4MVC(Model-View-Control)體系結(jié)構(gòu)
Swing勝過AWT的主要優(yōu)勢在于MVC體系結(jié)構(gòu)的普遍使用。在一個MVC用戶界面中,存三個通訊對象:模型、視圖和控件。模型是指定的邏輯表示法,視圖是模型的可視化表示法,而控件則指定了如何處理用戶輸入。當(dāng)模型發(fā)生改變時,它會通知所有依賴它的視圖,視圖使用控件指定其相應(yīng)機制。 為了簡化組件的設(shè)計工作,在Swing組件中視圖和控件兩部分合為一體。每個組件有一個相關(guān)的分離模型和它使用的界面(包括視圖和控件)。比如,按鈕JButton有一個存儲其狀態(tài)的分離模型ButtonModel對象。組件的模型是自動設(shè)置的,例如一般都使用JButton而不是使用ButtonModel對象。另外,通過Model類的子類或通過實現(xiàn)適當(dāng)?shù)慕涌?,可以為組件建立自己的模型。把數(shù)據(jù)模型與組件聯(lián)系起來用setModel()方法。
MVC是現(xiàn)有的編程語言中制作圖形用戶界面的一種通用的思想,其思路是把數(shù)據(jù)的內(nèi)容本身和顯示方式分離開,這樣就使得數(shù)據(jù)的顯示更加靈活多樣。比如,某年級各個班級的學(xué)生人數(shù)是數(shù)據(jù),則顯示方式是多種多樣的,可以采用柱狀圖顯示,也可以采用餅圖顯示,也可以采用直接的數(shù)據(jù)輸出。因此在設(shè)計的時候,就考慮把數(shù)據(jù)和顯示方式分開,對于實現(xiàn)多種多樣的顯示是非常有幫助的。614.5可存取性支持所有Swing組件都實現(xiàn)了Accessible接口,提供對可存取性的支持,使得輔助功能如屏幕閱讀器能夠十分方便的從Swing組件中得到信息。624.6支持鍵盤操作在Swing組件中,使用JComponent類的registerKeyboardAction()方法,能使用戶通過鍵盤操作來替代鼠標(biāo)驅(qū)動GUI上Swing組件的相應(yīng)動作。有些類還為鍵盤操作提供了更便利的方法。即設(shè)定熱鍵。634.7設(shè)置邊框?qū)wing組件可以設(shè)置一個和多個邊框。Swing中提供了各式各樣的邊框供用戶選用,也能建立組合邊框或自己設(shè)計邊框。一種空白邊框可以增大組件,協(xié)助布局管理器對容器中的組件進行合理的布局。644.8使用圖標(biāo)(Icon)與AWT的部件不同,許多Swing組件如按鈕、標(biāo)簽,除了使用文字外,還可以使用圖標(biāo)修飾自己。654.9Swing程序結(jié)構(gòu)簡介Swing的程序設(shè)計一般可按照下列流程進行:
1.引入Swing包
2.選擇"外觀和感覺"
3.設(shè)置頂層容器
4.設(shè)置按鈕和標(biāo)簽
5.向容器中添加組件
6.在組件周圍添加邊界
7.進行事件處理
665Swing組件和容器675.1組件的分類Jcomponent是一個抽象類,用于定義所有子類組件的一般方法,其類層次結(jié)構(gòu)如下所示:
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
并不是所有的Swing組件都繼承于JComponent類,JComponent類繼承于Container類,所以凡是此類的組件都可作為容器使用。
685.1組件的分類組件從功能上分可分為:
1)頂層容器:JFrame,JApplet,JDialog,JWindow共4個
2)中間容器:JPanel,JScrollPane,JSplitPane,JToolBar
3)特殊容器:在GUI上起特殊作用的中間層,如JInternalFrame,JLayeredPane,JRootPane.
4)基本控件:實現(xiàn)人際交互的組件,如Jbutton,JComboBox,JList,JMenu,JSlider,JtextField。
5)不可編輯信息的顯示:向用戶顯示不可編輯信息的組件,例如JLabel,JProgressBar,ToolTip。
6)可編輯信息的顯示:向用戶顯示能被編輯的格式化信息的組件,如JColorChooser,JFileChoose,JFileChooser,Jtable,JtextArea。695.1組件的分類JComponent類的特殊功能又分為:
1)邊框設(shè)置:使用setBorder()方法可以設(shè)置組件外圍的邊框,使用一個EmptyBorder對象能在組件周圍留出空白。2)雙緩沖區(qū):使用雙緩沖技術(shù)能改進頻繁變化的組件的顯示效果。與AWT組件不同,JComponent組件默認(rèn)雙緩沖區(qū),不必自己重寫代碼。如果想關(guān)閉雙緩沖區(qū),可以在組件上施加setDoubleBuffered(false)方法。
3)提示信息:使用setTooltipText()方法,為組件設(shè)置對用戶有幫助的提示信息。
4)鍵盤導(dǎo)航:使用registerKeyboardAction()方法,能使用戶用鍵盤代替鼠標(biāo)來驅(qū)動組件。JComponent類的子類AbstractButton還提供了便利的方法--用setMnemonic()方法指明一個字符,通過這個字符和一個當(dāng)前L&F的特殊修飾共同激活按鈕動作。
5)可插入L&F:每個Jcomponent對象有一個相應(yīng)的ComponentUI對象,為它完成所有的繪畫、事件處理、決定尺寸大小等工作。ComponentUI對象依賴當(dāng)前使用的L&F,用UIManager.setLookAndFeel()方法可以設(shè)置需要的L&F.
6)支持布局:通過設(shè)置組件最大、最小、推薦尺寸的方法和設(shè)置X、Y對齊參數(shù)值的方法能指定布局管理器的約束條件,為布局提供支持。705.2使用Swing的基本規(guī)則
與AWT組件不同,Swing組件不能直接添加到頂層容器中,它必須添加到一個與Swing頂層容器相關(guān)聯(lián)的內(nèi)容面板(contentpane)上。內(nèi)容面板是頂層容器包含的一個普通容器,它是一個輕量級組件?;疽?guī)則如下:
(1)把Swing組件放入一個頂層Swing容器的內(nèi)容面板上
(2)避免使用非Swing的重量級組件。
對JFrame添加組件有兩種方式:
1)用getContentPane()方法獲得JFrame的內(nèi)容面板,再對其加入組件:frame.getContentPane().add(childComponent)
2)建立一個Jpanel或JDesktopPane之類的中間容器,把組件添加到容器中,用setContentPane()方法把該容器置為JFrame的內(nèi)容面板:
JpanelcontentPane=newJpanel();
……//把其它組件添加到Jpanel中;
frame.setContentPane(contentPane);
//把contentPane對象設(shè)置成為frame的內(nèi)容面板715.3各種容器面板和組件725.3.1根面板(JRootPane)根面板由一個玻璃面板(glassPane)、一個內(nèi)容面板(contentPane)和一個可選擇的菜單條(JMenuBar)組成,而內(nèi)容面板和可選擇的菜單條放在同一分層。玻璃面板是完全透明的,缺省值為不可見,為接收鼠標(biāo)事件和在所有組件上繪圖提供方便。
根面板提供的方法:
ContainergetContentPane();//獲得內(nèi)容面板
setContentPane(Container);//設(shè)置內(nèi)容面
JMenuBargetMenuBar();//活動菜單條
setMenuBar(JMenuBar);//設(shè)置菜單條
JLayeredPanegetLayeredPane();//獲得分層面板
setLayeredPane(JLayeredPane);//設(shè)置分層面板
ComponentgetGlassPane();//獲得玻璃面板
setGlassPane(Component);//設(shè)置玻璃面板735.3.2分層面板(JLayeredPane)
Swing提供兩種分層面板:JlayeredPane和JDesktopPane。JDesktopPane是JLayeredPane的子類,專門為容納內(nèi)部框架(JInternalFrame)而設(shè)置。
向一個分層面板種添加組件,需要說明將其加入哪一層,指明組件在該層中的位置:add(Componentc,IntegerLayer,intposition)。745.3.3面板(JPanel)面板(JPanel)是一個輕量容器組件,用法與Panel相同,用于容納界面元素,以便在布局管理器的設(shè)置下可容納更多的組件,實現(xiàn)容器的嵌套。Jpanel,JscrollPane,JsplitPane,JinteralFrame都屬于常用的中間容器,是輕量組件。Jpanel的缺省布局管理器是FlowLayout。
755.3.4滾動窗口(JScrollPane)
JscrollPane是帶滾動條的面板,主要是通過移動JViewport(視口)來實現(xiàn)的。JViewport是一種特殊的對象,用于查看基層組件,滾動條實際就是沿著組件移動視口,同時描繪出它在下面"看到"的內(nèi)容。765.3.5分隔板(JSplitPane)JSplitPane提供可拆分窗口,支持水平拆分和垂直拆分并帶有滑動條。常用方法有:
addImpl(Componentcomp,Objectconstraints,intindex)//增加指定的組件
setTopComponent(Componentcomp)//設(shè)置頂部的組件
setDividerSize(intnewSize)//設(shè)置拆分的大小
setUI(SplitPaneUIui)//設(shè)置外觀和感覺
775.3.6選項板(JTabbedPane)
JTabbedPane提供一組可供用戶選擇的帶有標(biāo)簽或圖標(biāo)的開關(guān)鍵。常用方法:
add(Stringtitle,Componentcomponent)//增加一個帶特定標(biāo)簽的組件
addChangeListener(ChangeListenerl)//選項板注冊一個變化監(jiān)聽器785.3.7工具欄(JtoolBar)JtoolBar是用于顯示常用工具控件的容器。用戶可以拖拽出一個獨立的可顯示工具控件的窗口。
常用方法有:
JToolBar(Stringname)//構(gòu)造方法
getComponentIndex(Componentc)//返回一個組件的序號
getComponentAtIndex(inti)//得到一個指定序號的組件
795.3.8內(nèi)部框架(JInternalFrame)
內(nèi)部框架JInternalFrame就如同一個窗口在另一個窗口內(nèi)部,其特點如下:
1)必須把內(nèi)部框架添加到一個容器中(通常為JDesktopPane),否則不顯示;
2)不必調(diào)用show()或setVisible()方法,內(nèi)部框架隨所在的容器一起顯示;
3)必須用setSize()或pack()或setBounds方法設(shè)置框架尺寸,否則尺寸為零,框架不能顯示;
4)可以用setLocation()或setBounds()方法設(shè)置內(nèi)部框架在容器中的位置,缺省值為0,0,即容器的左上角;
5)象頂層JFrame一樣,對內(nèi)部框架添加組件也要加在它的內(nèi)容面板上;
6)在內(nèi)部框架中建立對話框,不能使用JDialog作為頂層窗口,必須用JOptionPane或JInternalFrame;
7)內(nèi)部框架不能監(jiān)聽窗口事件,可以通過監(jiān)聽與窗口事件類似的內(nèi)部框架(JInternalFrameEvent)處理內(nèi)部框架窗口的操作。805.3.8內(nèi)部框架(JInternalFrame)
JFrameframe=newJFrame("InternalFrameDemo");//實例化窗口
JDesktopPanedesktop=newJDesktopPane();//實例化容器JDesktopPane
MyInternalFramemyframe=newMyInternalFrame();//實例化內(nèi)部窗口
desktop.add(myframe);//把內(nèi)部窗口添加到容器中
myframe.setSelected(true);//內(nèi)部面板是可選擇的
frame.setContentPane(desktop);//把desktop設(shè)為frame的內(nèi)容面板
815.3.9按鈕(Jbutton)按鈕是一個常用組件,按鈕可以帶標(biāo)簽或圖象。常用的構(gòu)造方法有:
JButton(Iconicon)//按鈕上顯示圖標(biāo)
JButton(Stringtext)//按鈕上顯示字符
JButton(Stringtext,Iconicon)//按鈕上既顯示圖標(biāo)又顯示字符
825.3.10復(fù)選框(JCheckBox)5.3.11單選框(JRadioButton)5.3.12選擇框(JComboBox)JComboBox每次只能選擇其中的一項,但是可編輯每項的內(nèi)容,而且每項的內(nèi)容可以是任意類,而不再局限于String。
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 樂器批發(fā)商的品牌市場戰(zhàn)略規(guī)劃考核試卷
- 外賣平臺用戶隱私保護與數(shù)據(jù)安全考核試卷
- 婦科內(nèi)分泌失調(diào)的診斷考核試卷
- 建筑物防水補漏考核試卷
- 天然氣在煤炭替代中的潛力考核試卷
- 2024年新能源電池制造合同
- 無人機學(xué)習(xí)課程設(shè)計
- 工程項目管理中的項目成功因素分析考核試卷
- 機器視覺的應(yīng)用課程設(shè)計
- 小朋友戶外拓展課程設(shè)計
- TCSRME 034-2023 隧道巖溶堵水注漿技術(shù)規(guī)程
- 藝坊尋美-藝術(shù)實踐體驗坊智慧樹知到答案2024年黑龍江幼兒師范高等專科學(xué)校
- 桂枝顆粒營銷策略與品牌定位
- 墻布訂購合同協(xié)議書
- AQ/T 1089-2020 煤礦加固煤巖體用高分子材料(正式版)
- 電影作品讀解智慧樹知到期末考試答案章節(jié)答案2024年西北大學(xué)
- 倉庫貨物臨時儲存與分配計劃三篇
- 臨床骨質(zhì)疏松患者護理查房
- 新媒體與社會性別 知到智慧樹網(wǎng)課答案
- 大班健康活動《不吃三無食品》
- 婦科醫(yī)生進修匯報課件
評論
0/150
提交評論