黑馬程式設計師Java培訓和Android培訓Java GUI圖形使用者介面

iteye_5923發表於2011-07-02
黑馬程式設計師

GUI/圖形使用者介面
AWt的基礎知識
GUI全稱是Graphical User Interface即使用者圖形介面。

JDK中提供了AWT和Swing兩個包,用於GUI程式的設計和開發。AWT不足以完全應對基於GUI的程式設計,Swing包補充完善了AWT,使得AWT更加豐富完善,可以應對基於GUI的程式設計。

GUI元件可以分為兩大類:基本元件(又被稱之為構件像按鈕文字框之類的使用者圖形元素,在其上不能容納其他元件或元素)和容器(例如對話方塊),分別是java.awt.Component和java.awt.Container的直接或間接子類。

程式的GUI部分由AWT執行緒管理。程式設計舉例:讓框架視窗顯示5秒鐘後關閉,檢視AWT執行緒的狀態。
AWT的事件處理
GUI元件上的圖形操作
常用的AWT元件
佈局管理器
Swing

AWT事件處理:
事件處理機制:
三個重要概念:
事件:使用者對元件的一個操作,稱之為一個事件。
事件源:發生事件的元件就是事件源。
事件處理器:某個Java類中的負責處理事件的成員方法。


事件分類:
按產生事件的物理操作和GUI元件的表現效果進行分類:
MouseEvent
WindowEvent
ActionEvent 是一種語義。
按事件的性質分類:
低階事件
語義事件(又叫高階事件)

事件監聽器:
一個事件監聽器物件負責處理一類事件。
一類事件的每一種發生情況,分別由事件監聽器物件中的一個方法來具體處理。
在事件源和事件監聽器物件中進行約定的介面類,被稱為事件監聽器介面。
事件監聽器介面類的名稱與事件類的名稱是相應的,例如,MouseEvent事件類的監聽器介面名為MouseListener.

程式設計例項:實現關閉視窗的事件處理,講解用不同層次的事件型別來表示同一個事件源物件。
其中用到的函式
public void windowClosing(Windowevent parm1)
{
parm1.getWindow().setvisible(false);
//parm1.getSource(); //返回事件源
// parm1.getComponent(); //返回發生事件的元件
((Window)parm1.getComponent()).dispose();//強制型別轉換後才可以使用那個型別中的方法。
}


處理髮生在某個GUI元件上的XxxEvent事件的某種情況,其事件處理的通用編寫流程:
---編寫一個實現 XxxListener介面的事件監聽器類:
---XxxListener類中的用於處理該事件情況的方法中,編寫處理程式碼;
---呼叫元件的addXxxListener方法,將類XxxListener建立的例項物件註冊到GUI元件上
事件介面卡:
靈活設計事件監聽器類:
用匿名內部類實現事件監聽器:
事件處理的多重運用
修改元件的預設事件處理方式

JDK中也提供了大多數事件監聽器介面的最簡單的實現類,稱之為事件介面卡(Adapter)類。

用事件介面卡來處理事件,可以簡化事件監聽器編寫。

程式設計例項:使用事件介面卡時的常見問題,解決問題的思路:
---是方法沒被呼叫,還是方法中的程式程式碼的執行問題?
---是方法名寫錯了,還是沒有註冊事件監聽器?
事件介面卡類的不足之處。

靈活設計事件監聽器類
如果要在事件監聽器類中訪問非事件源的其他GUI元件,程式該如何編寫?

事件處理的多重運用
如何知道一個GUI元件到底能夠觸發哪幾種事件?
一個元件上的一個動作可以產生多種不同型別的事件
一個事件監聽器物件可以註冊到多個事件源上
在一個事件源上也可以註冊對同一類事件進行處理的多個事件監聽器物件

修改元件的預設事件處理方式
只有在一個元件上註冊了某種事件的監聽器物件後,元件才會產生相應的事件物件。
預設的processEvent方法呼叫相應的processXxxEvent方法。
呼叫enableEvents(long eventsToEnable)方法,可以在即使沒有註冊事件監聽器的情況下,元件也能夠對某些型別的事件進行響應和產生相應的事件物件。

程式設計例項:在一個視窗上顯示一個按鈕,一旦滑鼠移動到這個按鈕上時,按鈕就移動到了其他位置,這樣,滑鼠就永遠無法點選到這個按鈕。

GUI元件上的圖形操作

Graphics類與圖形繪製
Component.getGraphics()方法和Graphics類
getGraphics()方法為元件建立一個圖形上下文。如果元件當前是不可顯示的,則此方法返回 null。 Graphics類:Graphics 類是所有圖形上下文的抽象基類,允許應用程式在元件(已經在各種裝置上實現)以及閉屏影像上進行繪製。 Graphics 物件封裝了 Java 支援的基本呈現操作所需的狀態資訊。此狀態資訊包括以下屬性:


