圖形用戶界面的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
圖形用戶界面的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
圖形用戶界面的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
圖形用戶界面的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
圖形用戶界面的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

學(xué)習(xí)導(dǎo)讀

首先,我們學(xué)習(xí)一些基本的圖形編程知識,包括窗口的顯示及外觀設(shè)置、在窗口中顯示文字和圖像等; 接下來,介紹Java的事件處理機(jī)制,例如如何在程序中接收并處理如鍵盤按鍵和鼠標(biāo)點(diǎn)擊等“事件”; 最后,系統(tǒng)地介紹圖形用戶界面中常用組件的用法,如布局管理器、文本框、復(fù)選框、菜單、對話框等。

第六章

圖形用戶界面的設(shè)計(jì)與實(shí)現(xiàn)教學(xué)重點(diǎn)與難點(diǎn):框架的組成及外觀在框架中顯示文本字體和顏色的設(shè)置Java的事件處理機(jī)制窗口事件、焦點(diǎn)事件、鍵盤事件、鼠標(biāo)事件的處理Swing各種組件的用法6.1圖形用戶界面概述

Java1.0的出現(xiàn)帶來了抽象窗口工具箱(AWT)。設(shè)計(jì)目標(biāo)是希望構(gòu)建一個通用的GUI,使得利用它編寫的程序能夠運(yùn)行在所有的平臺上,以實(shí)現(xiàn)Sun公司提出的口號“一次編寫,隨處運(yùn)行”。在Java1.2中,Sun公司推出了新的用戶界面庫:Swing。相對AWT來說,Swing功能更強(qiáng)大、使用更方便,它的出現(xiàn)使得Java的圖形用戶界面上了一個臺階。但是,Swing并沒有代替AWT。在Java1.1中,AWT事件處理模型有了根本改變。Swing使用的仍然是Java1.1的事件處理模型。

構(gòu)造圖形用戶界面的步驟構(gòu)建一個頂層容器(JFrame);構(gòu)建一個部件;用容器的add方法將部件加入該容器;設(shè)置頂層容器大小;顯示頂層容器。6.2簡單圖形用戶界面

6.2.1第一個圖形用戶界面在Java中,頂層窗口稱為框架。在AWT庫中,對應(yīng)于框架的類是Frame,在Swing庫中,相應(yīng)的類是JFrame。JFrame類擴(kuò)展了Frame類。大部分AWT組件在Swing中都有等價的組件,它們在表示形式上差一個“J”??蚣苁且粋€容器,我們可以在這個容器中放入其他一些圖形用戶界面組件,如按鈕、菜單等,從而組成一個功能完善的程序。但不能將控件直接加入swing窗體中,不能對swing窗體設(shè)置布局。【例6.1】顯示一個空框架

FirstFrame.java

6.2.2

JFrame類的繼承層次圖

JFrame類的繼承層次圖

Component類是所有GUI對象的祖先,Window類是Frame類的父類,JFrame類直接從Frame繼承而來。對于框架外觀的操作比較重要的方法如下:setIconImage——窗口最小化(在Java中稱為圖標(biāo)化)時,把一個Image對象用作圖標(biāo)。setTitle——設(shè)置窗口中標(biāo)題欄的文字。setResizable——設(shè)置用戶是否可以改變框架大小。dispose方法——關(guān)閉窗口,并回收該窗口的所有資源。setLocation——設(shè)置組件的位置。setBounds——重新設(shè)置組件的大小和位置。

【例6.2】框架外觀的設(shè)置

設(shè)置具有以下特征的框架:它的高度和寬度為整個屏幕的1/3;

自定義窗口的標(biāo)題和圖標(biāo);

窗口的大小不可變。

程序代碼見FrameSizeSet.java。運(yùn)行結(jié)果如下:圖標(biāo)標(biāo)題最大化按鈕失效6.2.2按鈕(JButton)按鈕類提供了四個構(gòu)造函數(shù)來創(chuàng)建按鈕對象,所有按鈕都能顯示文本和圖標(biāo)。

程序代碼見buttonclass.java

按鈕類提供了很多方法,基本方法介紹見程序代碼buttonMethod.java

當(dāng)希望按鈕對單擊動作有所反應(yīng)時,我們需要為按鈕注冊一個事件監(jiān)聽器,并且實(shí)現(xiàn)這個事件監(jiān)聽器,就可以完成所需要的按鈕功能。

//注冊事件監(jiān)聽器

