1. 程式人生 > >十. 圖形界面(GUI)設計1.圖形界面設計基礎

十. 圖形界面(GUI)設計1.圖形界面設計基礎

讀者 java.awt 監視 明顯 而不是 簡單 released drag 例如

早先程序使用最簡單的輸入輸出方式,用戶在鍵盤輸入數據,程序將信息輸出在屏幕上。現代程序要求使用圖形用戶界面(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事件。

表 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


十. 圖形界面(GUI)設計1.圖形界面設計基礎