要在其上繪製的 Component 物件。
呈現和剪貼座標的轉換原點。
當前剪貼區。
當前顏色。
當前字型。
當前邏輯畫素操作函式(XOR 或 Paint)。
當前 XOR 交替顏色

Graphics.drawLine(int x1,int y1,intx2,int y2)方法。
Graphics.drawString(String str,int x,int y)方法。
Graphics.drawString方法的座標引數是相對於矩形框的左下角。

程式設計舉例:以滑鼠在視窗中按下時的位置作為起始點,滑鼠釋放時的位置作為終止點,在滑鼠釋放時將直線畫出,並在每條直線的起始點和終止點位置上列印出它們的座標值。利用Graphics.drawLine()和Graphics.drawString()方法進行繪製。


元件重繪的處理

元件重繪的原理。
paint(Graphics g)的作用。
AWT執行緒對元件重繪的呼叫過程。(有圖)。
利用 public void paint()方法進行元件重繪,在方法中記錄繪畫的元件的各種資訊。
Vector vLine=new Vector();Enumeration e=vLines.elements(); MyLine line=(MyLine)e.nextElement(); 由於e.nextElement返回的型別是Object所以要強制轉換。
repaint()方法可以導致視窗重繪。

程式設計舉例:在視窗上畫直線和列印文字的功能,並在視窗重繪後重繪視窗上的所有直線。

影像顯示
雙緩衝技術

影像顯示 如何在GUI元件上顯示影像

使用Graphics.drawImage(Image img,int x,int y,ImageObserver observer)方法顯示影像。Image 物件只有在使用的時候才會載入。 用ImageObserver物件監視進度。(Image類)

使用Component.getTookit.getImage(String path)語句獲得Image例項物件。

程式設計例項:在視窗上顯示影像檔案中的影像,並解決由於drawImage內部實現機制造成的影像不能顯示問題,和實現影像的永久顯示。

多次呼叫drawImage()方法,影像才能顯示出來。
利用 public void paint(Graphics g)方法可以彌補多次呼叫drawImage()方法的不足。

雙緩衝技術

Component.createImage方法建立記憶體Image物件。
在Image物件上進行繪製的結果就成了一幅影像。
在Image物件上執行與元件表面同樣的繪製,Image物件中的影像時元件表面內容的複製,當元件重畫時,只需要將記憶體中的Image物件在元件上畫出。

程式設計例項:使用雙緩衝區技術重繪元件表面的所有圖形。

常用的AWT元件
java.lang.Object(Borderlayout CardLayout CheckBoxGroup Color Event Font FlowLayout Fontmetrics Graphics GridBagLayout GridLayOut Image Insets Point Polygon Rectangle Tookit MenuComponent(MenuBar MenuItem(Menu--PopupMenu CheckboxMenuItem)) Component(Button Canvas Checkbox Choice Container(Panel(Applet(java.applet.package)) Window(Dialog--FileDialog) ScrollPane) Label List Scrollbar TextComponent(TextArea TextField)))

java.lang.Object----java.awt.geom.Dimension2D----Dimension

Exceptions----AWTException Errors----AWTError


Canvas
Canvas是具有最基本和最簡單的GUI功能的元件。
Canvas代表螢幕上的一塊空白的矩形區域,程式能夠在這個部件表面繪畫,也能夠捕獲使用者的操作,產生相應的事件。
當要設計自定製的具有GUI功能的元件類時,繼承Canvas將會大大簡化程式設計難度。可以覆蓋paint(Graphics g)和update(Graphics g)方法。

程式設計例項:設計一個自定製的計時器元件,當滑鼠在計時器元件上按下時,計時器開始計時,並顯示計時時間,當滑鼠釋放時,計時器停止計時。
drawString();
SimpleDateFormat sdf=new SimpleDateFormat(); sdf.parase();
repaint();

程式碼在E:\Jcreator3.5\JCreatorV3LE\MyProjects中的StopWatch.java TestStopWatch.java TestStopWatchFrame.java中

選單

一個完整的選單系統由選單條,選單和選單項組成,它們之間的關係如圖:
Java中與選單相關的類主要有:MennuBar(選單條),Menu(選單),MenuItem(選單項)。

程式設計例項:實現圖中的選單和相關事件處理。
MenuBar add( Menu add (MenuItem CheckboxmenuItem))
最後用setMenubar()來將Menubar 的例項新增到視窗中。
利用繼承ActionListener介面來實現監聽器類,在監聽器類中實現actionPerformed(ActionEvent e)方法,來實現相關的動作。將要新增動作事件的物件用方法add()。用getActionCommand()方法來獲得選擇的選單項的名字。