loginButton.addActionListener(new

LoginAction());//實(shí)現(xiàn)事件監(jiān)聽器

privateclassLoginActionimplementsActionListener

程序代碼見buttonEvent.java6.2.3BorderLayout布局設(shè)計(jì)

把組件添加到容器中,希望控制組件在容器中的位置。Java的java.awt包中定義5種布局類,這5種布局類分別是:FlowLayout、BorderLayout、GridLayout、GridBagLayout及null布局。

BorderLayout布局是一種簡單的布局,它將容器內(nèi)的空間簡單地劃分為東、南、西、北、中,加入的每個組件都應(yīng)指明這個組件加在哪個區(qū)域中。

程序見:buttonclass.java6.2.4中間容器一些經(jīng)常用來添加組件的容器,我們稱之為中間容器。1、JPanel面板使用Jpanel創(chuàng)建一個面板,再將這個面板添加組件,然后再將這個面板添加到其它容器中。程序見:PanelTest.java2、JScrollPane滾動窗口可以將一個組件放到一個滾動窗口中,然后通過滾動條來觀察這些組件。JTextArea不自帶滾動條,因此將文本區(qū)放入滾動窗口中。JScrollPane提供兩個構(gòu)造函數(shù)方法為:JScrollPane()

JScrollPane(componentc);

程序見:ScrollPaneTest.java3、JSplitPane拆分窗口

拆分窗口就是將窗口分成兩個部份,分為水平拆分和垂直拆分兩種類型。拆分線可以水平或垂直移動。

JSplitPane

有兩個構(gòu)造函數(shù):

JSplitPane(inta,Componentb,Componentc)

JSplitPane(int

a,booleant,Componentb, Componentc)a取值:HORIZONTAL_SPLIT和VERTICAL_SPLIT

程序見:SplitPaneTest.java4、JinternalFrame內(nèi)部窗體 內(nèi)部窗體的常用構(gòu)造方法是:

JinternalFrame(Stringtitle,booleanresizable,

boolean

closable,boolean

max,booleanmin);

JinternalFrame和Jframe窗體一樣,不能直接將組件加到窗體中,而是通過getContentPane()得到內(nèi)容面板,將組件件加入到內(nèi)容面板中。 要能顯示內(nèi)部窗體,必須先將內(nèi)部窗體加到JDesktopPane容器中。程序見:InternalFrameTest.java6.2.5文本框(JTextField)、密碼框(JPasswordField)和文本區(qū)(JTextArea)這三個組件用于顯示單行文本和多行文本。方法:都提供了setText(String)和getText()方法。JTextArea沒有滾動條,沒有ActionEvent響應(yīng)事件。各自都有自己的方法。

程序見:textFieldClass.java

TextAreaTest.java

和textFieldEvent.java6.2.6其它布局設(shè)計(jì)1、FlowLayout布局

Flowlayout布局非常簡單,遵循這種布局的容器將其中的組件按照加入的先后順序從左向右排列,一行排滿后就轉(zhuǎn)到下一行從左到右排列,并且每一行的組件都居中排列。 將容器設(shè)置成FlowLayout布局的方法如下:

FlowLayout

flowlayout=newFlowLayout();

容器.setLayout(flowlayout);

或容器.setLayout(new

FlowLayout());

程序見:textFieldClass.java

GridLayout布局是使用較多的一種布局方式,它是將容器劃分為若干行和若干列的網(wǎng)格區(qū)域,組件就放置在這些網(wǎng)格中。網(wǎng)格布局(GridLayout)將部件放置在一個網(wǎng)格中,均沿著整齊的行、列布局,每個部件大小相同。如果改變窗口大小,每個部件的大小都會相應(yīng)改變,但仍然保持相同大小。

publicGridLayout(introws,intcols)publicGridLayout(introws,intcols, int

hgap,int

vgap)publicComponentadd(Componentcomp)程序見:GridLayoutTest.java GridLayoutTest1.java2、GridLayout布局3、null布局和setBounds方法可以將一個容器的布局設(shè)置成null布局。使用方法:

setBounds(int

x,int

y,int

width,intheight)設(shè)置組件的大小和位置。見程序:LayoutNull.java一個綜合例子:LayoutTest.java6.2.7

在框架中顯示信息

