/*
*第8講 GUI/圖形用戶界面
* AWT的基礎知識
* GUI全稱是Graphical User Interface,即圖形用戶界面
* JDK中提供了AWT和Swing兩個包,用於GUI程序的設計和開發
*
* GUI組件能夠分爲兩大類:基本組件和容器,
* 分別是java.awt.Component和java.awt.Container的直接或間接子類
*
* 程序的GUI部分由AWT線程管理
*
* 編程舉例:讓框架窗口顯示5秒後關閉,查AWT線程的狀態
*
*
*
*
* AWT事件處理
* 事件處理機制
* 三個重要的概念:
* 事件:用戶對組件的一個操做,稱之爲一個事件
* 事件源:發生事件的組件就是事件源
* 事件處理器:某個Java類中的負責處理事件的成員方法
* 事件源,事件,事件處理器之間的工做關係
* 1 事件處理器 ->(事件監聽器註冊) 組件(事件源) -> 外部做用
* 2 組件(事件源) ->(生成事件對象) 事件對象
* 3 事件對象 ->(把事件對象傳入事件處理器) 事件處理器
*
*
* 事件分類
* 按產生事件的物理操做和GUI組件的表現效果進行分類
* MouseEvent
* WindowEvent
* ActionEvent
* 事件的性質分類:
* 低級事件
* 語義事件(又叫高級事件)
* 事件監聽器
* 一個事件監聽對象負責處理一類事件
* 一類事件的每一種發生狀況,分別由事件監聽器對象中的一個方法來具體處理
* 在事件源和事件監聽對象中進行約定的接口類,被稱爲事件監聽器接口
* 事件監聽器接口類的名稱與事件類的名稱是相對應的,例如:
* MouseEvent事件類的監聽器接口名爲MouseListener
* 編程實例:實現關閉窗口的事件處理,講解用不一樣層次的事件類型來表示同一個事件源對象
*
* 處理髮生在某個GUI組件上的XxxEvent事件的某種狀況,其事件處理的通用編寫流程
* 編寫一個實現了XxxListener接口的事件監聽器類
* XxxListener類中的用於處理該事件狀況的方法中,編寫處理代碼
* 調用組件的addXxxListener方法,將類XxxListener建立的建立的實例對象註冊到GUI組件上
*
*
*
* 事件適配器
* JDK中也提供了大多數事件監聽器接口的最簡單的實現類,稱之爲事件適配器(Adapter)類
* 用事件適配器來處理事件,能夠簡化事件監聽器編寫
* 編程實例:使用事件適配器類來關閉窗口
* 初學者使用事件適配器時的常見問題,解決問題的思路:
* -是方法沒有被調用,仍是方法中的程序代碼的執行問題?
* -是方法名寫錯了,仍是沒有註冊事件監聽器?
* 事件適配器類的不足之處
*
*
*
* 靈活設計事件監聽器類
* 若是要在事件監聽器爲中訪問非事件源的其它GUI組件,程序該如何編寫?
*
* 用匿名內置類實現事件監聽器
*
* 事件處理的多重運用
* 如何知道一個GUI組件倒低可以觸發哪幾種事件?
* 一個組件上的一個動做能夠產生多種不一樣類型的事件
* 一個事件監聽器對象能夠註冊到多個事件源上
* 在一個事件源上也能夠註冊對同一類事件進行處理的多個事件監聽器對象
*
*
* 修改組件的默認事件處理方式
* 只有在一個組件上註冊了某種事件的事件監聽器對象後,組件纔會產生相應的事件對象
* 默認的processEvent方法調用相應的processXxxEvent方法
* 調用enableEvents((long eventsToEnable))方法,能夠在即便沒有註冊事件監聽器的狀況下,組件也可以對某些類型的事件進行響應和產生相應的事件對象
* 表明組合事件類型的數值:
* 1 0 0 1......
* 包含事件類型A
* 不包含事件類型B
* 不包含事件類型C
* 包含事件類型D
* 表明事件類型A的數值 10000...
* 表明事件類型D的數值 00010...
* 編程實例:在一個窗口上顯示一個按鈕,一時鼠標移動到這個按鈕上時,按鈕就移動到了其餘位置,這樣,鼠標就永遠沒法點周到這個按鈕
*
* GUI組件上的圖形操做
* Graphics類與圖形繪製
* Component.getGraphics方法與Graphics類
* Graphics.drawLine(int x1, int y1, int x2, int y2)方法
* Graphics.drawString(String str, int x, int y)方法
* Graphics.drawString方法的座標參數,注意是開始是左下方法
*
* 編程舉例:
* 以鼠標在窗口中按下時的位置做爲起始點,鼠標釋放時的位置做爲終止點,在鼠標釋放時將直接畫出,並在每條直線的起始和終止點位置上打印出它們的座標值
*
* 組件重繪的處理
* 組件重繪的原理
* paint(Graphics g)的做用
* AWT線程對組件重繪的調用過程
* repaint() -> AWT Thread update(清除組件表面內容調用paint()方法) paint();
* 編程實例:在窗口上畫直線和打印文本的功能,並在窗口重繪後重繪窗口上的全部直線
*
* 圖像顯示
* 使用Graphics.drawImage(Image img, int x, int y,ImageObaserver observer)方法顯示圖像
* 使用Component.getToolkit.getImage(String path)語句獲取Image實例對象
* 編程實例:在窗口上顯示圖像文件中的圖像,並解決因爲drawImage內部實現機制形成的圖像不能顯示問題,和實現圖像的永久化顯示
*
*
* 雙緩衝技術
* Component.createImage方法建立內存Image對象.
* 在Image對象上進行繪製的結果就成了一幅圖像
* 在Image對象上執地與組件表面一樣的繪製,Image對象中的圖像是組件表面內容的複製,當組件重畫時,只須要將內存中的Image對象在組件上畫出
*
* 編程實例:使用雙緩衝區技術重繪組件表面的全部圖形
*
*
* 經常使用的AWT組件
* Canvas
* Canvas是最基本和最簡單的GUI功能的組件
* Canvas表明屏幕上的一塊空白的矩形區域,程序可以在這個部件表面繪圖,也可以捕獲用戶的操做,產生相應的事件
* 當要設計自定製的GUI功能的組件類時,繼承Canvas將會大簡化編程難度
*
* 編程實例:設計一個自定製的計時器組件,當鼠標在設時器組件上按下時,計時器開始計時,並顯示計時時間,當鼠標釋放時,計時器中止計時
*
* 菜單
* 一個完整的菜單系統由菜單條,菜單和菜單項組成,它們之間的關係如圖:
* Java中與菜單相關的類主要有: MenuBar(菜單條)、Menu(菜單)、Menultem(菜單項)
* 編程實例:實現圖中的菜單和相關事件處理
*
* Container 容器類
* Container類是全部容器類的父類,Container.add方法用於將組件添加到容器中
* Container也是Component的子類,所以也能夠做爲組件增長到其它容器上
*
* Component -> Container
* -----> Window
* ------> Frame
* ------> Dialog
* (BorderLayout)
* -----> Panel
* -------> Applet
* (FlowLayout)
*
* Dialog與FileDialog類
* Dialog類用於產生對話框
* 模態對話框和非模態對話框
* Dialog類的兩個經常使用構造方法:
* public Dialog(Frame owner, String title);
* public Dialog(Frame owner, String title, boolean modeal)
* 編程實例:主框架窗口經過兩個按鈕分別打開一個模態對話框和一個非模態對話框,並與這兩個對話框進行數據交換
*
*
* Checkbox
* Checkbox類用來創建單選按鈕和多選按鈕(也叫複選框)
*
* 建立多選按鈕,只須要使用構造函數
* Checkbox(String lable, boolean state)
*
* 建立單選按鈕,須要使用構造函數
* Checkbox(String lable, boolean state, CheckboxGroup group)
*
* 單選按鈕和多選按鈕的語義事件爲ItemEvent,對應的監聽器接口爲ItemListener, 該接口只有一個itemStateChanged方法
* 編程實例:建立一個多選按鈕和兩個屬於同一組的單選按鈕,並對每一個按鈕的選中狀況進行處理
*
*
* Choice
* Choice類用來製做單選下拉列表框
* Choice的類的語義事件爲ItemEvent, 對應的監聽器接口爲ItemListener, 該接口中只有一個itemStateChanged方法
* 編程舉例:實現圖中的列表框和相關事件處理
*
* Panel與ScrollPane類
* Panel類是一個容器類,用於產生一種特殊的空白麪板,能夠容納其餘組件,但不能獨立存在
* ScrollPane類是一種容器類,用於產生滾動窗口,經過滾動條在一個較小的容器窗口中顯示較大的子部件
*
* 編程舉例:如何使用ScrollPane
*
*
*
*
* 佈局管理器
* 一個容器中的各個組件之間位置和大小關係就稱之爲佈局
* Java語言提供了佈局管理器來管理組件在容器中的佈局,而不是直接使用位置座標來設置各件組件的位置和大小
*
* AWT中的佈局管理器類:
* BorderLayout
* NORTH(北)
* WEST(西)
* SOUTH(南)
* EAST(東)
* CENTER(中)
* 編程實例:
* 瞭解BorderLayout佈局管理器的做用
*
*
* FlowLayout
* 編程實例:瞭解FlowLayout佈局管理器的做用
*
* GridLayout
* GridLayout佈局管理器將容器劃分紅若干行列的網格,在容器上添加組件時,它們會按從左到右,從上到下的順序在網絡中排列
* 在GridLayout的構造方法中,須要指定在容器上劃分的網絡的行,列數
*
* CardLayout
*
* 取消佈局管理器
* 調用Container.setLayout(null)方法取消佈局管理器設置,在這種狀況下,能夠調用COmponent.setBounds方法來用絕對座標設置容器上的每一個組件的大小和位置
*
* 不使用佈局管理器將會給程序帶來一個潛在的問題,當容器大小改變時,全部組件仍保持原來的位置和大小,將致使整個程序界面比較」難看「
*
* 編程實例:演示不使用佈局管理的效果
*
*
*
* Swing和JFC
* 全部的Swing組件,位於javax.swing包中,它們是構築在AWT上層的GUI組件,Swing組件是JComponent類的子類
* 爲保證可移植性,Swing徹底用Java語言編寫
* Swing提供了比AWT更多的組件庫,例如,JTable, JTree, JComboBox
* Swing也加強了AWT中原有組件的功能,例如:與AWT中的Button對應的Swing組件是JButton
* JFC(java Foundation Class)是指Sun對早期的JDK進行擴展的部分,集合了Swing組件和其餘能簡化開發的API類,包括Swing, java 2D, accessibility, internationalization
*
* 編程實例:從AWT過渡到Swing
*
*
* JFrame
* JFrame是與AWT中的Frame相對應的SWing組件
* JFrame上面只能有一個惟一的組件,這個組件爲JRootPane,調用JFrame.getContentPane()方法可得到JFrame中內置的JRootPane對象
* 應用程序不能直接在JFrame實例對象中添加組件和設置佈局管理器,而應該在JRootPane對象上添加組件和設置佈局管理器
* 調用JFrame的setDefaultCloseOperation方法,能夠設置單擊窗口上的關閉按鈕時的事件處理方式,
* 例如:當設置值爲JFram.EXIT_ON_CLOSE時,單擊JFram窗口上的關閉按鈕,將直接關閉JFrame框架窗口並結束程序運行
*
* 編程實例:使用JFrame來建立程序的主框架窗口
*
* JScrollPane
* JScrollPane是與AWT中的ScrollPane相對應的Swing組件
* 最基本的JScrollPane由水平和垂直方方向的JScrollBar以及一個JViewport組件
* 調用JScrollPane.getViewport方法,能夠獲取表明滾動窗口中的視圖區域的JViewport對象
* 調用JViewprot.setView方法,能夠將滾動窗口中要顯示的內容做爲子組件增長到JViewprot上
* 編程實例:使用JScrollPane建立滾動窗口
*
* Swing中的標準對話框
* JOptionPane類提供了若干個showXxxDialog靜態方法,可用來產生簡單的標準對話框
* showConfirmDialog(Component parentComponent, Object message, String title, int optionType, int messageType)中的每一個參數的意義
*
* 編程舉例:使用JOptionPane類,在程序開始運行時,彈出一個對話框提示用戶,在主框架窗口的關閉按鈕被單擊時,彈出一個對話框詢問用戶是否真的要結束程序運行
*
* JFileChooser類專門用來實現文件存取對話框
*
*
* 計算器界面的程序實現
* 要求:
* 單擊任何按鈕,按鈕上面的數字或符號從左到右的順序顯示在文本框中
* 文本框中的文字是左對齊顯示
*
* BoxLayout佈局管理器:
* BoxLayout是在Swing中新增長的一種佈局管理器,它容許多個組件所有垂直襬放或合部水平擺放
* 使用BoxLayout實現計算器界面
*
*
* 學習和開發GUI程序的建議
* 重要掌握GUI程序的一些基本原理和開發過程,經過學習AWT組件能夠更容易掌握GUI程序的基本原理和開發過程,但在GUI程序開發中,應儘可能使用Swing組件
*
* 查閱JDK文檔中的Swing包,通讀一下其中所包含的組件,以瞭解SWing提供了哪些GUI組件,但沒必要去仔細閱讀每一個組件的使用的幫助
*
* 只在要用到某個GUI組件時,纔有必要仔細閱讀這個組件的具體使用幫助,若是要快速掌握某個新遇到的組件和用法,最好是可以找到並參閱該組件的例子程序
*
* 在JDK的demo程序目錄中,或是<<Java指南>>(可從SUN公司的網站上下載,英文名爲The Java Tutorial)中,都能找到某些組件的應用範例
*
* 參考別人成功的應用,是快速學習和完成工做的有效方式
*
*
*思考與實踐(1)
* 1 什麼是事件, 事件源和事件處理器,並描述三者的工做關係
*
* 2 描述事件處理的編碼實現過程
*
* 3 描述事件監聽器類和事件適配器類的關係和區別
*
* 4 描述在窗口上畫直線和程序編寫過程和組件重繪的原理
*
* 5 爲講程中所講的自定義計時器組件編寫以下功能:容許程序設置計時器的顯示文本的顏色,時間顯示文本的字體大小隨組件大小的改變而改變
*
* 6 結合JDK文檔幫助,編寫一個使用FIleDialog選擇文件名的例子程序,單擊主窗口上的打開按鈕,打開一個文件對話框
* 並將選擇的文件路徑顯示在主窗口上的"打開"按鈕左邊的文本框中,在文件對話框中能夠對文件類型進行過濾
* 每次打開文件對話框時,對話框中的初始顯示目錄爲上次選擇的文件所在目錄
*
* 7 修改前面實現計算器界面的程序代碼,將增長單個按鈕的代碼用一個函數來實現,而後在一個循環語句中調用這個函數來增長全部的按鈕
*
*
**/java
public class Lesson8 {
/**
* Method main
*
*
* @param args
*
*/
public static void main(String[] args) {
// TODO: Add your code here
}
}編程