setActionCommand()方法的作用:
設定由此XXX引發的動作事件的命令名。


Container
有些元件不能獨立顯現,只能放在一個容器中使用。例如Frame視窗。
Container類是所有容器類的父類,Container.add方法用於將元件新增到容器中。
Container也是Component的子類,因此也可以作為元件增加到其他容器上。
Component類下面有Container類,Container類下有Window和Panel類;Window下面有Frame和Dialog類;Panel類下面有Applet。Window,Frame,Dialog統稱為 Borderlayout。 Panel和Applet被稱為FlowLayout。
將視窗的顯示設定在主函式中將其他元件設定以後的後面。否則會造成某些元件顯示不出來。

Dialog與FileDialog類
Dialog類用於產生對話方塊。但是沒有選單條,也不能改變大小。一般用於臨時顯示的視窗。用於顯示提示資訊或接受客戶的輸入。對話方塊不能獨立的存在,必須有個上級視窗。

模態對話方塊和非模態對話方塊。模態對話方塊特點是在沒有關閉模態對話方塊時不能操作同一個程式的其他視窗。而非模態對話方塊則可以。
getOwner()方法。
Dialog類的兩個常用的構造方法:
public Dialog(Frame owner,String title);
public Dialog(Frame owner,String title,boolean modal)

程式設計例項:主框架視窗通過兩個按鈕分別開啟一個模態對話方塊和一個非模態對話方塊,並與這兩個對話方塊進行資料交換。

內部類中的某個函式需要呼叫外部類的例項物件,應該使用 外部類名稱.this 來呼叫。
訪問控制是為了實現封裝的特性。

FileDialog類是Dialog類的一個子類,能夠產生標準的檔案存取對話方塊。

Checkbox
Checkbox類用來建立單選按鈕或多選按鈕(也叫核取方塊)。

建立多選按鈕,只需要使用建構函式:
Checkbox(String label,boolean state)

建立單選按鈕,需要使用建構函式:
Checkbox(String label,boolean state,CheckboxGroup group)

單選按鈕和多選按鈕的語義事件為ItemEvent,對應的監聽器介面為ItemListener,該介面中只有一個itemStateChanged方法。

程式設計例項 :建立一個多選按鈕和兩個屬於同一組的單選按鈕,並對每個按鈕的選中情況進行處理。

jdk1.6中的ItemListener中沒有itemStateChangded方法。
切記如果寫了事件監聽器方法,一定要把它新增到要監聽的物件中。並且得放入建構函式中。


Choice
Choice類用來製作單選下拉選單框.

Choice類的語義事件為ItemEvent,對應的監聽器介面為ItemListener,該介面中只有一個itemStateChanged方法。

程式設計舉例:實現類表框和相關事件處理。


Panel與ScrollPanel類
Panel類是一個容器類,用於產生一種特殊的空白皮膚,可以容納其他的元件,但不能獨立存在。

ScrollPanel類是一種容器類,用於產生滾動視窗,通過滾動條在一個較小的容器視窗中顯示較大的子部件。

程式設計舉例: 如何使用ScrollPane
十一
佈局管理器
一個容器中的各個元件之間的位置和大小關係就稱之為佈局。

Java語言提供了佈局管理器來管理元件在容器中的佈局,而不是直接使用位置座標 來設定各個元件的位置和大小。

AWT中的佈局管理器類:
--BorderLayout(預設的)
--FlowLayout
--GridLayout
--CardLayout
--GridbagLayout "佈局管理器之王"GridBagLayout 類是一個靈活的佈局管理器,它不要求元件的大小相同便可以將元件垂直、水平或沿它們的基線對齊。

程式設計例項:
瞭解BorderLayout佈局管理器的作用:將視窗劃分為東西南北中五部分。


FlowLayout

程式設計例項:瞭解FlowLayout佈局管理器的作用。

利用setLayout(new FlowLayout())建立該佈局管理器。


GridLayout

GridLayout佈局管理器將容器劃分成若干行列的網格,在容器上新增元件時,它們會按從左到右,從上到下的順序在網格中排列。

在GridLayout的構造方法中,需要指定在容器上劃分的網格的行,列數。


CardLayout
CardLayout佈局管理器能夠實現將多個元件放在同一容器區域內的交替顯示,相當於多張卡片摞在一起,在任何時候都只有最上面的一個可見。

程式設計例項:建立兩個Panel物件,每個Panel上都能擁有一個佈局管理器,左邊的Panel使用GridLayout佈局管理器放置了3個按鈕,右邊的Panel上使用 CardLayout佈局管路器放置卡片,最後在視窗上使用BordLayout放置這兩個Panel皮膚。右邊的Panel中帶有5張卡片(用五個按鈕模擬),按下左邊Panel中的prev按鈕,依次向前顯示,按下next按鈕,依次向後顯示,按下three按鈕,顯示第三張卡片。