如果需要將一些圖形用戶界面元素加入到框架中,我們需要在面板組件(JPanel)中進(jìn)行繪制,然后將該面板組件加入到框架的內(nèi)容面板中。相應(yīng)的代碼如下://得到JFrame的內(nèi)容窗格對象ContainercontentPane=getContentPane();Componentc=...;//將組件加入到內(nèi)容窗格中contentPane.add(c);面板JPanel類本身是容器,它可以容納其他圖形用戶界面元素,如按鈕、菜單等。

為了在面板中進(jìn)行繪制,需要重載JComponent類的paintComponent方法。

classMyPanelextendsJpanel { publicvoidpaintComponent(Graphicsg) {

super.paintComponent(g); ...//相關(guān)的繪制代碼

}

paintComponent方法是自動執(zhí)行的,當(dāng)窗口需要被重新繪制時,如用戶縮放窗口,或還原已最小化的窗口時,系統(tǒng)就會自動調(diào)用該方法。 在框架中顯示文本信息的方法:

g.drawString(text,x,y)

在框架中顯示信息

程序代碼見HelloWorld.java。運(yùn)行結(jié)果如下:6.2.8

文本和字體

通過Font類對象設(shè)置字體。FontStringFont=newFont(“宋體”,Font.ITALIC,20);字體風(fēng)格有以下幾種選項(xiàng):Font.PLAIN //常規(guī)Font.BOLD //加粗Font.ITALIC

//傾斜

不同的系統(tǒng)中安裝了不同的字體,為了得到本系統(tǒng)中所有已安裝的字體,我們可以通過GraphicsEnvironment類的getAvailableFontFamilyNames方法來實(shí)現(xiàn)。該方法返回一個字符串?dāng)?shù)組,數(shù)組內(nèi)包含所有可用的字體名。顯示系統(tǒng)中所有字體名。程序見ListFonts.java字體設(shè)置

采用“宋體”顯示字符串“你好,Java!”,字體風(fēng)格為加粗、傾斜,大小為20點(diǎn)。程序代碼見FontSet.java。運(yùn)行結(jié)果如下:6.3事件處理

6.3.1事件處理原理

如果用戶在用戶界面執(zhí)行了一個動作,這將導(dǎo)致一個事件的發(fā)生。事件是描述發(fā)生了什么的對象。在Java中,定義了各種不同類型的事件類,用來描述各種類型的用戶操作。事件是由事件源產(chǎn)生的,事件的產(chǎn)生者稱為事件源。例如,在Button組件上點(diǎn)擊鼠標(biāo)會產(chǎn)生以這個Button為源的一個事件:ActionEvent。事件源擁有自己的方法,我們通過它向其注冊事件監(jiān)聽器。事件監(jiān)聽器是一個類的實(shí)例,這個類實(shí)現(xiàn)了一個特殊的接口,稱為Lintenerinterface。當(dāng)事件源產(chǎn)生了一個事件以后,事件源就會發(fā)送通知給相應(yīng)的事件監(jiān)聽器,監(jiān)聽器對象根據(jù)事件對象內(nèi)封裝的信息,決定如何響應(yīng)這個事件。我們可以通過以下方法來注冊監(jiān)聽器對象:eventSourceObject.addEventListener(eventListenerObject);以按鈕類對例:MyActionListenerlistener=...;JButtonbutton=newJButton(”提交”);button.addActionListener(listener);監(jiān)聽器對象listener所屬的類MyActionListener必須實(shí)現(xiàn)相應(yīng)的接口,以響應(yīng)事件:publicclassMyActionListener implementsActionListener{ ... publicvoidactionPerformed(ActionEventevent) { //相應(yīng)的響應(yīng)操作

}}6.3.2

處理按鈕點(diǎn)擊事件

創(chuàng)建按鈕:JButton

MyButton=newJButton(“Java”);通過Container類的Add方法,將組件加入到該容器中。classMyPanelextendsJPanel{ publicMyPanel() {

JButton

MyButton=newJButton(“Java”);

add(MyButton); }}為按鈕設(shè)置監(jiān)聽器。指定的監(jiān)聽器必須實(shí)現(xiàn)ActionListener接口的actionPerformed方法:publicvoidactionPerformed(ActionEventevent)【例6.9】點(diǎn)擊按鈕采用內(nèi)部類ButtonAction充當(dāng)事件監(jiān)聽器。在面板中放置兩個按鈕,當(dāng)用戶點(diǎn)擊其中一個按鈕時,面板中顯示對應(yīng)的操作。例如,如果點(diǎn)擊“按鈕一”,顯示“您點(diǎn)擊的是:按鈕一”。程序代碼見ButtonClick.java。運(yùn)行結(jié)果如下:6.3.3捕獲窗口事件

