java課件6javagui_第1頁
已閱讀1頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、安思危,3,GUI歷史——先驅,道格拉斯·恩格爾巴特(Dr. Douglas C. Engelbart,1925年1月30日-),美國發(fā)明家,瑞典人和挪威人后裔發(fā)明了鼠標開發(fā)了超文本系統(tǒng)On-Line System(NLS)、網(wǎng)絡計算機…,行勝于言 敢為人先 和而不同 居安思危,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語言的GUI歷史,AWT(A

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

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

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

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

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

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

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

11、后果很嚴重拒絕讓Eclipse獲得Java認證因為里面有源代碼,所以Eclipse產品必須很小心地使用單詞“Java”這個SUN公司的商標Eclipse甚至不能把自己稱為一個Java IDE,SUN公司已經(jīng)威脅過要采取法律行動來制止Eclipse基金組織在任何時候把Eclipse稱作一個Java IDE。結果之一就是在Eclipse上創(chuàng)建的GUI設計工具,允許構建Swing/AWT GUI,卻不允許向里面拖放SWT窗口控件。,行勝

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

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

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

15、etForeground(Color)void setBackground(Color)void setFont(Font)如果不為一個組件制定以上三個屬性,其默認值是包含組件的容器的屬性,行勝于言 敢為人先 和而不同 居安思危,23,調整組件的位置個大小,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)提示:容器內的組件位置和大小由布局管理器決定,行勝于言 敢為人先 和而不同 居安思危,24,組件的顯示和可用,Component類的方法void setVisable

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

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

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

20、圖形界面上繪圖,Graphics提供繪制線、矩形、圓等形狀和輸出字符串的方法可以重置Component.paint方法,在方法中通過Graphics對象進行繪圖工作不要在其他地點進行繪制工作,否則繪制的結果將在窗口重繪(比如改變大小,移動窗口等)時消失,行勝于言 敢為人先 和而不同 居安思危,31,創(chuàng)建窗口菜單的過程,創(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)聽器事件處理器:方法,用于處理對應的事件,在事件監(jiān)聽器中定義,行勝于言 敢為人先

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

23、通過實例化的事件類產生事件,事件被傳到一個或多個監(jiān)聽器,行勝于言 敢為人先 和而不同 居安思危,35,Java 2事件處理的委托模型,行勝于言 敢為人先 和而不同 居安思危,36,注意事項,事件對象只向已注冊的監(jiān)聽器傳播事件對象只向注冊時對應的監(jiān)聽器傳播沒有注冊監(jiān)聽器的組件,有關的事件不被傳播事件對象可以向多個監(jiān)聽器傳播事件發(fā)生時,所有已注冊的監(jiān)聽器的處理器被調用,行勝于言 敢為人先 和而不同

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 提供組件的高級事件,比如:點擊按鈕、在文本框中輸入文本Low-Level Event 提供低等級的功能,比如鍵盤輸入、鼠標移動、窗口關

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

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

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

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

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

31、 ((Window)e.getComponent()).dispose(); System.exit(0); }//對于其他的方法還需要簡單實現(xiàn) …,行勝于言 敢為人先 和而不同 居安思危,47,示例-用事件適配器類處理事件,事件適配器類簡單實現(xiàn)了事件監(jiān)聽器接口的所有方法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等用于管理容器中組件的位置和大小容器與布局管理器容器可以設置自己的布局管理器,用以管理容器上的組件Container的setLayout方法當容器沒有設置布局管理器時,使用容器默認的布局管理器Panel和ScrollPane默認為FlowLayoutWindow

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

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

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

溫馨提示

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

評論

0/150

提交評論