java課件6javagui_第1頁(yè)
已閱讀1頁(yè),還剩55頁(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)介

1、圖形用戶界面GUI,信息學(xué)院·計(jì)算機(jī)系統(tǒng)研究所·吳剛信息學(xué)館415,行勝于言 敢為人先 和而不同 居安思危,1,GUI(Graphical User Interface),Java語(yǔ)言的GUI歷史AWT事件處理GUI組件上的圖形操作布局管理器常用AWT組件Swing,行勝于言 敢為人先 和而不同 居安思危,2,JAVA語(yǔ)言的GUI歷史,,行勝于言 敢為人先 和而不同 居

2、安思危,3,GUI歷史——先驅(qū),道格拉斯·恩格爾巴特(Dr. Douglas C. Engelbart,1925年1月30日-),美國(guó)發(fā)明家,瑞典人和挪威人后裔發(fā)明了鼠標(biāo)開發(fā)了超文本系統(tǒng)On-Line System(NLS)、網(wǎng)絡(luò)計(jì)算機(jī)…,行勝于言 敢為人先 和而不同 居安思危,4,Chorded keyboard,five keys: 1,2,4,8,16. The keys were mapped as

3、follows: a = 1, b = 2, c = 3=a+b, d = 4,,Alan Kay和Xerox AltoIvan Sutherland和Sketchpad,行勝于言 敢為人先 和而不同 居安思危,5,,WIMPwindows, icons, menus and pointing devicePost-WIMP,行勝于言 敢為人先 和而不同 居安思危,6,Java語(yǔ)言的GUI歷史,AWT(A

4、bstract Window Toolkit)JDK1.0具有下拉菜單、命令按鈕、滾動(dòng)條以及其他常見(jiàn)的GUI控件能夠在各種操作系統(tǒng)上運(yùn)行而不必重新編譯成針對(duì)某一平臺(tái)的二進(jìn)制代碼( Microsoft Windows、Sun Solaris、Apple Mac OS以及Linux )每個(gè)組件都由一個(gè)本地的等同組件生成和控制,這個(gè)本地組件是由當(dāng)前的圖形視窗系統(tǒng)決定的致命弱點(diǎn):功能很弱,為了保證移植性,就只能使用所有圖形操作系統(tǒng)的圖

5、形接口都能夠支持的最少特性(即功能的交集),行勝于言 敢為人先 和而不同 居安思危,7,,早期Java/AWT包所開發(fā)的接口實(shí)在是不敢恭維缺少流行GUI程序的許多特性,又不能達(dá)到在顯示和行為上像用本地窗口構(gòu)建庫(kù)開發(fā)的程序一樣的目標(biāo),行勝于言 敢為人先 和而不同 居安思危,8,,Swing工具包J2SE1.2JFC(Java Foundation Class)的一部分對(duì)AWT的升級(jí), Swing API 的

6、大部分是AWT的補(bǔ)充擴(kuò)展而不是直接的代替龐大的GUI庫(kù),結(jié)構(gòu)復(fù)雜與AWT不同,用純Java寫成(繪制組件的核心渲染功能是由Java2D提供的),不需要操作系統(tǒng)本身所帶視窗工具包的本地資源來(lái)生成,所以同Java本身一樣可以跨平臺(tái)運(yùn)行,行勝于言 敢為人先 和而不同 居安思危,9,,通常與本地外觀不同,但支持可更換的面板和主題(如模擬本地外觀或其他操作系統(tǒng)外觀)提供了高級(jí)組件:標(biāo)簽面板,滾動(dòng)面板,樹,表格和列表,行勝于言

7、 敢為人先 和而不同 居安思危,10,,,不要混用 AWT和 Swing: 容易造成 Z-order不兼容,行勝于言 敢為人先 和而不同 居安思危,11,,2000年以后,IBM表示將投入10億美元開發(fā)Linux產(chǎn)品以對(duì)抗微軟,其中影響最深遠(yuǎn)的應(yīng)該就是Eclipse計(jì)劃2001年6月,IBM宣布捐贈(zèng)價(jià)值4000萬(wàn)美元的軟件工具作為公共財(cái)產(chǎn),并成立一個(gè)針對(duì)開發(fā)人員所設(shè)置的開放源代碼機(jī)構(gòu)Eclipse平臺(tái)完全基于