JFrame對象是窗口事件(WindowEvent)的事件源,我們要指定一個監(jiān)聽器對象:MyWindowListenerlistener=...;frame.addWindowListener(listener);

監(jiān)聽器對象要實(shí)現(xiàn)WindowListener接口。WindowListener接口中共有七個方法,它們分別對應(yīng)七個窗口事件:publicinterfaceWindowListener{ voidwindowOpened(WindowEvente); voidwindowClosing(WindowEvente); voidwindowClosed(WindowEvente); voidwindowIconified(WindowEvente); voidwindowDeiconified(WindowEvente); voidwindowActivated(WindowEvente); voidwindowDeactivated(WindowEvente);}

WindowListener接口實(shí)現(xiàn)方法一:定義一個類來實(shí)現(xiàn)WindowListener接口,在感興趣的方法中添加我們需要的代碼,然后讓其他方法為空即可。classQuitWindow

implementsWindowListener{ publicvoidwindowClosing(WindowEvente) { System.exit(0);}

voidwindowOpened(WindowEvente){} voidwindowClosed(WindowEvente){} voidwindowIconified(WindowEvente){} voidwindowDeiconified(WindowEvente){} voidwindowActivated(WindowEvente){} voidwindowDeactivated(WindowEvente){}}WindowListener接口實(shí)現(xiàn)方法二:Java為每個具有多個方法的AWT監(jiān)聽器接口提供了一個適配器類。適配器類實(shí)現(xiàn)了監(jiān)聽器接口的所有方法,但是卻不做任何實(shí)際工作。與WindowListener接口對應(yīng)的WindowAdapter類實(shí)現(xiàn)了以上七個空方法,我們只需要通過擴(kuò)展適配器類來實(shí)現(xiàn)我們感興趣的方法。

classQuitWindowextendsWindowAdapter{ publicvoidwindowClosing(WindowEvente) { System.exit(0); }}【例6.11】捕獲窗口事件

捕獲窗口的關(guān)閉事件。程序代碼見WindowClosing.java。6.3.4AWT事件層次結(jié)構(gòu)圖

AWT事件類的繼承關(guān)系圖

AWT將事件分為兩類:語義(Semantic)事件ActionEvent:對應(yīng)按鈕點(diǎn)擊、菜單選擇、列表框選擇、在文本域中按回車鍵等。AdjustmentEvent:用戶調(diào)整滾動條。ItemEvent:用戶從一組選擇框或者列表項(xiàng)中進(jìn)行選擇。TextEvent:文本域或者文本框中的內(nèi)容發(fā)生改變。低級(Low-Level)事件ComponentEvent:組件大小改變、移動、顯示或者隱藏。KeyEvent:鍵盤上的一個鍵被按下或者釋放。MouseEvent:鼠標(biāo)按鍵被按下、釋放、鼠標(biāo)移動或者拖動。FocusEvent:組件獲得焦點(diǎn)或者失去焦點(diǎn)。WindowEvent:窗口被激活、屏蔽、最小化、最大化或關(guān)閉。ContainerEvent:添加或者刪除一個組件。6.3.5焦點(diǎn)事件

如果某個組件能夠接收用戶按鍵,那么該組件就擁有焦點(diǎn)。擁有焦點(diǎn)的組件在顯示形式上與其他組件有一些差別:文本域內(nèi)會顯示光標(biāo);按鈕四周會顯示一個由虛線組成的矩形框。可以捕獲丟失的焦點(diǎn)事件來進(jìn)行輸入的合法性檢查。如果輸入不合法,通過調(diào)用requestFocus方法把焦點(diǎn)重新移回到該文本域,提示用戶重新輸入:publicvoidfocusLost(FocusEventevent){

//passText為需要進(jìn)行合法性檢查的文本域if(event.getComponent()==passText&&!event.isTemporary()) {

//isFormatValid為自定義方法,用戶檢查合法性

if(!isFormatValid(passText.getText()))

passText.requestFocus(); }}6.3.6鍵盤事件

