十. 圖形界面(GUI)設計1.圖形界面設計基礎
早先程序使用最簡單的輸入輸出方式,用戶在鍵盤輸入數據,程序將信息輸出在屏幕上。現代程序要求使用圖形用戶界面(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 早先程序使用最簡單的輸入輸出方式,用戶在鍵盤輸入數據,程序將信息輸出在屏幕上。現代程序要求使用圖形用戶界面(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 www.jimeiyulept.com 。
使用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事件。
javax.swing包:包含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事件。
事件類型 | 組件 | 描述 |
---|---|---|
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列出了每個接口的方法。實現監視器接口的類必須實現所有定義在接口中的方法。
監視器接口 | 方法 | 獲取事件源的方法 |
---|---|---|
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 |
|
十. 圖形界面(GUI)設計1.圖形界面設計基礎