Java的圖形界面與設計
圖形用戶界面(Graphics User Interface),簡稱GUI,使用圖形的方式,借助菜單、按鈕等標准界面元素和鼠標操作,幫助用戶方便地向計算機系統發出指令,啟動操作,並將系統運行的結果同樣以圖形方式顯示給用戶。圖形用戶界面畫面生動、操作簡單,省去了字符界面用戶必須記憶各種命令的麻煩,深受廣大用戶喜愛和歡迎,已經成為目前幾乎所有應用軟件的既成標准。所以學習設計和開發圖形用戶界面,是應用軟件開發人員必修的一課。
Java中構成用戶界面的各種元素和成分可以粗略地分成為三類:容器、控制組件和用戶自定義成分。
1.容器
容器是用來組織其他界面成分和元素的單元。一般說來一個應用程序的圖形用戶界面首先對應於一個復雜的容器,如一個窗口。這個容器內部將包含許多界面成分和元素,這寫界面元素本身也可以又是一個容器,這個容器將再進一步包含它的界面成分和元素,依次類推就構成一個復雜的圖形界面系統。
容器的主要作用和特點有:
(1)容器有一定的范圍。一般容器都是矩形的,容器范圍邊界可以用邊框框出來,有些則沒有可見的標記。
(2)容器有一定的位置。這個位置可以是屏幕四角的絕對位置,也可以是相對於其他容器邊框的相對位置。
(3)容器通常都有一個背景,這個背景覆蓋全部容器,可以通明,也可以指定一幅特殊的圖案,使界面生動化和個性化.
(4)容器中可以包含其他的許多界面成分和元素。當容器被打開顯示時,它上面的所以成分和元素也同時顯示出來,當容器被關閉和隱藏時,它所包含的成分和元素也一起被隱藏。
(5)容器可以按一定的規則來物理地安排它所包含的元素,如這些元素的相對位置關系、它們的的前後排列關系等。
(6)容器可能被包含在其他容器之中。
2.控制組件
與容器不同,控制組件是圖形用戶界面的最小單位之一,它裡面不再包含其他的成分.控制組件的作用是完成與用戶的一次交互,包括接受用戶的一個命令,接受用戶的一個文本輸入,向用戶顯示一段文本或一個圖形等。從某種程度上來說,控制組件是圖形用戶界面標准化的結果,目前常用的控制組件有:
(1)復選框(Checkbox)
(2)單選按鈕(CheckboxGroup或RadioButton)
(3)下拉列表(List或Choice)
(4)標簽(Label)
(5)文本編輯區(Edit或TextfIEld,TextArea)
(6)按鈕(Button)
3.用戶自定義成分
除了標准的圖形界面元素,編程人員還可以根據用戶需要設計一些用戶自定義的圖形界面成分,例如繪制一些幾何圖形,使用標志圖案等。用戶自定義成分由於不能像標准界面元素一樣被系統識別和承認,所以通常只能起到裝飾、美化等作用,而不能響應用戶的動作,不具有交互功能。
1.復選框(Checkbox)
例子:
上面的例子是怎樣用Java實現的呢?
它的語法如下:
import Java.awt .*;
import Java.applet .*;
import Java.awt.event.* ;
public class FuXuan extends Applet
implements ItemListener
{
public void init()
{
Checkbox one=new Checkbox("貓");
Checkbox two= new Checkbox("狗",true);
Checkbox three=new Checkbox("兔",false);
one.addItemListener(this);
add(one);
two.addItemListener(this);
add(two);
three.addItemListener(this);
add(three);
}
public void itemStateChanged(ItemEvent e)
{
}
}
分析:
第3行:調入處理包,以處理復選框的事件
第4行:implements是加入事件的接口,用implements來調用接口,這個接口函數是ItemListener;
第8行:調用函數Checkbox建立第1個選項,默認狀態為假,即沒有事先選中。
第9行:建立一個事先已經默認為正確的選項。
第12,14,16行:當用戶點擊復選框使其狀態發生變化時就會引發ItemEvent類代表的選擇事件。這個復選框已經把自身注冊給ItemEvent事件的監聽者ItemListener.系統會自動調用這個 ItemListener中的public void itemStateChanged(ItemEvent e)方法來響應復選框的狀態改變。實際的實現了ItemListener接口的監聽者。這個方法的方法體通常包括這樣的語句:調用選擇事件的方法e.getSelectable()獲得印發選擇事件的事件源對象引用,再調用e.getState()獲取選擇事件之後的狀態。也可以直接利用事件事件原對象自身的方法操作,不過要注意的是getSelectable()方法的返回值是實現了Selectable接口的對象,需要把它強制轉化成真正的事件原對象類型。例如: ((Checkbox)e.Selectable).getState():與e.getState效果是一致的。
第13,15,17行:將one、two、three三個復選框加入到面板中去,以使起能夠在屏幕上顯示出來。
2.單選按鈕(CheckboxGroup)
上面的例子是怎樣用Java實現的呢?
它的語法如下:
import Java.awt .*;
import Java.applet .*;
import Java.awt.event .*;
public class DanXuan extends Applet implements ItemListener
{
public void init()
{
CheckboxGroup cbg=new CheckboxGroup();
Checkbox one=new Checkbox("正確",false,cbg);
Checkbox two=new Checkbox("不正確",false,cbg);
Checkbox three=new Checkbox("我也不知道",true,cbg);
one.addItemListener(this);
two.addItemListener(this);
three.addItemListener(this);
add(one);
add(two);
add(three);
}
public void itemStateChanged(ItemEvent e)
{
}
}
分析:
第9行: 先建立一個新表單f,f的名稱為checkbox Group
第10行:調用函數 CheckboxGroup 建立一個新的單選按鈕組cbg
第11行:調用函數Checkbox建立第1個選項,名稱為"one",默認狀態為假,即沒有事先選中。
第12行:建立一個事先已經默認為正確的選項,名稱為“three”。
第13,14,15行:當用戶點擊復選框使其狀態發生變化時就會引發ItemEvent類代表的選擇事件。這個單選框已經把自身注冊給ItemEvent事件的監聽者ItemListener.系統會自動調用這個 ItemListener中的public void itemStateChanged(ItemEvent e)方法來響應單選框的狀態改變。實際的實現了ItemListener接口的監聽者。調用 CheckboxGroup的getSelectbox()方法可以獲得用戶選擇了哪個按鈕,這個方法返回用戶選中的Checkbox對象,再調用該對象的方法getLabel()就知道用戶選擇了什麼樣的信息。同樣,通過調用 CheckboxGroup的setSelectCheckbox()方法,可以在程序中指定單選按鈕組中的哪個按鈕。例如下面的語句說明選擇為不知道: cbd.setSelectedCheckbox(three);另外也可以直接使用按鈕組中的Checkbox單選按鈕的方法,例如直接調用:one.getState(); 就可以知道這個按鈕被選中了,那麼其他按鈕一定處於未選中狀態。
第16,17,18行:將one、two、three三個標簽加入到容器f中去,以使起能夠在屏幕上顯示出來。
第20行則是事件處理函數了!專門用來處理單選項改變的效果!這兒沒有加入代碼。所以它不能處理任何事件。
3.下拉列表(Choice)和列表(List)
1.下拉列表:
上面的例子是怎樣用Java實現的呢?
它的語法如下:
import Java.awt .*;
import Java.applet .*;
import Java.awt.event .*;
public class LIEbiao1 extends Applet implements ItemListener
{
public void init()
{
Choice c= new Choice();
c.add ("-----初始選項------");
c.add ("第一選項");
c.add ("第二選項");
c.add ("第三選項");
c.add ("第四選項");
c.addItemListener(this);
add(c);
}
public void itemStateChanged(ItemEvent e)
{
}
}
分析:
第8行:調用函數 Choice 建立一個新的下拉列表 c
第9行:調用c.add建立第1個選項,名稱為"----初始選項----",這是
默認狀態,即屏幕上什麼也沒有選時的選項。它的序號是0
第10行:建立第2個選項,名稱為“第一選項”實際上它已經是第2個
選項,這屬於一點小小的技巧問題。它的序號是1。這相信大家可以
更好地理解。
第15行:當用戶點擊選擇項時,使其狀態發生變化,就會引發ItemEvent
類代表的選擇事件。ItemEvent事件的監聽者ItemListener會自動調用
這個方法來響應下拉列表的狀態改變。getSelectedIndex()方法
將獲得被選中的選項的序號,getSelectedItem()方法將獲得被選中選項
的標簽文本字符串。select(int index)方法和select( String item)方
法使程序選中指定序號或文本內容的選項。下拉列表可以產生ItemEvent
代表的選擇事件,如果把選項注冊給實現借口ItemListener 的監聽者:
c.addItemListener().則當用戶單擊下拉列表的某個選項時,系統自動產
生一個ItemEvent類的對象包含這個事件的有關信息。
第16行:將下拉列表 c 加入到容器f中去,以使起能夠在屏幕上顯示出來。
2.列表:(可以多選)
上面的例子是怎樣用Java實現的呢?
它的語法如下:
1.…………//與前面的例子相同
2. List year=new List(4,true);
3. year.add("1998");
4. year.add("1999");
5. year.add("2000");
6. year.add("2001");
7. add(year);
8.…………//與前面的例子相同
分析:
第2行:調用函數 List 建立一個新的多選項列表 year.它有4個選項,
true表示此表可以多選。當為false時,它就只能單選。
第3行:調用year.add建立第1個選項,名稱為"1998",它的序號是0
第4行:建立第2個選項,名稱為“1999”。它的序號是1。
第8行:將下拉列表 c 加入到容器f中去,以使起能夠在屏幕上顯示出來。
如果想或知用戶選擇了列表中的哪個選項,可以調用List對象的:
getSelectedItems()方法,該方法返回一個 String類型的數組,裡面的
每個元素是一個被用戶選中的選擇項,所有的元素就包括了所有被用戶選
擇的選項。這個方法返回用戶選中的選擇項。列表可以有多選和單選。所
以List對象還有一個方法geetSelectItem()方法,與單選不同。這個方法
返回單個的字符串。
除了可以返回用戶選中的標簽字符串,還可以獲得被選中選項的序號。在
List裡面,getSelectIndex()方法將返回被選中的選項和序號。
getSelectIndexs()方法將獲得被選中選項的序號組成的整型數組。
4.標 簽標簽,就是用戶只能查看,不能修改的文本顯示區域,它能起到信息說明的作用,每個標簽用一個Label類的對象表示。請看例子:例子:上面的例子是怎樣用Java實現的呢?它的語法如下:……//與前面的例子一樣!1. Label prompt1=new Label("這是標簽 1 !");2. Label prompt2=new Label ("這是標簽 2 !");3. add(prompt1);4. add(prompt2);……//與前面的例子一樣! 分析:
第1行:調用函數 Label 建立第 1 個標簽 prompt1;
第2行:調用函數 Label 建立第 2 個標簽 prompt2;
第3行:將標簽 1 加入到容器中去,以使起能夠在屏幕上顯示出來。
第4行:同樣,將標簽2加入到容器中去,以使起能夠在屏幕上顯示出來。
標簽不能接受用戶的輸入,所以不能引發事件,不是事件源。如果
希望修改標簽上顯示的文本,可以使用Label對象的方法getText(新字符
串),同樣對於一個未知的標簽,可以通過調用Label對象getText()
方法來獲得它的文本內容。 5.文本編輯區(TextField和TextArea) Java中用於處理文本的基本組件有兩種:單行文本框 TextFIEld 和 多行文本區域TextArea,他們都是TextCompponent的子類。在創建文本組件時可以同時指出文本組件中的初始文本字符串。例子:上面的例子是怎樣用Java實現的呢?它的語法如下:……//與前面的例子相同1. TextField text1= new TextFiled("TextFIEld",20);2. text1.addActionListener(this);3. TextArea text2 = new TextArea ("TextArea",4,20);4. text2.addTextListener(this);5. add(text1);6. add(text2);……8. public void textValueChanged(TextEvent e)9. {10. } ……//與前面的例子相同 分析:
第1行:調用函數 TextFiled 建立第 1 個標簽 text1,初始字符串為
“TextFIEld”,長度為20個字符的長度;
第2行:為text1加入監視函數,用來響應它的事件改變。
第3行:調用函數 TextArea 建立第 2 個標簽 text2,初始字符串為
“TeatArea”,共有4行,每行也 為20個字符串的長度。
第4行:為text2加入監視函數,用來響應它的事件改變。
第5行:將標簽 1 加入到容器中去,以使起能夠在屏幕上顯示出來。
第6行:同樣,將標簽2加入到容器中去,以使起能夠在屏幕上顯示出來。
除了繼承TextComponent類的方法,TextfIEld還有一些自己的特殊
方法,例如,對於密碼輸入,要求輸入的內容用“*”來顯示,可以調用
如下的方法:
TextField tf = new TextfIEld("輸入密碼:");
tf.setEchoChar(’*’);
這樣就可以了。
TextArea 也有自己的特殊方法:
append(String s)在當前文本區域中已有的文本後面添加字符串
"s"的內容。 insert(String s,int index)方法將字符串s的內容插入到
已有文本的指定序號處。
6.按 鈕 按鈕是圖形界面中非常重要的一種 基本組件,按鈕本身不顯示信息,它一般對應一個事先定義好的功能操作,該操作 通常用一段程序來表示。當用戶點擊按鈕 時,系統自動執行與該按鈕相聯系的程序, 從而完成預先指定的功能。 請看下面的例子:例子:提交: 取消: 要制作上面的按鈕,請看下面的語法:……//與前面的例子相同1. Button b = new Button("提 交");2. b.addActionListener(this);3. Button c = new Button("取 消");4. c.addActionListener(this);5. add(b);6. add(c);7. public void actionPerformed(ActionEvent e)8. {9. } ……//與前面的例子相同分析:
第1行:調用函數 Button 建立第 1 個按鈕 b,名稱為“提交”;
第2行:為 提交按鈕b 加入監視函數,用來響應它的事件改變。
第3行:調用函數 Button 建立第 2 個按鈕 c ,名稱為“取消”;
第4行:為 取消按鈕c 加入監視函數,用來響應它的事件改變。
第5行:將 “提交按鈕b” 入到容器中去,以使起能夠在屏幕上顯示出來。
第6行:同樣,將“取消按鈕c”加入到容器中去,以使起能夠在屏幕上顯示出來。
按鈕可以引發動作時間,當用戶點擊一個按鈕時就引發了一個動作事件,希
望響應按鈕引發的動作事件的程序必須把按鈕注冊給實現了ActionPerformed
(ActionEvent e)方法書寫體。在方法體中,可以調用 e.getSource()方法來獲取
引發動作事件的按鈕對象引用,也可以調用e.getActionCommand()方法來過去實
現為這格式件設置的命令名。調用按鈕的getLabel()方法可以返回按鈕的標簽;
調用按鈕的setLabel(String s)方法可以把按鈕的標簽設置為s;調用
setActionCommand()方法可以為按鈕設置一個命令名,這個命令名在響應事件時
可能用到;調用getActionCommand()方法可以獲得這個命令名。要注意的是:所
有的組件必須都放置在一頂的容器中才能發揮做用,將基本的組件防入容器的方法
是該容器的add()方法。