KeyListener接口中有三個方法:publicvoidkeyPressed(KeyEvent

e)publicvoidkeyReleased(KeyEvent

e)publicvoidkeyTyped(KeyEvent

e)Java對于用戶按鍵的處理過程:當(dāng)前鍵盤狀態(tài)為小寫狀態(tài),要輸入一個大寫字母“A”,我們的操作過程為:先按住Shift鍵不放,再按下A鍵,然后松開。整個過程Java會產(chǎn)生五個事件:按下Shift鍵:為VK_SHIFT調(diào)用keyPressed方法;按下A鍵:為VK_A調(diào)用keyPressed方法;鍵入字符“A”:為字符“A”調(diào)用keyTyped方法;松開A鍵:為VK_A調(diào)用keyReleased方法;松開Shift鍵:為VK_SHIFT調(diào)用keyReleased方法?!纠?.12】捕獲鍵盤事件

用戶每次按下鍵盤上的某個鍵,程序捕獲鍵盤輸入,并顯示在面板中,內(nèi)容包括:虛擬鍵碼、鍵的名稱和字符。例如:當(dāng)前鍵盤狀態(tài)為小寫狀態(tài),用戶按下“A”鍵,顯示的值依次為:65,A,a。

程序代碼見KeyPress.java。運(yùn)行結(jié)果如下:6.3.7鼠標(biāo)事件

MouseListener接口:mousePressed:鼠標(biāo)鍵被按下時調(diào)用;mouseReleased:鼠標(biāo)鍵被釋放時調(diào)用;mouseClicked:合并上述兩個事件為一次鼠標(biāo)點(diǎn)擊事件。

這三個方法的參數(shù)是MouseEvent,通過getX和getY方法,能夠得到鼠標(biāo)點(diǎn)擊時的鼠標(biāo)指針的x和y坐標(biāo)。通過getClickCount方法,可以區(qū)別是單擊操作,還是雙擊操作。MouseMotionListener接口:mouseMoved:鼠標(biāo)移動;mouseMoved

:用戶拖動鼠標(biāo)。

鼠標(biāo)指針形狀的設(shè)置:setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));【例6.13】利用鼠標(biāo)進(jìn)行繪圖

點(diǎn)擊窗口中的空白處,得到一張“笑臉”的圖像;點(diǎn)擊已存在的圖像,圖像在“笑臉”和“哭臉”之間切換;用鼠標(biāo)可以對圖像進(jìn)行拖動操作;在窗口左上角,顯示當(dāng)前鼠標(biāo)光標(biāo)的位置。程序代碼見MouseDraw.java。運(yùn)行結(jié)果如下:6.4.1Swing組件的類繼承關(guān)系6.4.2布局管理器

在Java中,提供了布局工具以支持用戶界面元素的自動定位。容器中的所有組件都由一個布局管理器進(jìn)行動態(tài)管理。流布局管理器在一行上水平排列組件,直到該行沒有足夠的空間為止,然后另起一行繼續(xù)排列。當(dāng)用戶縮放容器時,布局管理器將進(jìn)行自動控制,重新排列。我們可以指定流布局管理器的組件排列方式,如居中(默認(rèn))、左對齊、右對齊等。如:setLayout(new

FlowLayout(FlowLayout.LEFT));//左對齊setLayout(new

FlowLayout(FlowLayout.RIGHT));//右對齊setLayout(new

FlowLayout(FlowLayout.CENTER));//居中

邊界布局管理器邊界布局管理器的布局分為五個位置:CENTER、EAST、WEST、NORTH、SOUTH,我們可以把組件放在這五個位置的任意一個,如果未指定位置,則缺省的位置是CENTER。采用邊界管理器進(jìn)行布局時,四周的組件先被放置,剩余的空間由位于中間的組件占用;當(dāng)容器的大小改變時,四周組件的厚度不會被改變,而中間組件的大小需要改變。【例6.14】流布局管理器示例程序代碼見FlowLayoutTest.java。運(yùn)行結(jié)果如下:javaFlowLayoutTest10javaFlowLayoutTest15【例6.15】邊界布局管理器示例將三個按鈕置于南區(qū),而兩個文本置于北區(qū)。

程序代碼見BorderLayoutTest.java。運(yùn)行結(jié)果如下:6.4.3文本組件Java提供的文本組件:用于單行文本輸入的文本域(JTextField)和用于多行輸入的文本區(qū)(JTextArea)。獲得文本域的內(nèi)容add1=Integer.parseInt(originText.getText().trim());

跟蹤文本域內(nèi)容的修改//新建文檔監(jiān)聽器DocumentListener