取消佈局管理器

呼叫Container.setLayout(null)方法取消佈局管理器設定,在這種情況下,可以呼叫Component.setBounds方法來用絕對座標設定容器上的每個元件的大小和位置。

不使用佈局管理器將會給程式帶來一個潛在的問題,當容器大小改變時,所有元件仍保持原來的位置和大小,將導致整個程式介面比較"難看"。

程式設計例項:演示不使用佈局管理器的效果
十二
Swing和JFC
所有的Swing元件,位於javax.swing包中,他們是構築AWT上層的GUI元件,Swing元件時JComponent類的子類,Jcomponent又是java.awt.Container的子類。

為了保證可移植性,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方法,可以設定單擊視窗上的關閉按鈕時的事件處理方式,例如,當設定值為JFrame.EXIT_ON_CLOSE時,單擊JFrame視窗上的關閉按鈕,將直接關閉JFrame框架視窗並結束程式執行。

程式設計例項:使用JFrame來建立程式的主框架視窗。


JScrollPane
JScrollPane是與AWT中的ScrollPane相對應的Swing元件。

最基本的JScrollPane由水平和垂直方向上的JScrollBar,以及一個JViewport組成。

呼叫JScrollPane,getViewPort方法,可以獲得代表滾動視窗中的檢視區域的JViewport物件。

呼叫JViewport.setView方法,可以將滾動視窗中要顯示的內容作為子元件增加到JViewport上。

<<Java指南>>(可從SUN公司的網站上下載,英文名稱為The Java Tutorial)中,有關於 JScrollPane使用的詳細指導。

程式設計例項:使用JScrollPane建立滾動視窗。


Swing中的標準對話方塊
JOptionPane類提供了若干個showXxxDialog靜態方法,可用來產生簡單的標準對話方塊。

showConfirmDialog(Component parentComponent,Object message,String title,int optionType,int messageType)中的每個引數的意義。

程式設計舉例:使用JOptionPane類,在程式開始執行時,彈出一個對話方塊提示使用者,在主框架視窗的關閉按鈕被單擊時,彈出一個對話方塊詢問使用者是否真的要結束程式執行。

JFileChooser類專門用來實現檔案存取對話方塊。

<JDK安裝目錄>\Demo\jfc\FilechooserDemo目錄下的程式程式碼,演示了在JFileChooser中如何設定檔案列表過濾器。
十三
計算機介面的程式實現
要求:
單擊任何按鈕,按鈕上面的數字或符號按從左到右的順序顯示在文字框中
文字框中的文字是右對齊顯示

BoxLayout佈局管理器:
BoxLayout是在Swing中新增加的一種佈局管理器,它允許多個元件全部垂直拜訪或全部水平擺放。

使用BoxLayout實現計算機介面


學習和開發GUI程式的建議
重在掌握GUI程式的一些基本原理和開發過程,通過學習AWT元件可以更容易掌握GUI程式的基本原理和開發過程,但在GUI程式開發中,應儘量使用Swing元件。

查閱JDK文件中的Swing包,通讀一下其中所包含的元件,以瞭解Swing提供了哪些元件,但不必去仔細閱讀每個元件的具體使用幫助。

只在要用到某個GUI元件時,才有必要仔細閱讀這個元件的具體使用幫助。如果要快速掌握某個新遇到的元件的用法,最好是能夠找到並參閱該元件的例子程式。

在JDK的demo程式目錄中,或是<<Java指南>>(可從SUN公司的網站上下載,英文名為The Java tutorial)中,都能找到某些元件的應用範例。

參考別人的成功應用,是快速學習和完成工作的有效方式。


思考與實踐(1)
1什麼是事件,事件源和事件處理器,並描述三者的工作關係。
2描述事件處理的編碼實現過程。
3描述事件監聽器類和事件介面卡類的關係與區別。
4描述在視窗上畫直線的編寫過程和元件重繪的原理。
5為課程中所講的自定義計時器元件增加如下功能:允許程式設定計時器的顯示文字的顏色,時間顯示文字的字型大小隨元件大小的改變而改變。
6結合JDK文件幫助,編寫一個使用FileDialog選擇檔名的例子程式。單擊主視窗上的"開啟"按鈕,開啟一個文字對話方塊,並將選擇的檔案路徑顯示在主視窗上的"開啟"按鈕左邊的文字框中。在檔案對話方塊中可以對檔案型別進行過濾,每次開啟檔案對話方塊時,對話方塊中的初始顯示目錄為上次選擇的檔案所在的目錄。
7修改前面實現計算機介面的程式程式碼,將增加單個按鈕的程式碼用一個函式來實現,然後在一個迴圈語句中呼叫這個函式來增加所有的按鈕。

相關文章