Java圖形用戶界面
《Java圖形用戶界面》由會員分享,可在線閱讀,更多相關(guān)《Java圖形用戶界面(89頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、Java圖形用戶界面 Java界面設(shè)計的用途n Java 的圖形界面工具包,可以用于工具類軟件開發(fā)、管理類軟件開發(fā)、通用客戶端開發(fā)、銀行客戶端軟件開發(fā)、Eclipse 插件開發(fā)等方向。在許多知名的大型軟件中,都能夠見到 Java 的身影,如思維導圖軟件、Eclipse、IDEA 開發(fā)環(huán)境等。 2 AWT簡介n Abstract Windows Toolkit(AWT)是最原始的 Java GUI 工具包。它是一個非常簡單的具有有限 GUI 組件、布局管理器和事件的工具包(如窗體、文本標簽、按鈕、菜單等)。 3 Swing簡介n Swing 是 Sun 開發(fā)的一個經(jīng)過仔細設(shè)計的、靈活而強大的 G
2、UI 工具包。Swing 是在 AWT 組件基礎(chǔ)上構(gòu)建的。Swing 使用了 AWT 的事件模型和支持類,例如 Colors、Images 和 Graphics。Swing 組件、布局管理器以及事件比 AWT 提供的組件集更為廣泛,完全滿足各種開發(fā)需求。 4 SWT簡介n SWT 也是基于一個對等體實現(xiàn)的,在這一點上它與 AWT 非常類似?;?SWT 的 GUI 既具有主機外觀,又具有主機的性能。這樣就避免了使用 AWT 和 Swing 而引起的大部分問題。nSWT是IBM為它的Eclipse集成開發(fā)環(huán)境而開發(fā)的圖形用戶界面工具。SWT可以在Eclipse環(huán)境外使用,而且提供對操作系統(tǒng)本地圖
3、形用戶界面的直接訪問。因此,基于SWT的Java應用程序擁有本地的圖形用戶界面并且可以和本地別的應用程序和部件集成在一起。 5 如何選擇 GUI 工具包n AWT、Swing、SWT是 Java 中的三大 GUI 工具包,其中 Swing 是最靈活、強大的 GUI 工具包,所以在界面開發(fā)中,首選 Swing ,它可以勝任絕大多數(shù)開發(fā)工作。 6 7 本講內(nèi)容n 1、AWT事件處理模型n 2、布局管理器n 3、Swing簡介n 4、Swing組件和容器 8 用AWT生成圖形化用戶界面 抽象窗口工具包AWT (Abstract Window Toolkit) 是 API為Java 程序提供的建立圖形
4、用戶界面GUI (Graphics User Interface)工具集,AWT可用于Java的applet和applications中。它支持圖形用戶界面編程的功能包括: 用戶界面組件;事件處理模型;圖形和圖像工具,包括形狀、顏色和字體類;布局管理器,可以進行靈活的窗口布局而與特定窗口的尺寸和屏幕分辨率無關(guān);數(shù)據(jù)傳送類,可以通過本地平臺的剪貼板來進行剪切和粘貼。 9 1 用AWT生成圖形化用戶界面n java.awt包中包含了一個完整的類集以支持GUI程序的設(shè)計(重量級構(gòu)件)事件類字體類GraphicsComponent顏色類布局管理類java.lang.ObjectCheckbox Con
5、tainerButton Window Panel AppletDialogFrameList圖象類菜單類 10 1.1 java.awt包 n java.awt包中提供了GUI設(shè)計所使用的類和接口。 n java.awt包提供了基本的java程序的GUI設(shè)計工具。主要包括下述三個概念:組件Component容器Container 布局管理器-LayoutManager 11 1.2 組件和容器 n Java的圖形用戶界面的最基本組成部分是組件(Component),組件是一個可以以圖形化的方式顯示在屏幕上并能與用戶進行交互的對象,例如一個按鈕,一個標簽等。組件不能獨立地顯示出來,必須將組件放
6、在一定的容器中才可以顯示出來。 n類java.awt.Component是許多組件類的父類,Component類中封裝了組件通用的方法和屬性,如圖形的組件對象、大小、顯示位置、前景色和背景色、邊界、可見性等,因此許多組件類也就繼承了Component類的成員方法和成員變量,相應的成員方法包括:getComponentAt(int x, int y) getFont()getForeground() getName() getSize() paint(Graphics g)repaint() update()setVisible(boolean b) setSize(Dimension d)se
7、tName(String name)等 12 1.2 組件和容器n容器(Container)也是一個類,實際上是Component的子類,因此容器本身也是一個組件,具有組件的所有性質(zhì),但是它的主要功能是容納其它組件和容器。n布局管理器(LayoutManager):每個容器都有一個布局管理器,當容器需要對某個組件進行定位或判斷其大小尺寸時,就會調(diào)用其對應的布局管理器。 n為了使我們生成的圖形用戶界面具有良好的平臺無關(guān)性,Java語言中,提供了布局管理器這個工具來管理組件在容器中的布局,而不使用直接設(shè)置組件位置和大小的方式。 13 1.2 組件和容器n在程序中安排組件的位置和大小時,應該注意以下
8、兩點: 1容器中的布局管理器負責各個組件的大小和位置,因此用戶無法在這種情況下設(shè)置組件的這些屬性。如果試圖使用Java 語言提供的setLocation(),setSize(),setBounds() 等方法,則都會被布局管理器覆蓋。 2如果用戶確實需要親自設(shè)置組件大小或位置,則應取消該容器的布局管理器,方法為:setLayout(null); 14 1.3 常用容器 n容器java.awt.Container是Component的子類,一個容器可以容納多個組件,并使它們成為一個整體。容器可以簡化圖形化界面的設(shè)計,以整體結(jié)構(gòu)來布置界面。所有的容器都可以通過add()方法向容器中添加組件。有三種
9、類型的容器:Window、Panel、ScrollPane,常用的有Panel, Frame, Applet。 15 1.3 常用容器-Framen 1Frame例: import java.awt.*;public class MyFrame extends Framepublic static void main(String args )MyFrame fr = new MyFrame(Hello Out There!); /構(gòu)造方法fr.setSize(200,200); /設(shè)置Frame的大小,缺省為(0,0)fr.setBackground(Color.red);/設(shè)置Frame的
10、背景,缺省為紅色fr.setVisible(true); /設(shè)置Frame為可見,缺省為不可見public MyFrame (String str)super(str); /調(diào)用父類的構(gòu)造方法 16 1.3 常用容器-Framen一般我們要生成一個窗口,通常是用Window的子類Frame來進行實例化,而不是直接用到Window類。Frame的外觀就像我們平常在windows系統(tǒng)下見到的窗口,有標題、邊框、菜單、大小等等。每個Frame的對象實例化以后,都是沒有大小和不可見的,因此必須調(diào)用setSize( )來設(shè)置大小,調(diào)用setVisible(true)來設(shè)置該窗口為可見的。 n另外,AWT
11、在實際的運行過程中是調(diào)用所在平臺的圖形系統(tǒng),因此同樣一段AWT程序在不同的操作系統(tǒng)平臺下運行所看到的圖形系統(tǒng)是不一樣的。例如在windows下運行,則顯示的窗口是windows風格的窗口;而在UNIX下運行時,則顯示的是UNIX風格的窗口。 17 1.3 常用容器n 2Panel n Panel與Frame類似,可以添加到Frame中。 18 1.4 LayoutManager 布局管理器n Java為了實現(xiàn)跨平臺的特性并且獲得動態(tài)的布局效果,Java將容器內(nèi)的所有組件安排給一個布局管理器負責管理,如:排列順序,組件的大小、位置,當窗口移動或調(diào)整大小后組件如何變化等功能授權(quán)給對應的容器布局管理
12、器來管理,不同的布局管理器使用不同算法和策略,容器可以通過選擇不同的布局管理器來決定布局。 n布局管理器主要包括:FlowLayout,BorderLayout,GridLayout,CardLayout,GridBagLayout: 19 1.4 布局管理器-FlowLayoutn 1. FlowLayoutFlowLayout 是Panel,Applet的缺省布局管理器。其組件的放置規(guī)律是從上到下、從左到右進行放置,如果容器足夠?qū)挘谝粋€組件先添加到容器中第一行的最左邊,后續(xù)的組件依次添加到上一個組件的右邊,如果當前行已放置不下該組件,則放置到下一行的最左邊。 當容器的大小發(fā)生變化時,用F
13、lowLayout管理的組件會發(fā)生變化,其變化規(guī)律是:組件的大小不變,但是相對位置會發(fā)生變化。例如上圖中有三個按鈕都處于同一行,但是如果把該窗口變窄,窄到剛好能夠放下一個按鈕,則第二個按鈕將折到第二行,第三個按鈕將折到第三行。按鈕Open本來在按鈕OK的右邊,但是現(xiàn)在跑到了下面,所以說組件的大小不變,但是相對位置會發(fā)生變化。 20 1.4 布局管理器-FlowLayoutn構(gòu)造方法主要下面幾種: FlowLayout(FlowLayout.RIGHT,20,40);/*第一個參數(shù)表示組件的對齊方式,指組件在這一行中的位置是居中對齊、居右對齊還是居左對齊,第二個參數(shù)是組件之間的橫向間隔,第三個參
14、數(shù)是組件之間的縱向間隔,單位是象素。*/ FlowLayout(FlowLayout.LEFT); /居左對齊,橫向間隔和縱向間隔都是缺省值5個象素 FlowLayout(); /缺省的對齊方式居中對齊,橫向間隔和縱向間隔都是缺省值5個象素 n例:Frame f = new Frame(); f.setLayout(new FlowLayout();f.add(new Button(button1);f.add(new Button( button2);f.add(new Button( button3); 21 1.4 布局管理器-BorderLayout n BorderLayout 是W
15、indow,F(xiàn)rame和Dialog的缺省布局管理器。BorderLayout布局管理器把容器分成5個區(qū)域:North,South,East,West和Center,每個區(qū)域只能放置一個組件。f.setLayout(new BorderLayout();f.add(North, new Button(North);/第一個參數(shù)表示把按鈕添加到容器的North區(qū)域 n在使用BorderLayout的時候,如果容器的大小發(fā)生變化,其變化規(guī)律為:組件的相對位置不變,大小發(fā)生變化。例如容器變高了,則North、South區(qū)域不變,West、Center、East區(qū)域變高;如果容器變寬了,West、Ea
16、st區(qū)域不變,North、Center、South區(qū)域變寬。不一定所有的區(qū)域都有組件,如果四周的區(qū)域(West、East、North、South區(qū)域)沒有組件,則由Center區(qū)域去補充,但是如果Center區(qū)域沒有組件,則保持空白:CenterNorthSouthWest East 22 1.4 布局管理器-GridLayoutn使容器中各個組件呈網(wǎng)格狀布局,平均占據(jù)容器的空間。 n Frame f = new Frame(GridLayout);f.setLayout(new GridLayout(3,2); /容器平均分成3行2列共6格f.add(new Button(1); /添加到第
17、一行的第一格f.add(new Button(2); /添加到第一行的下一格.f.add(new Button(6); /添加到第二行的第三格 23 1.4 布局管理器-CardLayoutCardLayout布局管理器能夠幫助用戶處理兩個以至更多的成員共享同一顯示空間,它把容器分成許多層,每層的顯示空間占據(jù)整個容器的大小,但是每層只允許放置一個組件,當然每層都可以利用Panel來實現(xiàn)復雜的用戶界面。牌布局管理器(CardLayout)就象一副疊得整整齊齊的撲克牌一樣,有54張牌,但是你只能看見最上面的一張牌,每一張牌就相當于牌布局管理器中的每一層。 24 1.4 布局管理器n容器的嵌套在復雜
18、的圖形用戶界面設(shè)計中,為了使布局更加易于管理,具有簡潔的整體風格,一個包含了多個組件的容器本身也可以作為一個組件加到另一個容器中去,容器中再添加容器,這樣就形成了容器的嵌套。下面是一個容器嵌套的例子。n例:f = new Frame(GUI example 3);bw=new Button(West);bc=new Button(Work space region);f.add(bw,West);f.add(bc,Center);p = new Panel();f.add(p,North);bfile= new Button(File); bhelp= new Button(Help);p.a
19、dd(bfile); p.add(bhelp);f.pack(); f.setVisible(true); 25 1.4 布局管理器小 結(jié):1Frame是一個頂級窗口。Frame的缺省布局管理器為BorderLayout。2Panel 無法單獨顯示,必須添加到某個容器中。 Panel 的缺省布局管理器為FlowLayout。3當把Panel 作為一個組件添加到某個容器中后,該Panel 仍然可以有自己的布局管理器。因此,可以利用Panel 使得BorderLayout 中某個區(qū)域顯示多個組件,達到設(shè)計復雜用戶界面的目的 。4如果采用無布局管理器 setLayout(null),則必須使用set
20、Location(),setSize(),setBounds()等方法手工設(shè)置組件的大小和位置,此方法會導致平臺相關(guān),不鼓勵使用。 26 2 AWT事件處理模型 要能夠讓圖形界面接收用戶的操作,就必須給各個組件加上事件處理機制。在事件處理的過程中,主要涉及三類對象: Event-事件,用戶對界面操作在java語言上的描述,以類的形式出現(xiàn),例如鍵盤操作對應的事件類是KeyEvent。 Event Source-事件源,事件發(fā)生的場所,通常就是各個組件,例如按鈕Button。 Event handler-事件處理者,接收事件對象并對其進行處理的對象。 27 事件及處理機制n組件(事件發(fā)生者)觸發(fā)一
21、個相應類型的事 件n此事件由相應類型的Listener(事件監(jiān)聽者) 接收并處理Button1事件發(fā)生者接收事件e,并做處理ActionListener事件監(jiān)聽者觸發(fā)ActionEvente點擊 28 事件及處理機制 調(diào)用按扭的 addActionListener ( ) 方法,為該按扭指定監(jiān)聽者。鼠標單擊按扭ActionEvent事件觸發(fā)public void actionPerformed(ActionEvent e)ActionListener接口ActionEvent事件監(jiān)聽者類監(jiān)聽者對象實現(xiàn)接口 29 實現(xiàn)步驟n根據(jù)需要定義相應類型的監(jiān)聽者類,在類的 定義中完成事件的處理;n創(chuàng)建事件
22、監(jiān)聽者對象;n為將會觸發(fā)事件的組件C注冊相應的事件監(jiān)聽 者對象(使用C的addXXXListener()方法)。n例:ButtonAct.java 30 publicclassButtonActextendsFrame.publicButtonAct()./為b1注冊事件監(jiān)聽者B1b1.addActionListener(newB1();add(b1);./利用innerclass結(jié)構(gòu)定義監(jiān)聽者類classB1implementsActionListener/利用actionPerformed方法進行事件處理publicvoidactionPerformed(ActionEvente)who.
23、setText(Button1);./: 31 2.1 事件類n與AWT有關(guān)的所有事件類都由java.awt.AWTEvent類派生,它也是EventObject類的子類。AWT事件共有10類,可以歸為兩大類:低級事件和高級事件。n java.util.EventObject類是所有事件對象的基礎(chǔ)父類,所有事件都是由它派生出來的。AWT的相關(guān)事件繼承于java.awt.AWTEvent類,這些AWT事件分為兩大類:低級事件和高級事件,低級事件是指基于組件和容器的事件,當一個組件上發(fā)生事件,如:鼠標的進入,點擊,拖放等,或組件的窗口開關(guān)等,觸發(fā)了組件事件。高級事件是基于語義的事件,它可以不和特定
24、的動作相關(guān)聯(lián),而依賴于觸發(fā)此事件的類,如在TextField中按Enter鍵會觸發(fā)ActionEvent事件,滑動滾動條會觸發(fā)AdjustmentEvent事件,或是選中項目列表的某一條就會觸發(fā)ItemEvent事件。 32 2.1 事件類 低級事件ComponentEvent( 組件事件:組件尺寸的變化,移動) ContainerEvent( 容器事件:組件增加,移動) WindowEvent( 窗口事件:關(guān)閉窗口,窗口閉合,圖標化) FocusEvent( 焦點事件:焦點的獲得和丟失) KeyEvent( 鍵盤事件:鍵按下、釋放) MouseEvent( 鼠標事件:鼠標單擊,移動) 高級事
25、件(語義事件)ActionEvent(動作事件:按鈕按下,TextField中按Enter鍵)AdjustmentEvent(調(diào)節(jié)事件:在滾動條上移動滑塊以調(diào)節(jié)數(shù)值)ItemEvent(項目事件:選擇項目,不選擇項目改變)TextEvent(文本事件,文本對象改變) 33 2.2 事件監(jiān)聽器n每類事件都有對應的事件監(jiān)聽器,監(jiān)聽器是接口,根據(jù)動作來定義方法。 n AWT的組件類中提供注冊和注銷監(jiān)聽器的方法: 注冊監(jiān)聽器:public void add (listener); 注銷監(jiān)聽器:public void remove (listener); 例如Button類:(查API)public c
26、lass Button extends Component public synchronized void addActionListener(ActionListener l); public synchronized void removeActionListener(ActionListener l); 34 2.3 AWT事件及其相應的監(jiān)聽器接口 n 1可以聲明多個接口,接口之間用逗號隔開。implements MouseMotionListener, MouseListener, WindowListener; n 2可以由同一個對象監(jiān)聽一個事件源上發(fā)生的多種事件:f.addMou
27、seMotionListener(this);f.addMouseListener(this);f.addWindowListener(this);則對象f 上發(fā)生的多個事件都將被同一個監(jiān)聽器接收和處理。 35 2.3 AWT事件及其相應的監(jiān)聽器接口n 3事件處理者和事件源處在同一個類中。本例中事件源是Frame f,事件處理者是類ThreeListener,其中事件源Frame f是類ThreeListener的成員變量。在這里所有的事件偵聽器方法都要在主類中聲明。 public class ThreeListener implements MouseMotionListener,Mouse
28、Listener,WindowListener f = new Frame(Three listeners example); f.addMouseMotionListener(this); /注冊監(jiān)聽器MouseMotionListenerf.addMouseListener(this); /注冊監(jiān)聽器MouseListenerf.addWindowListener(this); /注冊監(jiān)聽器WindowListener 36 2.3 AWT事件及其相應的監(jiān)聽器接口n 4可以通過事件對象獲得詳細資料,比如本例中就通過事件對象獲得了鼠標發(fā)生時的坐標值。public void mouseDrag
29、ged(MouseEvent e) String s=Mouse dragging :X=+e.getX()+Y=+e.getY();tf.setText(s); n Java語言類的層次非常分明,因而只支持單繼承,為了實現(xiàn)多重繼承的能力,Java用接口來實現(xiàn),一個類可以實現(xiàn)多個接口,這種機制比多重繼承具有更簡單、靈活、更強的功能。在AWT中就經(jīng)常用到聲明和實現(xiàn)多個接口。記住無論實現(xiàn)了幾個接口,接口中已定義的方法必須一一實現(xiàn),如果對某事件不感興趣,可以不具體實現(xiàn)其方法,而用空的方法體來代替。但卻必須所有方法都要寫上。 37 2.4 事件適配器n Java語言為一些Listener接口提供了適配
30、器(Adapter)類??梢酝ㄟ^繼承事件所對應的Adapter類,重寫需要方法,無關(guān)方法不用實現(xiàn)。事件適配器為我們提供了一種簡單的實現(xiàn)監(jiān)聽器的手段, 可以縮短程序代碼。但是,由于java的單一繼承機制,當需要多種監(jiān)聽器或此類已有父類時,就無法采用事件適配器了。 38 2.4 事件適配器n 1事件適配器-EventAdapter下例中采用了鼠標適配器:import java.awt.*;import java.awt.event.*;public class MouseClickHandler extends MouseAdaperpublic void mouseClicked(MouseEv
31、ent e) /只實現(xiàn)需要的方法 n java.awt.event包中定義的事件適配器類包括以下幾個:1ComponentAdapter( 組件適配器) 2ContainerAdapter( 容器適配器) 3FocusAdapter( 焦點適配器) 4KeyAdapter( 鍵盤適配器) 5MouseAdapter( 鼠標適配器) 6MouseMotionAdapter( 鼠標運動適配器)7WindowAdapter( 窗口適配器) 39 2.4 事件適配器n 2. 用內(nèi)部類實現(xiàn)事件處理內(nèi)部類(inner class)是被定義于另一個類中的類,使用內(nèi)部類的主要原因是由于: 一個內(nèi)部類的對象可訪
32、問外部類的成員方法和變量,包括私有的成員。 實現(xiàn)事件監(jiān)聽器時,采用內(nèi)部類、匿名類編程非常容易實現(xiàn)其功能。 編寫事件驅(qū)動程序,內(nèi)部類很方便。 注意:使用的內(nèi)部類不能在靜態(tài)方法(如main方法)中調(diào)用。 40 import java.awt.* ;import java.awt.event.*;public class InnerClassprivate Frame f;private TextField tf;public InnerClass()f=new Frame(Inner classes example);tf=new TextField(30);public voidi launch
33、Frame()Label label=new Label(Click and drag the mouse);f.add(label,BorderLayout.NORTH);f.add(tf,BorderLayout.SOUTH);f.addMouseMotionListener(new MyMouseMotionListener();/*參數(shù)為內(nèi)部類對象*/f.setSize(300,200);f.setVisible(true); class MyMouseMotionListener extends MouseMotionAdapter /*內(nèi)部類開始*/public void mous
34、eDragged(MouseEvent e) String s=Mouse dragging: x=+e.getX()+Y=+e.getY();tf.setText(s); ; public static void main(String args) InnerClass obj=new InnerClass();obj.launchFrame();/內(nèi)部類結(jié)束 41 2.4 事件適配器n 3匿名類(Anonymous Class)當一個內(nèi)部類的類聲名只是在創(chuàng)建此類對象時用了一次,而且要產(chǎn)生的新類需繼承于一個已有的父類或?qū)崿F(xiàn)一個接口,才能考慮用匿名類,由于匿名類本身無名,因此它也就不存在構(gòu)造方
35、法,它需要顯示地調(diào)用一個無參的父類的構(gòu)造方法,并且重寫父類的方法。所謂的匿名就是該類連名字都沒有,只是顯示地調(diào)用一個無參的父類的構(gòu)造方法。 n f.addMouseMotionListener(new MouseMotionAdapter() /匿名類開始public void mouseDragged(MouseEvent e)String s=Mouse dragging: x=+e.getX()+Y=+e.getY();tf.setText(s); ); /匿名類結(jié)束 42 3 AWT組件庫 n本節(jié)從應用的角度進一步介紹AWT的一些組件,目的使大家加深對AWT的理解,掌握如何用各種組件構(gòu)
36、造圖形化用戶界面,學會控制組件的顏色和字體。下面是一些常用的組件的介紹: 43 3 AWT組件庫n 1 按鈕(Button)按鈕是最常用的一個組件,其構(gòu)造方法是:Button b = new Button(Quit); 當按鈕被點擊后,會產(chǎn)生ActionEvent事件,需ActionListener接口進行監(jiān)聽和處理事件。ActionEvent的對象調(diào)用getActionCommand()方法可以得到按鈕的標識名,缺省按鈕名為label。用setActionCommand()可以為按鈕設(shè)置組件標識符。 44 3 AWT組件庫n 2.復選框 (Checkbox)復選框提供簡單的on/off開關(guān),
37、旁邊顯示文本標簽。構(gòu)造方法如下:setLayout(new GridLayout(3,1);add(new Checkbox(one,null,true);add(new Checkbox(two);add(new Checkbox(three);復選框用ItemListener 來監(jiān)聽ItemEvent事件,當復選框狀態(tài)改變時用getStateChange()獲取當前狀態(tài)。使用getItem()獲得被修改復選框的字符串對象。 n class Handler implements ItemListener public void itemStateChanged(ItemEvent ev)St
38、ring state = deselected;if (ev.getStateChange() = = ItemEvent.SELECTED)state = selected System.out.println(ev.getItem()+ +state); 45 3 AWT組件庫n 3.復選框組(CheckboxGroup)使用復選框組,可以實現(xiàn)單選框的功能。方法如下: setLayout(new GridLayout(3, 1);CheckboxGroup cbg = new CheckboxGroup();add(new Checkbox(one, cbg, true);add(new
39、Checkbox(two, cbg, false);add(new Checkbox(three, cbg, false); 46 3 AWT組件庫n 4. 下拉式菜單(Choice)下拉式菜單每次只能選擇其中的一項,它能夠節(jié)省顯示空間,適用于大量選項。Choice Colorchooser=new Choice();Colorchooser.add(Green);Colorchooser.add(Red);Colorchooser.add(Blue);Choice 用ItemListener接口來進行監(jiān)聽 47 3 AWT組件庫n 5. Canvas一個應用程序必須繼承Canvas類才能獲得
40、有用的功能,比如創(chuàng)建一個自定義組件。如果想在畫布上完成一些圖形處理,則Canvas類中的paint()方法必須被重寫。Canvas組件監(jiān)聽各種鼠標,鍵盤事件。當在Canvas組件中輸入字符時,必須先調(diào)用requestFocus()方法。 48 3 AWT組件庫n 6. 單行文本輸入?yún)^(qū)(TextField)只能顯示一行,當回車鍵被按下時,會發(fā)生ActionEvent事件,可以通過ActionListener中的actionPerformed()方法對事件進行相應處理??梢允褂胹etEditable(boolean)方法設(shè)置為只讀屬性。單行文本輸入?yún)^(qū)構(gòu)造方法如下:TextField tf1,tf2
41、,tf3,tf4:tf1=new TextField(); tf2=new TextField(,20); /顯示區(qū)域為20列tf3=new TextField(Hello!); /按文本區(qū)域大小顯示tf4=new TextField(Hello!,30); /初始文本為Hello!, 顯示區(qū)域為30列 49 3 AWT組件庫n 7. 文本輸入?yún)^(qū)(TextArea)TextArea可以顯示多行多列的文本。使用setEditable(boolean)方法,可以將其設(shè)置為只讀的。在TextArea中可以顯示水平或垂直的滾動條。要判斷文本是否輸入完畢,可以在TextArea旁邊設(shè)置一個按鈕,通過按鈕
42、點擊產(chǎn)生的ActionEvent對輸入的文本進行處理。 n 8. 列表(List)列表中提供了多個文本選項,列表支持滾動條,可以瀏覽多項List lst=new List(4,false); /兩個參數(shù)分別表示顯示的行數(shù)、是否允許多選lst.add(Venus);lst.add(Earth);lst.add(JavaSoft); lst.add(Mars);cnt.add(lst); 50 3 AWT組件庫n 9. 框架(Frame)Frame是頂級窗口,可以顯示標題,重置大小。當Frame被關(guān)閉,將產(chǎn)生WindowEvent事件,F(xiàn)rame無法直接監(jiān)聽鍵盤輸入事件。 n 10. 對話框(Di
43、alog)它是Window類的子類。對話框和一般窗口的區(qū)別在于它依賴于其它窗口。對話框分為非模式(non-modal)和模式(modal)兩種。n 11. 文件對話框(Filedialog)當用戶想打開或存儲文件時,使用文件對話框進行操作。主要代碼如下: FileDialog d=new FileDialog(ParentFr,FileDialog);d.setVisible(true);String filename=d.getFile(); 51 3 AWT組件庫n 12. 菜單(Menu)無法直接將菜單添加到容器的某一位置,也無法使用布局管理器對其加以控制。菜單只能被添加?quot;菜單
44、容器(MenuBar)中。 n 13. MenuBar只能被添加到Frame對象中,作為整個菜單樹的根基。Frame fr = new Frame(MenuBar);MenuBar mb = new MenuBar();fr.setMenuBar(mb);fr.setSize(150,100);fr.setVisible(true); 52 3 AWT組件庫n 14. Menu下拉菜單。它可以被添加到MenuBar中或其它Menu中。Frame fr = new Frame(MenuBar);MenuBar mb = new MenuBar();fr.setMenuBar(mb);Menu m
45、1 = new Menu(File);mb.add(m1);n 15. MenuItemMenuItem是菜單樹中的葉子節(jié)點。MenuItem通常被添加到一個Menu中。對于MenuItem對象可以添加ActionListener,使其能夠完成相應的操作。Menu m1 = new Menu(File);MenuItem mi1 = new MenuItem(Save); 53 本講小結(jié)-AWT用AWT來生成圖形化用戶界面時,組件和容器的概念非常重要。組件是各種各樣的類,封裝了圖形系統(tǒng)的許多最小單位,例如按鈕、窗口等等;而容器也是組件,它的最主要的作用是裝載其它組件,但是象Panel這樣的容器
46、也經(jīng)常被當作組件添加到其它容器中,以便完成雜的界面設(shè)計。布局管理器是java語言與其它編程語言在圖形系統(tǒng)方面較為顯著的區(qū)別,容器中各個組件的位置是由布局管理器來決定的,共有5種布局管理器,每種布局管理器都有自己的放置規(guī)律。事件處理機制能夠讓圖形界面響應用戶的操作,主要涉及到事件源、事件、事件處理者等三方,事件源就是圖形界面上的組件,事件就是對用戶操作的描述,而事件處理者是處理事件的類。因此,對于AWT中所提供的各個組件,我們都需要了解該組件經(jīng)常發(fā)生的事件以及處理該事件的相應的監(jiān)聽器接口。 54 4 Swing簡介 55 4.1 簡介前面我們學習了AWT,AWT是Swing的基礎(chǔ)。Swing的產(chǎn)
47、生主要原因就是AWT不能滿足圖形化用戶界面發(fā)展的需要。AWT設(shè)計的初衷是支持開發(fā)小應用程序的簡單用戶界面。例如AWT缺少剪貼板、打印支持、鍵盤導航等特性,而且原來的AWT甚至不包括彈出式菜單或滾動窗格等基本元素。此外AWT還存在著嚴重的缺陷,人們使AWT適應基于繼承的、具有很大伸縮性的事件模型,基于同位體的體系結(jié)構(gòu)也成為其致命的弱點。隨著發(fā)展的需要,Swing出現(xiàn)了,Swing組件幾乎都是輕量組件,與重量組件相比,沒有本地的對等組件,不像重量組件要在它們自己的本地不透明窗體中繪制,輕量組件在它們的重量組件的窗口中繪制。 56 4.1 簡介n Swing是由100%純Java實現(xiàn)的,Swing組
48、件是用Java實現(xiàn)的輕量級( light-weight)組件,沒有本地代碼,不依賴操作系統(tǒng)的支持,這是它與AWT組件的最大區(qū)別。由于AWT組件通過與具體平臺相關(guān)的對等類(Peer)實現(xiàn),因此Swing比AWT組件具有更強的實用性。Swing在不同的平臺上表現(xiàn)一致,并且有能力提供本地窗口系統(tǒng)不支持的其它特性。 n Swing采用了一種MVC的設(shè)計范式,即模型-視圖-控制(Model-View-Controller),其中模型用來保存內(nèi)容,視圖用來顯示內(nèi)容,控制器用來控制用戶輸入。 n在AWT組件中,由于控制組件外觀的對等類與具體平臺相關(guān),使得AWT組件總是只有與本機相關(guān)的外觀。Swing使得程序
49、在一個平臺上運行時能夠有不同的外觀。用戶可以選擇自己習慣的外觀。 57 4.2 Swing的類層次結(jié)構(gòu) n在javax.swing包中,定義了兩種類型的組件:頂層容器(JFrame,JApplet,JDialog和JWindow)和輕量級組件。Swing組件都是AWT的Container類的直接子類和間接子類。n java.awt.Component-java.awt.Container-java.awt.Window-java.awt.Frame-javax.swing.JFrame-javax.Dialog-javax.swing.JDialog-javax.swing.JWindow-j
50、ava.awt.Applet-javax.swing.JApplet -javax.swing.Box-javax.swing.Jcomponet 58 4.2 Swing的類層次結(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組件。
51、swing.table包中主要包括了表格組建(JTable)的支持類。swing.tree同樣是JTree的支持類。swing.text、swing.text.html、swing.text.html.parser和swing.text.rtf都是用于顯示和編輯文檔的包。 59 4.3 Swing組件的多樣化 n Swing是AWT的擴展,它提供了許多新的圖形界面組件。Swing組件以J開頭,除了有與AWT類似的按鈕(JButton)、標簽(JLabel)、復選框(JCheckBox)、菜單(JMenu)等基本組件外,還增加了一個豐富的高層組件集合,如表格(JTable)、樹(JTree)。
52、60 4.4 MVC(Model-View-Control)體系結(jié)構(gòu)Swing勝過AWT的主要優(yōu)勢在于MVC體系結(jié)構(gòu)的普遍使用。在一個MVC用戶界面中,存三個通訊對象:模型、視圖和控件。模型是指定的邏輯表示法,視圖是模型的可視化表示法,而控件則指定了如何處理用戶輸入。當模型發(fā)生改變時,它會通知所有依賴它的視圖,視圖使用控件指定其相應機制。 為了簡化組件的設(shè)計工作,在Swing組件中視圖和控件兩部分合為一體。每個組件有一個相關(guān)的分離模型和它使用的界面(包括視圖和控件)。比如,按鈕JButton有一個存儲其狀態(tài)的分離模型ButtonModel對象。組件的模型是自動設(shè)置的,例如一般都使用JButto
53、n 而不是使用ButtonModel 對象。另外,通過Model類的子類或通過實現(xiàn)適當?shù)慕涌?,可以為組件建立自己的模型。把數(shù)據(jù)模型與組件聯(lián)系起來用setModel( )方法。MVC是現(xiàn)有的編程語言中制作圖形用戶界面的一種通用的思想,其思路是把數(shù)據(jù)的內(nèi)容本身和顯示方式分離開,這樣就使得數(shù)據(jù)的顯示更加靈活多樣。比如,某年級 各個班級的學生人數(shù)是數(shù)據(jù),則顯示方式是多種多樣的,可以采用柱狀圖顯示,也可以采用餅圖顯示,也可以采用直接的數(shù)據(jù)輸出。因此在設(shè)計的時候,就考慮把數(shù)據(jù)和顯示方式分開,對于實現(xiàn)多種多樣的顯示是非常有幫助的。 61 4.5 可存取性支持 n所有Swing組件都實現(xiàn)了Accessible
54、接口,提供對可存取性的支持,使得輔助功能如屏幕閱讀器能夠十分方便的從Swing組件中得到信息。 62 4.6 支持鍵盤操作 n在Swing組件中,使用JComponent類的registerKeyboardAction()方法,能使用戶通過鍵盤操作來替代鼠標驅(qū)動GUI上Swing組件的相應動作。有些類還為鍵盤操作提供了更便利的方法。即設(shè)定熱鍵。 63 4.7 設(shè)置邊框 n對Swing組件可以設(shè)置一個和多個邊框。Swing中提供了各式各樣的邊框供用戶選用,也能建立組合邊框或自己設(shè)計邊框。一種空白邊框可以增大組件,協(xié)助布局管理器對容器中的組件進行合理的布局。 64 4.8 使用圖標(Icon) n
55、與AWT的部件不同,許多Swing組件如按鈕、標簽,除了使用文字外,還可以使用圖標修飾自己。 65 4.9 Swing程序結(jié)構(gòu)簡介 n Swing的程序設(shè)計一般可按照下列流程進行:1 引入Swing包2 選擇外觀和感覺3 設(shè)置頂層容器4 設(shè)置按鈕和標簽5 向容器中添加組件6 在組件周圍添加邊界7 進行事件處理 66 5 Swing組件和容器 67 5.1 組件的分類 n Jcomponent是一個抽象類,用于定義所有子類組件的一般方法,其類層次結(jié)構(gòu)如下所示: java.lang.Object|+-java.awt.Component|+-java.awt.Container|+-javax.s
56、wing.JComponent并不是所有的Swing組件都繼承于JComponent類,JComponent類繼承于Container類,所以凡是此類的組件都可作為容器使用。 68 5.1 組件的分類n組件從功能上分可分為:1) 頂層容器:JFrame,JApplet,JDialog,JWindow共4個2) 中間容器:JPanel,JScrollPane,JSplitPane,JToolBar3) 特殊容器:在GUI上起特殊作用的中間層,如JInternalFrame,JLayeredPane,JRootPane.4) 基本控件:實現(xiàn)人際交互的組件,如Jbutton, JComboBox,
57、JList, JMenu, JSlider, JtextField。5) 不可編輯信息的顯示:向用戶顯示不可編輯信息的組件,例如JLabel, JProgressBar, ToolTip。6) 可編輯信息的顯示:向用戶顯示能被編輯的格式化信息的組件,如JColorChooser, JFileChoose, JFileChooser, Jtable, JtextArea。 69 5.1 組件的分類n JComponent類的特殊功能又分為:1) 邊框設(shè)置:使用setBorder()方法可以設(shè)置組件外圍的邊框,使用一個EmptyBorder對象能在組件周圍留出空白。 2) 雙緩沖區(qū):使用雙緩沖技術(shù)
58、能改進頻繁變化的組件的顯示效果。與AWT組件不同,JComponent組件默認雙緩沖區(qū),不必自己重寫代碼。如果想關(guān)閉雙緩沖區(qū),可以在組件上施加setDoubleBuffered(false)方法。3) 提示信息:使用setTooltipText()方法,為組件設(shè)置對用戶有幫助的提示信息。4) 鍵盤導航:使用registerKeyboardAction( ) 方法,能使用戶用鍵盤代替鼠標來驅(qū)動組件。JComponent類的子類AbstractButton還提供了便利的方法用setMnemonic( )方法指明一個字符,通過這個字符和一個當前L/把其它組件添加到Jpanel中; frame.set
59、ContentPane(contentPane); /把contentPane對象設(shè)置成為frame的內(nèi)容面板 71 5.3 各種容器面板和組件 72 5.3.1 根面板(JRootPane)n根面板由一個玻璃面板(glassPane)、一個內(nèi)容面板(contentPane)和一個可選擇的菜單條(JMenuBar)組成,而內(nèi)容面板和可選擇的菜單條放在同一分層。玻璃面板是完全透明的,缺省值為不可見,為接收鼠標事件和在所有組件上繪圖提供方便。根面板提供的方法:Container getContentPane(); /獲得內(nèi)容面板setContentPane(Container); /設(shè)置內(nèi)容面JM
60、enuBar getMenuBar( ); /活動菜單條setMenuBar(JMenuBar); /設(shè)置菜單條JLayeredPane getLayeredPane(); /獲得分層面板setLayeredPane(JLayeredPane); /設(shè)置分層面板Component getGlassPane(); /獲得玻璃面板setGlassPane(Component); /設(shè)置玻璃面板 73 5.3.2 分層面板(JLayeredPane) n Swing提供兩種分層面板:JlayeredPane和JDesktopPane。 JDesktopPane是JLayeredPane的子類,專門為
61、容納內(nèi)部框架(JInternalFrame)而設(shè)置。向一個分層面板種添加組件,需要說明將其加入哪一層,指明組件在該層中的位置:add(Component c, Integer Layer, int position)。 74 5.3.3 面板(JPanel) n面板(JPanel)是一個輕量容器組件,用法與Panel相同,用于容納界面元素,以便在布局管理器的設(shè)置下可容納更多的組件,實現(xiàn)容器的嵌套。Jpanel, JscrollPane, JsplitPane, JinteralFrame都屬于常用的中間容器,是輕量組件。Jpanel的缺省布局管理器是FlowLayout。 75 5.3.4 滾
62、動窗口(JScrollPane) n JscrollPane是帶滾動條的面板,主要是通過移動JViewport(視口)來實現(xiàn)的。JViewport是一種特殊的對象,用于查看基層組件,滾動條實際就是沿著組件移動視口,同時描繪出它在下面看到的內(nèi)容。 76 5.3.5 分隔板(JSplitPane) n JSplitPane提供可拆分窗口,支持水平拆分和垂直拆分并帶有滑動條。 常用方法有:addImpl(Component comp,Object constraints,int index)/增加指定的組件setTopComponent(Component comp) /設(shè)置頂部的組件setDivi
63、derSize(int newSize) /設(shè)置拆分的大小setUI(SplitPaneUI ui) /設(shè)置外觀和感覺 77 5.3.6 選項板(JTabbedPane) n JTabbedPane提供一組可供用戶選擇的帶有標簽或圖標的開關(guān)鍵。常用方法:add(String title,Component component) /增加一個帶特定標簽的組件addChangeListener(ChangeListener l) /選項板注冊一個變化監(jiān)聽器 78 5.3.7 工具欄(JtoolBar) n JtoolBar是用于顯示常用工具控件的容器。用戶可以拖拽出一個獨立的可顯示工具控件的窗口。常
64、用方法有:JToolBar(String name) /構(gòu)造方法getComponentIndex(Component c) /返回一個組件的序號getComponentAtIndex(int i) /得到一個指定序號的組件 79 5.3.8 內(nèi)部框架(JInternalFrame) n內(nèi)部框架JInternalFrame就如同一個窗口在另一個窗口內(nèi)部,其特點如下:1) 必須把內(nèi)部框架添加到一個容器中(通常為JDesktopPane),否則不顯示;2) 不必調(diào)用show()或setVisible()方法,內(nèi)部框架隨所在的容器一起顯示;3) 必須用setSize()或pack()或setBoun
65、ds方法設(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)部框架窗口的操作。 80 5.3.8 內(nèi)部框架(JInternalFrame)JFrame frame=n
66、ew JFrame(InternalFrameDemo); /實例化窗口JDesktopPane desktop=new JDesktopPane(); /實例化容器JDesktopPaneMyInternalFrame myframe=new MyInternalFrame(); /實例化內(nèi)部窗口desktop.add(myframe); /把內(nèi)部窗口添加到容器中myframe.setSelected(true); /內(nèi)部面板是可選擇的frame.setContentPane(desktop); /把desktop設(shè)為frame的內(nèi)容面板 81 5.3.9 按鈕(Jbutton) n按鈕是一個常用組件,按鈕可以帶標簽或圖象。 n常用的構(gòu)造方法有:JButton(Icon icon) /按鈕上顯示圖標JButton(String text) /按鈕上顯示字符JButton(String text, Icon icon) /按鈕上既顯示圖標又顯示字符 82 n 5.3.10 復選框(JCheckBox) n 5.3.11 單選框(JRadioButton)n 5.3.12 選擇框(JCo
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。