標籤:
早先程式使用最簡單的輸入輸出方式,使用者在鍵盤輸入資料,程式將資訊輸出在螢幕上。現代程式要求使用圖形化使用者介面(Graphical User Interface,GUI),介面中有菜單、按鈕等,使用者通過滑鼠選擇菜單中的選項和點擊按鈕,命令程式功能模組。本章學習如何用Java語言編寫GUI科學實驗,如何通過GUI實現輸入和輸出。
AWT和Swing
先前用Java編寫GUI程式,是使用抽象視窗工具包AWT(Abstract Window Toolkit).現在多用Swing。Swing可以看作是AWT的改良版,而不是代替AWT,是對AWT的提高和擴充。所以,在寫GUI程式時,Swing和AWT都要作用。它們共存於Java基礎類(Java Foundation Class,JFC)中。
儘管AWT和Swing都提供了構造圖形介面元素的類,但它們的重要方面有所不同:AWT依賴於主平台繪製使用者介面組件;而Swing有自己的機制,在主平台提供的視窗中繪製和管理介面組件。Swing與AWT之間的最明顯的區別是介面組件的外觀,AWT在不同平台上運行相同的程式,介面的外觀和風格可能會有一些差異。然而,一個基於Swing的應用程式可能在任何平台上都會有相同的外觀和風格。
Swing中的類是從AWT繼承的,有些Swing類直接擴充AWT中對應的類。例如,JApplet、JDialog、JFrame和JWindow。
使用Swing設計圖形介面,主要引入兩個包:
- javax.swing包:包含Swing的基本類;
- java.awt.event包:包含與處理事件相關的介面和類。
由於Swing太豐富,不可能在一本教科書中給出Swing的全面介紹,但本章所介紹的有關Swing的知識,已足以讓讀者編寫相當精美的GUI程式。
組件和容器
組件(component)是圖形介面的基本元素,使用者可以直接操作,例如按鈕。容器(Container)是圖形介面的的複合元素,容器可以包含組件,例如面板。
Java語言為每種組件都預定義類,程式通過它們或它們的子類各種組件對象,如,Swing中預定義的按鈕類JButton是一種類,程式建立的JButton對象,或JButton子類的對象就是按鈕。Java語言也為每種容器預定義類,程式通過它們或它們的子類建立各種容器物件。例如,Swing中預定義的視窗類別JFrame是一種容器類,程式建立的JFrame或JFrame子類的對象就是視窗。
為了統一管理組件和容器,為所有組件類定義超類,把組件的共有操作都定義在Component類中。同樣,為所有容器類定義超類Container類,把容器的共有操作都定義在Container類中。例如,Container類中定義了add()方法,大多數容器都可以用add()方法向容器添加組件。
Component、Container和Graphics類是AWT庫中的關鍵類。為能層次地構造複雜的圖形介面,容器被當作特殊的組件,可以把容器放入另一個容器中。例如,把若干按鈕和文字框分放在兩個面板中,再把這兩個面板和另一些按鈕放入視窗中。這種層次地構造介面的方法,能以增量的方式構造複雜的使用者介面。
事件驅動程式設計基礎
1.事件、監視器和監視器註冊
圖形介面上的事件是指在某個組件上發生使用者操作。例如,使用者單擊了介面上的某個按鈕,就說在這個按鈕上發生了事件,這個按鈕對象就是事件的擊發者。對事件作監視的對象稱為監視器,監視器提供響應事件的處理方法。為了讓監視器與事件對象關聯起來,需要對事件對象作監視器註冊,告訴系統事件對象的監視器。
以程式響應按鈕事件為例,程式要建立按鈕對象,把它添加到介面中,要為按鈕作監視器註冊,程式要有響應按鈕事件的方法。當“單擊按鈕”事件發生時,系統就調用已為這個按鈕註冊的事件處理方法,完成處理按鈕事件的工作。
2.實現事件處理的途征
java語言編寫事件處理常式主要有兩種方案:一個是程式重設handleEvent(Eventevt),採用這個方案的程式工作量稍大一些;另一個方案是程式實現一些系統設定的介面。java按事件類型提供多種介面,作為監視器對象的類需要實現相應的介面,即實現響應事件的方法。當事件發生時,系統內設的handleEvent(Event evt)方法就自動調用監視器的類實現的響應事件的方法。
java.awt.event包中用來檢測並對事件做出反應的模型包括以下三個組成元素:
- 來源物件:事件“發生”這個組件上,它與一組“偵聽”該事件的對象保持著聯絡。
- 監視器對象:一個實現預定義的介面的類的一個對象,該對象的類要提供對發生的事件作處理的方法。
- 事件對象:它包含描述當事件發生時從源傳遞給監視器的特定事件的資訊。
一個事件驅動程式要做的工作除建立來源物件和監視器對象之外,還必須安排監視器瞭解來源物件,或向來源物件註冊監視器。每個來源物件有一個登入的監視器列表,提供一個方法能向該列表添加監視器對象。只有在來源物件註冊了監視器之後,系統才會將來源物件上發生的事件通知監視器對象。
3.事件類型和監視器介面
在java語言中,為了便於系統管理事件,也為了便於程式作監視器註冊,系統將事件分類,稱為事件類型。系統為每個事件類型提供一個介面。要作為監視器對象的類必須實現相應的介面,提供介面規定的響應事件的方法。
再以程式響應按鈕事件為例,JButton類對象button可以是一個事件的激發者。當使用者點擊介面中與button對應的按鈕時,button對象就會產生一個ActionEvent類型的事件。如果監視器對象是obj,對象obj的類是Obj,則類Obj必須實現AWT中的ActionListener介面,實現監視按鈕事件的actionPerformed方法。button對象必須用addActionListener方法註冊它的監視器obj。
程式運行時,當使用者點擊button對象對應的按鈕時,系統就將一個ActionEvent對象從事件激發對象傳遞到監視器。ActionEvent對象包含的資訊包括事件發生在哪一個按鈕,以及有關該事件的其他資訊。
表 11-1 給出有一定代表性的事件類型和產生這些事件的部分Swing組件。實際事件發生時,通常會產生一系列的事件,例如,使用者點擊按鈕,會產生ChangeEvent事件提示游標到了按鈕上,接著又是一個ChangeEvent事件表示滑鼠被按下,然後是ActionEvent事件表示滑鼠已鬆開,但游標依舊在按鈕上,最後是ChangeEvent事件,表示游標已離開按鈕。但是應用程式通常只處理按下按鈕的完整動作的單個ActionEvent事件。
表 11-1 組件和事件類型
| 事件類型 |
組件 |
描述 |
| ActionEvent |
JButton,JCheckBox JComboBox,JMenuItem JRadioButton |
點擊、選項或選擇 |
| ChangeEvent |
JSlider |
調整一個可移動元素的位置 |
| AdjustmentEvent |
JScrollBar |
調整滑塊位置 |
| ItemEvent |
JComboBox,JCheckBox JRadioButton JRadioButtonMenuItem JCheckBoxMenuItem |
從一組可選方案中選擇一個項 目 |
| ListSelectionEvent |
JList |
選項事件 |
KeyEvent MouseEvent |
JComponent 及其衍生類別 |
操縱滑鼠或鍵盤 |
| CareEvent |
JTextArea,JTextField |
選擇和編輯文本 |
| WindowEvent |
Window 及其衍生類別 JFrame |
對視窗開啟、關閉和表徵圖化 |
每個事件類型都有一個相應的監視器介面,表11-2列出了每個介面的方法。實現監視器介面的類必須實現所有定義在介面中的方法。
表 11-2 監視器介面方法
| 監視器介面 |
方法 |
擷取事件來源的方法 |
| ActionListener |
actionPerformed |
getSource,getActionCommand |
| ChangeListener |
stateChanged |
getSource |
| AdjustmentListener |
adjustmentValueChanged |
getAdjustable |
| FocusListener |
focusGained, focusLost |
|
| ItemListener |
itemStateChanged |
getItemSelectable(),getSource() |
| ListSelectionListener |
valueChanged |
e.getSource().getSelectedValue() |
| KeyListener |
keyPressed, keyReleased, keyTyped |
|
| CareListener |
careUpdate |
|
| MouseListener |
mouseClicked, mouseEntered, mouseExited, mousePressed, mouseReleased |
|
| MouseMontionListener |
mouseDragged, mouseMoved |
|
| WindowListener |
windowClosed, windowClosing, windowDeactivated, windowDeiconified, windowIconified, windowOpened |
|
系列文章:
Java知多少(上)Java知多少(中)Java知多少(78)Java向量(Vector)及其應用Java知多少(79)雜湊表及其應用
Java知多少(80)圖形介面設計基礎