8、Java編寫而成,因此也具有跨平臺(tái)的特性,可以在Linux和Windows平臺(tái)下共同使用,行勝于言 敢為人先 和而不同 居安思危,12,,SWT(Standard Widget Toolkit)IBM一個(gè)專門部門獨(dú)立進(jìn)行研發(fā)的,該部門最初的目的是想創(chuàng)建一套AWT(Abstract Window Toolkit)與Swing的替代品,外觀上能夠和本地操作系統(tǒng)的本地部件那樣精美并且性能優(yōu)異是“由一套獨(dú)立于操作系統(tǒng)的API以及

9、本地原生窗口集成起來(lái)的圖形庫(kù)與小部件集”以JNI為基礎(chǔ),提供對(duì)運(yùn)行平臺(tái)的直接調(diào)用的封裝,即API調(diào)用與平臺(tái)無(wú)關(guān),行勝于言 敢為人先 和而不同 居安思危,13,,,開發(fā)出來(lái)的應(yīng)用具備本地操作系統(tǒng)的外觀與特性只有在當(dāng)前操作系統(tǒng)中找不到需要的部件時(shí),SWT才會(huì)自己繪制圖形,應(yīng)用的響應(yīng)速度有很大提升與AWT有更多的共同之處缺點(diǎn):必須為每一種操作系統(tǒng)準(zhǔn)備一套本地函數(shù)庫(kù),不像Swing那樣靈活,行勝于言 敢為人先 和而不

10、同 居安思危,14,,,行勝于言 敢為人先 和而不同 居安思危,15,,行勝于言 敢為人先 和而不同 居安思危,16,行勝于言 敢為人先 和而不同 居安思危,17,,SWT無(wú)論是在性能還是外觀上,都超越了SUN公司所提供的AWT和Swing。SWT的到來(lái)使得Java桌面的開發(fā)者們分離為SWT的支持者和Swing的支持者前SUN公司很生氣因?yàn)樗鼈兊腘etbeans與Eclipse做的是相同的事

11、后果很嚴(yán)重拒絕讓Eclipse獲得Java認(rèn)證因?yàn)槔锩嬗性创a,所以Eclipse產(chǎn)品必須很小心地使用單詞“Java”這個(gè)SUN公司的商標(biāo)Eclipse甚至不能把自己稱為一個(gè)Java IDE,SUN公司已經(jīng)威脅過(guò)要采取法律行動(dòng)來(lái)制止Eclipse基金組織在任何時(shí)候把Eclipse稱作一個(gè)Java IDE。結(jié)果之一就是在Eclipse上創(chuàng)建的GUI設(shè)計(jì)工具,允許構(gòu)建Swing/AWT GUI,卻不允許向里面拖放SWT窗口控件。,行勝

12、于言 敢為人先 和而不同 居安思危,18,AWT事件處理,,行勝于言 敢為人先 和而不同 居安思危,19,初識(shí)AWT,Java 1.0中GUI編程庫(kù)稱為AWT (Abstract Window Toolkit, 抽象窗口工具箱)組件與容器 java.awt.* 基本組件(組件):按鈕、文本框 … java.awt.Component 容器:窗口、對(duì)話框 … j