resultListener=newResultListener();...//為第一個文本域安裝一個文檔監(jiān)聽器originText.getDocument().addDocumentListener(resultListener);當(dāng)文本發(fā)生改變后,下面三個方法之一會被調(diào)用:voidinsertUpdate(DocumentEvente)voidremoveUpdate(DocumentEvente)voidchangedUpdate(DocumentEvente)

重新設(shè)置文本域的內(nèi)容resultText.setText(s);【例6.16】獲取兩個文本域的輸入并求和,然后顯示在第三個文本域中。程序代碼見TextFieldTest.java。運(yùn)行結(jié)果如下:初始狀態(tài)改變輸入密碼域JPassworkField特殊的文本域,在密碼域中輸入時,用戶的輸入并不會真正顯示出來,而是顯示回顯符,如“*”,以防止被他人看見用戶輸入的密碼。

【例6.17】將密碼域的輸入顯示在文本域中程序代碼見PasswordFieldTest.java。運(yùn)行結(jié)果如下:文本區(qū)組件

在一個文本區(qū)里,用戶可以輸入多行文本,多行文本之間的換行可以采用三種方式:1)手動換行。即輸入ENTER鍵,這將在文本中插入換行符“\n”。2)通過設(shè)置換行屬性來避免手動換行,由文本區(qū)組件自動處理。textArea.setLineWrap(true);但是這樣的設(shè)置并沒有真正在文本中插入換行符“\n”。3)給文本區(qū)增加滾動條,這可以通過把文本區(qū)插入到一個滾動窗格中來實(shí)現(xiàn)。這也是給其他組件添加滾動條的方法。JScrollPane

scrollPane=newJScrollPane(textArea);【例6.18】文本區(qū)的三種顯示方式程序代碼見TextAreaTest.java。運(yùn)行結(jié)果如下:6.4.4標(biāo)簽

讓我們回頭看看前面的示例結(jié)果,我們必須記住組件的位置,否則無法分辨出各個組件。對于程序編制者,這還可以解決,但是對于一般用戶,就相當(dāng)困難了。因此,為了在運(yùn)行時能夠識別組件,我們需要標(biāo)簽組件。JLablelabel=newJLabel(“NoWrapArea”,JLabel.LEFT);通過上面的代碼我們建立了一個標(biāo)簽對象,其顯示的文本是“NoWrapArea”,對齊方式為左對齊。6.4.5按鈕

為在按鈕上顯示相應(yīng)的信息,可以提供初始的文本和圖標(biāo)。loginButton=newJButton("登錄",newImageIcon("login.gif"));當(dāng)希望按鈕對單擊動作有所反應(yīng)時,我們需要為按鈕注冊一個事件監(jiān)聽器,并且實(shí)現(xiàn)這個事件監(jiān)聽器,就可以完成所需要的按鈕功能。//注冊事件監(jiān)聽器loginButton.addActionListener(new

LoginAction());//實(shí)現(xiàn)事件監(jiān)聽器privateclassLoginActionimplementsActionListener【例6.19】密碼驗(yàn)證示例當(dāng)用戶輸入密碼后,按下“登錄”按鈕,然后我們將密碼輸入是否正確的結(jié)果顯示在文本域中。

程序代碼見Login.java。運(yùn)行結(jié)果如下:6.4.6Swing常用的選擇類組件

單選按鈕組件

單選按鈕組件是一組互斥按鈕,即我們一次只能選擇其中的一個選項(xiàng),選項(xiàng)的選取只需要單擊即可。ButtonGroupgroup=newButtonGroup();JRadioButtonbutton1=newJRadioButton(“EAST”,true);...JRadioButtonbutton4=newJRadioButton(“NORTH”,false);為指定單選按鈕的初始選項(xiàng),我們在新建JRadioButton對象時,將其構(gòu)造器的第二個參數(shù)設(shè)置為“true”;同時,其他按鈕對象的第二個參數(shù)被設(shè)置為“false”。

【例6.20】單選按鈕組件示例通過選擇單選按鈕中的選項(xiàng)來設(shè)置標(biāo)簽組件的內(nèi)容,由標(biāo)簽組件顯示我們的選擇。程序代碼見RadioButtonExample.java。運(yùn)行結(jié)果如下:復(fù)選框組件復(fù)選框組件可以進(jìn)行多重選擇,即我們能夠選擇其中的多個選項(xiàng),如果要取消或選取某選項(xiàng),可以單擊此選項(xiàng)。和單選按鈕不同,復(fù)選框允許用戶選擇多個選項(xiàng)。我們通過單擊復(fù)選框來選取該選項(xiàng),再單擊一下,則取消選取。建立復(fù)選框組件對象需要使用標(biāo)簽來表明該復(fù)選框的含義,標(biāo)簽在復(fù)選框構(gòu)造器里進(jìn)行設(shè)置;對復(fù)選框是否被選取可以通過isSelected方法進(jìn)行狀態(tài)判斷。boldCheck=newJCheckBox(“Bold”);//新建復(fù)選框。italicCheck=newJCheckBox(“Italic”);//新建復(fù)選框。boldCheck.isSelected();//判斷“mathCheck”復(fù)選框是否被選定?!纠?.21】復(fù)選框組件示例選擇字體風(fēng)格。程序代碼見CheckBoxExample.java。運(yùn)行結(jié)果如下:列表框組件列表框組件允許用戶從一個列表中選擇一個或多個條目。用戶可以從列表框中選擇一個或多個條目。建立列表框前,需要指定所顯示的列表?xiàng)l目:String[]courses={“Math”,“English”,“Physics”,“Chemic”,“Biology”,“Politics”};JList

courseList=newJList(courses);如果列表框比較長,而顯示屏幕比較小,可以設(shè)置列表中顯示的行數(shù),同時使用滾動條:courseList.setVisibleRowCount(4);JScrollPane

listScrollPane=newJScrollPane(courseList);選擇列表框中的多個條目有兩種方式:連續(xù)條目選擇和間斷條目選擇。用戶選擇列表框條目時,列表框就會產(chǎn)生選擇事件。將列表選擇監(jiān)聽器ListSelectionListener添加給列表組件,并在該監(jiān)聽器中實(shí)現(xiàn)valueChanged方法:courseList.addListSelectionListener(new

courseListener());...privateclasscourseListenerimplementsListSelectionListener{ publicvoidvalueChanged(ListSelectionEventevent) {...}}獲得用戶所選擇的列表框條目以及條目所在的索引號需要使用getSelectedValues方法和getSelectedIndices方法:Object[]selectedCourses=courseList.getSelectedValues();int[]selectedIndexCourses=courseList.getSelectedIndices();【例6.22】列表框組件示例在給定的科目中選擇多門課程。程序代碼見ListExample.java。運(yùn)行結(jié)果如下:組合框組件組合框?qū)⒕庉嬁蚝拖吕斜砜蚪Y(jié)合起來,使得用戶可以在一組預(yù)定義的選項(xiàng)中選擇一個條目,而且能夠修改選項(xiàng)內(nèi)容。新建一個有內(nèi)容的組合框既可以象列表框那樣指定數(shù)組,也可以采用向組合框?qū)ο罄锛尤霔l目的方法。對組合框是否能夠被編輯也可以進(jìn)行設(shè)置。//新建組合框。jobsBox=newJComboBox();jobsBox.setEditable(true);//設(shè)置組合框是否能夠被編輯。jobsBox.addItem("job1");jobsBox.addItem("job2");組合框的內(nèi)容是可以動態(tài)變化的:addItem方法能夠把條目添加到列表的末尾;insertItermAt方法將把新條目添加到列表的任何位置;removeItem方法和removeItemAt方法將能夠刪除指定條目;removeAllItems方法將刪除所有條目:jobsBox.insertItermAt(“job7”,6);//在第7個位置增加“job7”條目。jobsBox.removeItem(“job7”);//刪除“job7”條目。jobsBox.removeItemAt(5);//刪除第6個條目,即“job6”。jobsBox.removeAllItems();//刪除所有條目。當(dāng)選擇一個條目時,組合框就產(chǎn)生一個事件,對事件的監(jiān)聽需要添加事件監(jiān)聽器,并實(shí)現(xiàn)actionPerformed方法://增加事件監(jiān)聽器。jobsBox.addActionListener(new

jobsListener());...privateclassjobsListenerimplementsActionListener{ publicvoidactionPerformed(ActionEventevent) { ... }}當(dāng)組合框的選擇事件發(fā)生時,可以通過getSelectedItem方法來獲取當(dāng)前被選擇的條目:ObjectselectedJob=jobsBox.getSelectedItem();【例6.23】組合框組件示例應(yīng)用組合框來進(jìn)行選擇職業(yè)。程序代碼見ComboBoxExample.java。運(yùn)行結(jié)果如下:滑塊組件滑塊組件一般有一個連續(xù)區(qū)間和可拖動的滑塊,用戶可以通過拖動滑塊在一個區(qū)間范圍里進(jìn)行選擇。JSlider