13、ava.awt.Container事件 java.awt.event.*,行勝于言 敢為人先 和而不同 居安思危,20,可顯示的GUI組件,可見(jiàn)的GUI組件是某個(gè)Java GUI類的一個(gè)具體的對(duì)象例如:一個(gè)主窗口可以是Frame類的一個(gè)對(duì)象public static void showWindow() { Frame mainFrame= new Frame( &q

14、uot;FirstWindow"); mainFrame.setSize(400,300); mainFrame.setVisible(true);},行勝于言 敢為人先 和而不同 居安思危,21,,可顯示的組件類是以下兩個(gè)類的子類Component抽象類MenuComponent抽象類,行勝于言 敢為人先 和而不同 居安思危,22,控制組件的外觀,Component類的方法void s

15、etForeground(Color)void setBackground(Color)void setFont(Font)如果不為一個(gè)組件制定以上三個(gè)屬性,其默認(rèn)值是包含組件的容器的屬性,行勝于言 敢為人先 和而不同 居安思危,23,調(diào)整組件的位置個(gè)大小,Component類的方法void setHeight(int)void setWidth(int)void setSize(int, int)void s

16、etSize(Dimension)void setLocation(int, int)void setLocation(Point)void setBounds(int, int, int, int)void setBounds(Rectangle)提示:容器內(nèi)的組件位置和大小由布局管理器決定,行勝于言 敢為人先 和而不同 居安思危,24,組件的顯示和可用,Component類的方法void setVisable

17、(boolean)void setEnabled(boolean),行勝于言 敢為人先 和而不同 居安思危,25,AWT的容器,容器是容納其他組件的組件Container抽象類是Compnent的抽象子類是所有容器的超類容器也是一種awt組件,因此,容器可以被容器組件容納使用add方法來(lái)將組件添加到容器之中通過(guò)setLayout來(lái)制定容器所使用的LayoutManager,行勝于言 敢為人先 和而不同

18、 居安思危,26,AWT容器的繼承結(jié)構(gòu),行勝于言 敢為人先 和而不同 居安思危,27,Top-level容器,頂級(jí)容器:不能被其它容器容納Window,F(xiàn)rame,DialogWindow是一個(gè)沒(méi)有邊框和狀態(tài)欄的簡(jiǎn)單窗口一般不使用WindowFrameFrame是一個(gè)完整的窗口:標(biāo)題、縮放角通常我們定義Frame的繼承類來(lái)實(shí)現(xiàn)窗口Dialog對(duì)話框,用于提示或提供用戶輸入界面不能添加菜單或改變大小對(duì)話

19、框分為模態(tài)和非模態(tài)兩種模態(tài)Dialog關(guān)閉前阻止用戶對(duì)其它窗口的操作,行勝于言 敢為人先 和而不同 居安思危,28,Panel和ScrollPane,Panel和ScrollPane容納其它組件可以設(shè)置自己的布局管理器ScrollPane可以自動(dòng)為容器添加ScrollBar以顯示無(wú)法容納的組件,行勝于言 敢為人先 和而不同 居安思危,29,菜單,行勝于言 敢為人先 和而不同 居安思危,30,在

20、圖形界面上繪圖,Graphics提供繪制線、矩形、圓等形狀和輸出字符串的方法可以重置Component.paint方法,在方法中通過(guò)Graphics對(duì)象進(jìn)行繪圖工作不要在其他地點(diǎn)進(jìn)行繪制工作,否則繪制的結(jié)果將在窗口重繪(比如改變大小,移動(dòng)窗口等)時(shí)消失,行勝于言 敢為人先 和而不同 居安思危,31,創(chuàng)建窗口菜單的過(guò)程,創(chuàng)建MenuBar并使用Frame的setMenuBar將其添加到窗口創(chuàng)建Menu并使用MenuBar

21、的add方法將其添加到菜單條中創(chuàng)建MenuItem并使用Menu的add或Menu的insert方法將其添加到菜單中,行勝于言 敢為人先 和而不同 居安思危,32,AWT事件處理,事件源:事件發(fā)生的宿主,如Botton事件:描述發(fā)生的情況java.awt.AwtEvent的子類子類表示一類事件,例如:MouseEvent事件監(jiān)聽(tīng)器事件處理器:方法,用于處理對(duì)應(yīng)的事件,在事件監(jiān)聽(tīng)器中定義,行勝于言 敢為人先

22、 和而不同 居安思危,33,實(shí)現(xiàn)事件處理的主要步驟,選擇組件作為事件源確定要處理的事件(不同類型的組件產(chǎn)生特定類型的事件)根據(jù)要處理的事件類確定監(jiān)聽(tīng)器接口及方法實(shí)現(xiàn)監(jiān)聽(tīng)器類的實(shí)例注冊(cè)相應(yīng)的事件監(jiān)聽(tīng)器處理某種類型的事件,行勝于言 敢為人先 和而不同 居安思危,34,GUI事件發(fā)生時(shí)的執(zhí)行過(guò)程,事件源上發(fā)生一個(gè)具體的事件對(duì)應(yīng)的已注冊(cè)監(jiān)聽(tīng)器中的特定方法(處理器)被調(diào)用被封裝的對(duì)應(yīng)的事件對(duì)象作為參數(shù)傳遞即:事件源

23、通過(guò)實(shí)例化的事件類產(chǎn)生事件,事件被傳到一個(gè)或多個(gè)監(jiān)聽(tīng)器,行勝于言 敢為人先 和而不同 居安思危,35,Java 2事件處理的委托模型,行勝于言 敢為人先 和而不同 居安思危,36,注意事項(xiàng),事件對(duì)象只向已注冊(cè)的監(jiān)聽(tīng)器傳播事件對(duì)象只向注冊(cè)時(shí)對(duì)應(yīng)的監(jiān)聽(tīng)器傳播沒(méi)有注冊(cè)監(jiān)聽(tīng)器的組件,有關(guān)的事件不被傳播事件對(duì)象可以向多個(gè)監(jiān)聽(tīng)器傳播事件發(fā)生時(shí),所有已注冊(cè)的監(jiān)聽(tīng)器的處理器被調(diào)用,行勝于言 敢為人先 和而不同

24、 居安思危,37,事件處理示例,JButton button = new JButton(“提交”);MyActionListener listener = … ;Button.addActionListerner(listener );其中,class MyActionListener implements ActionListener{public void actio

25、nPerformed (ActionEvent event){ ……}},行勝于言 敢為人先 和而不同 居安思危,38,事件,行勝于言 敢為人先 和而不同 居安思危,39,GUI事件的分類,Semantic Event 提供組件的高級(jí)事件,比如:點(diǎn)擊按鈕、在文本框中輸入文本Low-Level Event 提供低等級(jí)的功能,比如鍵盤輸入、鼠標(biāo)移動(dòng)、窗口關(guān)

26、閉等Low-Level Event通常發(fā)生在Semantic Event事件之前,行勝于言 敢為人先 和而不同 居安思危,40,Semantic Event,ActionEvent:定義的動(dòng)作事件按鈕按下,TextField中按Enter鍵AdjustmentEvent:調(diào)節(jié)事件在滾動(dòng)條上移動(dòng)滑塊以調(diào)節(jié)數(shù)值ItemEvent:條目選擇事件CheckBox,選擇,不選擇TextEvent:文本事件文本對(duì)象改變

27、,行勝于言 敢為人先 和而不同 居安思危,41,Low-Level Event,ComponentEvent:組件事件組件尺寸的變化,移動(dòng)ContainerEvent:容器事件組件增加,移動(dòng)WindowEvent:窗口事件關(guān)閉窗口,窗口閉合,圖標(biāo)化FocusEvent:焦點(diǎn)事件焦點(diǎn)的獲得和丟失KeyEvent:鍵盤事件鍵按下、釋放MouseEvent:鼠標(biāo)事件鼠標(biāo)單擊,移動(dòng),行勝于言 敢為人先

28、和而不同 居安思危,42,AWT事件監(jiān)聽(tīng)器,監(jiān)聽(tīng)器:事件的處理者,包含處理器實(shí)現(xiàn)監(jiān)聽(tīng)器接口事件監(jiān)聽(tīng)器接口:繼承java.util.EventListener接口對(duì)應(yīng)于awt事件類,有相應(yīng)的監(jiān)聽(tīng)器接口監(jiān)聽(tīng)器接口中定義處理特定事件的方法(處理器),例如:MouseListener接口的mouseClicked方法,行勝于言 敢為人先 和而不同 居安思危,43,,事件與監(jiān)聽(tīng)器接口,行勝于言 敢為人先 和而不同

29、 居安思危,44,行勝于言 敢為人先 和而不同 居安思危,45,注冊(cè)監(jiān)聽(tīng)器,使用GUI組件addXxxListener方法注冊(cè)監(jiān)聽(tīng)器,監(jiān)聽(tīng)器對(duì)象作為參數(shù)傳遞在事件源上發(fā)生事件時(shí),只有已向事件源注冊(cè)的監(jiān)聽(tīng)器才會(huì)被調(diào)用GUI組件能夠觸發(fā)一個(gè)以上的事件對(duì)應(yīng)事件的類型,GUI組件有相應(yīng)的addXxxListener方法,行勝于言 敢為人先 和而不同 居安思危,46,示例-用事件監(jiān)聽(tīng)器處理事件,//注冊(cè)事件監(jiān)聽(tīng)器對(duì)

30、象Window.addWindowListener(WindowListener)//實(shí)現(xiàn)事件監(jiān)聽(tīng)器接口的所有方法 class MyWinL implements WindowListener{ …. }//覆蓋需要處理的事件對(duì)應(yīng)的方法, public void windowClosing(WindowEvent e){ e.getWindow().setVisible(false);

31、 ((Window)e.getComponent()).dispose(); System.exit(0); }//對(duì)于其他的方法還需要簡(jiǎn)單實(shí)現(xiàn) …,行勝于言 敢為人先 和而不同 居安思危,47,示例-用事件適配器類處理事件,事件適配器類簡(jiǎn)單實(shí)現(xiàn)了事件監(jiān)聽(tīng)器接口的所有方法Class MyWinL extends WindowAdapter{ public void WindowClosin

32、g(WindowEvent e){ e.getWindow().setVisible(false); ((Window)e.getComponent()).dispose(); System.exit(0); }}用事件適配器修改上面的程序,行勝于言 敢為人先 和而不同 居安思危,48,GUI組件上的圖形操作,,行勝于言 敢為人先 和而不同 居安思危,49,布局管理器,,行勝