ageSlider=newJSlider();ageSlider=newJSlider(SwingConstants.VERTICAL,0,120,20);當(dāng)滑塊被拖動時,滑塊的值將發(fā)生變化,觸發(fā)ChangeEvent事件?;瑝K組件的事件監(jiān)聽器要實(shí)現(xiàn)ChangeListener接口,并實(shí)現(xiàn)此接口中的stateChanged方法:AgeListener

myAgeListener=newAgeListener();ageSlider.addChangeListener(myAgeListener);privateclassAgeListenerimplementsChangeListener{ publicvoidstateChanged(ChangeEventevent) { ... }}滑塊值發(fā)生變化時,使用getValue方法來獲得滑塊值:myTextField.setText(""+sourceSlider.getValue());

【例6.24】滑塊組件示例在進(jìn)行年齡輸入時,使用滑塊進(jìn)行直觀的選擇。程序代碼見SliderExample.java。運(yùn)行結(jié)果如下:6.4.7邊界當(dāng)界面中的組件比較多時,需要從視覺上將組件分隔。通用的辦法是為面板設(shè)置邊界,并將需要分隔的組件添加到該面板中??蛇x的邊界風(fēng)格包括:低斜面、凸斜面、蝕刻、直線、不光滑、空。創(chuàng)建邊界需要調(diào)用BorderFactory的靜態(tài)方法。當(dāng)需要給邊界增加標(biāo)題以提示時,可以使用BorderFactory的createTitledBorder方法://初始化帶標(biāo)題的空邊界。Borderborder=BorderFactory.createEmptyBorder();Bordertitled=BorderFactory.createTitledBorder (border,"Bordertypes");當(dāng)創(chuàng)建好需要的邊界后,就可以把邊界對象添加到組件中:buttonPanel.setBorder(titled);【例6.25】邊界示例各種邊界的不同效果。程序代碼見BorderExample.java。運(yùn)行結(jié)果如下:6.4.8菜單以及彈出式菜單

典型的菜單:創(chuàng)建菜單四個步驟:創(chuàng)建菜單欄、創(chuàng)建菜單以及子菜單、創(chuàng)建菜單項(xiàng),并將菜單項(xiàng)加入到子菜單或菜單中,將子菜單加入到菜單中,將菜單加入到菜單欄中。//(a)創(chuàng)建菜單欄,并將菜單欄加入到框架中。JMenuBar

menuBar=newJMenuBar();setJMenuBar(menuBar);//(b)創(chuàng)建“File”菜單、“Edit”菜單和“View”菜單。JMenu

fileMenu=newJMenu("File");JMenu

editMenu=newJMenu("Edit");JMenu

viewMenu=newJMenu("View");//(b)創(chuàng)建子菜單。JMenu

optionMenu=newJMenu("Option");//(c)通過Action對象新建“New”菜單項(xiàng),并添加事件監(jiān)聽器。newItem=fileMenu.add(new

ShowAction("New"));//(c)通過指定菜單項(xiàng)對象新建“Paste”菜單項(xiàng)。pasteItem=newJMenuItem("Paste",'P');//(d)將菜單項(xiàng)加入到子菜單或菜單中,將子菜單加入到菜單中,將菜單加入到菜單欄中。fileMenu.add(newItem);editMenu.add(pasteItem);viewMenu.add(optionMenu);menuBar.add(fileMenu);menuBar.add(editMenu);menuBar.add(viewMenu);創(chuàng)建復(fù)選框和單選按鈕菜單項(xiàng)和創(chuàng)建一般的菜單項(xiàng)幾乎一樣,只需要注意一下復(fù)選框和單選按鈕的不同構(gòu)造函數(shù)以及單選按鈕組的構(gòu)建://創(chuàng)建單選按鈕菜單項(xiàng)“Forward”,并將“Forward”菜單項(xiàng)加入到“Search”菜單中。ButtonGroupgroup=newButtonGroup();forwardItem=newJRadioButtonMenuItem("Forward");group.add(forwardItem);searchMenu.add(forwardItem);//創(chuàng)建復(fù)選框菜單項(xiàng)“ToolBar”,并加入到子菜單中。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論