33、于言 敢為人先 和而不同 居安思危,50,布局管理器,LayoutManager抽象類:布局管理器的超類,F(xiàn)lowLayout、BorderLayout等用于管理容器中組件的位置和大小容器與布局管理器容器可以設(shè)置自己的布局管理器,用以管理容器上的組件Container的setLayout方法當(dāng)容器沒(méi)有設(shè)置布局管理器時(shí),使用容器默認(rèn)的布局管理器Panel和ScrollPane默認(rèn)為FlowLayoutWindow

34、, Frame和Dialog默認(rèn)為BorderLayout,行勝于言 敢為人先 和而不同 居安思危,51,行勝于言 敢為人先 和而不同 居安思危,52,FlowLayout管理器,組件將從左到右排列,如果當(dāng)前行不能容納則組件將被轉(zhuǎn)到下一行默認(rèn)居中排列使用每個(gè)組件的首選大小Compnent:preferredSize可以設(shè)置對(duì)齊方式和組件的間距(gap),行勝于言 敢為人先 和而不同 居安思危,

35、53,GridLayout管理器,將容器分成大小相等的多個(gè)網(wǎng)格,所有組件將被均勻地排列在網(wǎng)格之中可以設(shè)置網(wǎng)格的行數(shù)和列數(shù)組件按將從左到右,從上倒下的順序添加,添加的順序決定了占據(jù)的位置GridLayout忽略容器中組件的首選大小行數(shù)或列數(shù)的0值表示靈活處理,行勝于言 敢為人先 和而不同 居安思危,54,BorderLayout管理器,將容器分為東、南、西、北、中5個(gè)區(qū)域組件添加在其中的一個(gè)區(qū)域上,占據(jù)整個(gè)區(qū)域,忽略

36、組件的首選大小添加組件時(shí)指定組件的位置BorderLayout.NORTH、BorderLayout.SOUTH、BorderLayout.WEST、BorderLayout.EAST、BorderLayout.CENTER組件大小的確定處于NORTH和SOUTH的組件將保留其高度處于WEST和EAST的組件將保留其寬度處于CENTER的組件高度與寬度都會(huì)改變,以填滿剩余空間,行勝于言 敢為人先 和而不同 居安思

溫馨提示

  • 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ù)僅提供信息存儲(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)論