




已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章 圖形界面設(shè)計(jì)(一)本章重點(diǎn):框架窗口,按鈕事件處理方法,面板和滾動面板,布局設(shè)計(jì),文本框事件的處理方法,以及利用文本框和文本區(qū)作數(shù)據(jù)輸入輸出的方法。本章難點(diǎn):按鈕事件和文本框事件的處理方法。5.1 圖形界面設(shè)計(jì)基礎(chǔ)早先程序使用最簡單的輸入輸出方式,用戶在鍵盤輸入數(shù)據(jù),程序?qū)⑿畔⑤敵鲈谄聊簧稀,F(xiàn)代程序要求使用圖形用戶界面(Graphics User Interface,簡稱GUI),界面中有菜單、按鈕等,用戶通過鼠標(biāo)選擇菜單中的選項(xiàng)和點(diǎn)擊按鈕,命令程序執(zhí)行功能模塊。本章學(xué)習(xí)如何用Java語言編寫GUI程序,如何通過GUI實(shí)現(xiàn)輸入和輸出。5.1.1 AWT和Swing先前用Java編寫GUI程序,是使用抽象窗口工具包AWT(Abstract Windowing Toolkit,抽象窗口工具包)。現(xiàn)在多用Swing。Swing可以看作是AWT的改良版,而不是代替AWT,是對AWT的提高和擴(kuò)展。所以,在寫GUI程序時,Swing和AWT都有使用。它們共存于Java基礎(chǔ)類(Java Foundation Class,JFC)中。盡管AWT和Swing都提供了構(gòu)造圖形界面元素的類,但它們的重要方面有所不同:AWT依賴于主平臺繪制用戶界面組件;而Swing有自己的機(jī)制,在主平臺提供的窗口中繪制和管理界面組件。Swing與AWT之間的最明顯的區(qū)別是界面組件的外觀,AWT在不同平臺上運(yùn)行相同的程序,界面的外觀和風(fēng)格會有一些差異。然而,一個基于Swing的應(yīng)用程序可能在任何平臺上都會有相同的外觀和風(fēng)格。Swing中的類是從AWT繼承的,參見圖5.1。有些Swing類直接擴(kuò)展AWT中的對應(yīng)的類。例如,Japple、Jdialog、Jframe和Jwindow。JavaawtJavalangJWindowJDialogJFrameJComponentJAppletJavaxswingDialogWindowAppletPanelContainerComponentObjectFrame圖5-1 AWT和Swing的類層次結(jié)構(gòu)使用Swing設(shè)計(jì)圖形界面,主要引入兩個包:l JavaxSwing包含Swing的基本類;l JavaAwtevent包含與處理事件相關(guān)的接口和類。由于Swing太豐富,不可能在一本教科書中給出Swing的全面介紹,但本書所介紹的有關(guān)Swing的知識,已足以讓讀者編寫相當(dāng)精美的GUI程序。5.1.2 組件和容器組件(Component)是圖形界面的基本元素,用戶可以直接操作,例如按鈕。容器(Container)是圖形界面的復(fù)合元素,容器可以包含組件,例如面板。Java語言為每種組件都預(yù)定義類,程序通過它們或它們的子類創(chuàng)建各種組件對象。例如,Swing中預(yù)定義的按鈕類Jbutton是一種組件類,程序創(chuàng)建的Jbutton對象,或Jbutton子類的對象就是按鈕。Java語言也為每種容器預(yù)定義類,程序通過它們或它們的子類創(chuàng)建各種容器對象。例如,Swing中預(yù)定義的窗口類Jframe是一種容器類,程序創(chuàng)建的Jframe或Jframe子類的對象就是窗口。為了統(tǒng)一管理組件和容器,為所以組件類定義超類Component類,把組件的共有操作都定義在Component類中。同樣,為所有容器類定義超類Container類,把容器的共有操作都定義在Container類中。例如,Container類中定義了add()方法,大多數(shù)容器都可以用add()方法向容器添加組件。Component、Container和Graphic類是AWT庫中的關(guān)鍵字,其中Graphic類將在第7章中介紹。為能層次地構(gòu)造復(fù)雜的圖形界面,容器被當(dāng)作特殊的組件,可以把容器放入另一個容器這種。例如,把若干按鈕和文本框分放在兩個面板中,再把這兩個面板和另一些按鈕放入窗口中。這種層次地構(gòu)造界面的方法,能以增量的方法構(gòu)造復(fù)雜的用戶界面。圖5.2示意Swing提供的GUI組件類和容器類,以及它們之間的繼承關(guān)系。組件和容器從功能上可以粗分如下:JCheckBoxMenuItemJbuttonAbstractButtonJmenuJmenuItemJComboBoxJRadioButtonMenuItemJLabelJCheckBoxJToggleButtonJListJRadioButtonJProgressBarJMenuBarJComponentJPanelJPopupMenuJScrollBarJScrollPaneJTextAreaJSeparatorJTextFieldJTextComponentJPasswordField圖5.2 Swing類的層次結(jié)構(gòu)頂層容器:Jframe,Japplet,Jdialog,Jwindow。中間容器:Jpanel,JscrollPane,JSplitPane,JToolBar等。基本控件:JButton,JComboBox,JMenu,JTextField??删庉嫿M件:JColorChooser,JFileChooser,JTextArea。5.1.3 事件驅(qū)動程序設(shè)計(jì)基礎(chǔ)編寫事件驅(qū)動程序需要掌握以下幾個重要的概念。1. 事件、監(jiān)視器和監(jiān)視器注冊圖形界面上的事件是指在某個組件上發(fā)生用戶操作。例如,用戶單擊了界面上的某個按鈕,就說在這個按鈕上發(fā)生了事件,這個按鈕對象就是事件的擊發(fā)者。對事件作監(jiān)視的對象稱為監(jiān)視器,監(jiān)視器提供響應(yīng)事件的處理方法。為了讓監(jiān)視器與事件對象關(guān)聯(lián)起來,需要對事件對象作監(jiān)視器注冊,告訴系統(tǒng)事件對象的監(jiān)視器。以程序響應(yīng)按鈕事件為例,參見5.3.2節(jié)關(guān)于按鈕事件處理方法的介紹。程序要創(chuàng)建按鈕對象,把它添加到界面中,要為按鈕作監(jiān)視器注冊,程序要有響應(yīng)按鈕事件的方法。當(dāng)“單擊按鈕”事件發(fā)生時,系統(tǒng)就調(diào)用已為這個按鈕注冊的事件處理方法,完成處理按鈕事件的工作。2. 實(shí)現(xiàn)事件處理的途征Java語言編寫事件處理程序主要有兩種方案:一個是程序重設(shè)方法handleEvent(Event evt),采用這個方案的程序工作量稍大一些。另一個方案是程序?qū)崿F(xiàn)一些系統(tǒng)設(shè)定的接口。Java按事件類型提供多種接口,作為監(jiān)視器對象的類需要實(shí)現(xiàn)相應(yīng)的接口,即實(shí)現(xiàn)響應(yīng)事件的方法。當(dāng)事件方式時,系統(tǒng)內(nèi)設(shè)的handleEvent(Event evt)方法就自動調(diào)用監(jiān)視器的類實(shí)現(xiàn)的響應(yīng)事件的方法。Javaawtevent包中用來檢測并對事件做出反應(yīng)的模型包括以下三個組成元素:(1) 源對象:事件“發(fā)生”在這個組件上,它與一組“偵聽”該事件的對象保存著聯(lián)系。(2) 監(jiān)視器對象:是一個實(shí)現(xiàn)預(yù)定義的接口的類的一個對象,該對象的類要提供對發(fā)生的事件作處理的方法。(3) 事件對象:它包含描述當(dāng)事件發(fā)生時從源傳遞給監(jiān)視器的特定事件的信息。一個事件驅(qū)動程序要做的工作除創(chuàng)建源對象和監(jiān)視器對象之外,還必須安排監(jiān)視器了解源對象,或向源對象注冊監(jiān)視器。每個源對象有一個已注冊的監(jiān)視器列表,提供一個方法能向該列表添加監(jiān)視器對象。只有在源對象注冊了監(jiān)視器之后,系統(tǒng)才會將源對象上發(fā)生的事件通知監(jiān)視器對象。3. 事件類型和監(jiān)視器接口在Java語言中,為了方便系統(tǒng)管理事件,也為了便于程序作監(jiān)視器注冊,系統(tǒng)將事件分類,稱為事件類型。系統(tǒng)為每個事件類型提供一個接口。要作為監(jiān)視器對象的類必須實(shí)現(xiàn)相應(yīng)的接口,提供接口規(guī)定的響應(yīng)事件的方法。再以程序響應(yīng)按鈕事件為例,Jbutton類的對象button可以是一個事件的激發(fā)者。當(dāng)用戶點(diǎn)擊用戶界面中與button對應(yīng)的按鈕時,button對象就會產(chǎn)生一個ActionEvent類型的事件。如果監(jiān)視器對象是obj,對象obj的類是Obj,則類Obj必須實(shí)現(xiàn)AWT中的ActionListener接口,實(shí)現(xiàn)監(jiān)視按鈕事件的actionPerformed方法。Button對象必須用addActionListener方法注冊它的監(jiān)視器對象obj。程序運(yùn)行時,當(dāng)用戶點(diǎn)擊button對象對應(yīng)的按鈕時,系統(tǒng)就將一個ActionEvent對象從事件激發(fā)對象傳遞到監(jiān)視器。ActionEvent對象包含的信息包括事件發(fā)生在哪一個按鈕,以及有關(guān)該事件的其它信息。表5-1給出有一定代表性的事件類型和產(chǎn)生這些事件的部分Swing組件。實(shí)際事件發(fā)生時,通常會產(chǎn)生一系列的事件,例如,用戶點(diǎn)擊按鈕,會產(chǎn)生ChangeEvent事件提示光標(biāo)到了按鈕上,接著又是一個ChangeEvent事件表示鼠標(biāo)被按下,然后是ActionEvent事件表示鼠標(biāo)已松開,但光標(biāo)依舊在按鈕上,最后是ChangeEvent事件,表示光標(biāo)已離開按鈕。但是應(yīng)用程序通常只處理按下按鈕的完整動作的單個ActionEvent事件。表5-1 組件和事件類型事件類型組 件描 述ActionEventJbutton、JcheekBox點(diǎn)擊、選項(xiàng)或選擇JcomboBox、JmenuItemJradioButtonChangeEventJslider調(diào)整一個可移動元素的位置ItemEventJcomboBox、JcheckBox從一組可選方案中JradioButtonJradioButtonMenuItem選擇一個項(xiàng)目JcheckBoxMenuItemKeyEventJcomponent及其派生類操縱鼠標(biāo)或鍵盤MouseEventCareEventJtextArea、JtextField選擇和編輯文本W(wǎng)indowEventWindow及其派生類對窗口打開、關(guān)閉和圖標(biāo)化每個事件類型都有一個相應(yīng)的監(jiān)視器接口,表5-2列出了每個接口的方法。實(shí)現(xiàn)監(jiān)視器接口的類必須實(shí)現(xiàn)所有定義在接口中的方法。表5-2 監(jiān)視器接口方法監(jiān)視器接口方 法ActionListeneractionPerformedChangeListenerstateChangedFocusListenerFocusGained、focusLostItemListenerItemStateChangedKeyListenerkeyPressed,keyReleased,keyTypedCareListenercareUpdateMouseListenermouseClicked,mouseExited,mousePresed,mouseReleased,MouseMotionListenermouseDragged,mouseMovedWindowListenerwindowClosed,windowClosing,windowDeactivated,windowDeiconified,windowIconified,windowOpened事件驅(qū)動程序的實(shí)際例子請參見以后各小節(jié)含事件處理的實(shí)際程序。5.2 框架窗口窗口是GUI編程的基礎(chǔ),小應(yīng)用程序或圖形界面的應(yīng)用程序的可視組件都放在窗口中。在GUI中,窗口是用戶屏幕的一部分,起著在屏幕中一個小屏幕的作用。有以下三種窗口:(1) Applet窗口,Applet類管理這個窗口,當(dāng)小應(yīng)用程序啟動時,由系統(tǒng)創(chuàng)建和處理。(2) 框架窗口(JFrame),這是通常意義上的窗口,它支持窗口周邊的框架、標(biāo)題欄,以及最小化、最大化和關(guān)閉按鈕。(3) 一種無邊框窗口(JWindow),沒有標(biāo)題欄,沒有框架,只是一個空的矩形。用Swing中的Jframe類或它的子類創(chuàng)建的對象就是Jframe窗口。JFrame類的主要構(gòu)造方法: JFrame(),創(chuàng)建無標(biāo)題的窗口對象。 JFrame(String s),創(chuàng)建一個標(biāo)題名是字符串s的窗口對象。Jframe類的其它常用方法: setBounds(int x,int y,int width,int height),參數(shù)x,y指定窗口出現(xiàn)在屏幕的位置;參數(shù)width,height指定窗口的寬度和高度。單位是像素。 setSize(int width,int height),設(shè)置窗口的大小,參數(shù)width,height指定窗口的寬度和高度,單位是像素。 setBackground(Color c),以參數(shù)c設(shè)置窗口的背景顏色。 setVisible(boolean b),參數(shù)b設(shè)置窗口是可見或不可見。 pack(),用緊湊方式顯示窗口。如果不使用該方法,窗口初始出現(xiàn)時可能看不到窗口中的組件,當(dāng)用戶調(diào)整窗口的大小時,可能才能看到這些組件。 setTitle(String name),以參數(shù)name設(shè)置窗口的名字。 getTitle(),獲取窗口的名字。 setResizable(boolean m),設(shè)置當(dāng)前窗口是否可調(diào)整大小(默認(rèn)可調(diào)整大?。W⒁猓篠wing里的容器都可以添加組件,除了Jpanel及其子類(如Japplet)之外,其它的Swing容器不允許把組件直接加入。其它容器添加組件有兩種方法:(1) 用getContentPane()方法獲得內(nèi)容面板,再將組件加入。例如,例5.1程序中的代碼:mw. getContentPane().add(button);該代碼的意義是獲得容器的內(nèi)容面板,并將按鈕button添加到這個內(nèi)容面板中。(2) 建立一個Jpanel對象的中間容器,把組件添加到這個容器中,再利用setContentPane()把這個容器置為內(nèi)容面板。例如,代碼:Jpanel contentPane=new Jpanel;/創(chuàng)建面板mw.setContentPane(ContentPane);/把一些組件添加到contentPane中以上代碼把ContentPane置成內(nèi)容面板。【例5.1】用JFrame類創(chuàng)建窗口的Java應(yīng)用程序。窗口只有一個按鈕,參見圖5.3。程序的第一行代碼指明程序使用Swing庫。在main()方法中,對象mw是一個JFrame對象,一個JFrame對象是一個很簡單的窗口,它有標(biāo)題,有窗口關(guān)閉按鈕等。下一行代碼是設(shè)定窗口的大小,接著是創(chuàng)建一個按鈕對象。下一行的代碼略為復(fù)雜,其作用是將按鈕對象添加到窗口mw上,參見5.3節(jié)。方法setContentPane()是JFrame類的方法,獲取窗口的內(nèi)容面板ContentPane。每個JFrame對象都有一個放置窗口組件的內(nèi)容面板。通常不是將窗口的組件直接加到JFrame中,而是添加到它的內(nèi)容面板中。所以代碼mw. getContentPane().add(button)是獲得窗口mw的內(nèi)容面板,并將按鈕添加在這個內(nèi)容面板上。最后一行代碼使窗口mw在屏幕上可見,沒有這一行代碼,或用代碼mw.setVisible(false)將使窗口不可見。圖5.3package Example5pack;import javax.swing.*;public class Example5_1創(chuàng)建一個窗口容器對象。public static void main(String args)設(shè)定窗口的寬度和窗口的高,單位是像素JFrame mw=new JFrame(我的第一個窗口);mw.setSize(250, 200);JButton button=new JButton(我是一個按鈕);mw.getContentPane().add(button);mw.setVisible(true);獲得窗口的內(nèi)容面板,并將按鈕添加在這個內(nèi)容面板中用Swing編寫GUI程序時,通常不直接用JFrame創(chuàng)建窗口對象,而用JFrame派生的子類創(chuàng)建窗口對象,在子類中可以加入窗口的特定要求和特別的內(nèi)容等。【例5.2】定義JFrame派生的子類MyWindowDemo創(chuàng)建JFrame窗口。類MyWindowDemo的構(gòu)造方法有5個參數(shù):窗口標(biāo)題名,加入窗口的組件,窗口的背景顏色以及窗口的高度和寬度。在主方法中,利用類MyWindowDemo創(chuàng)建兩個類似的窗口。package Example5pack;import javax.swing.*;import java.awt.*;import java.awt.event.*;public class Example5_2public static MyWindowDemo mw1;public static MyWindowDemo mw2;public static void main(String args)JButton butt1 = new JButton(我是一個按鈕);String name1 = 我是第一個窗口;String name2 = 我是第二個窗口;mw1=new MyWindowDemo(name1,butt1,Color.BLUE,350,450);mw1.setVisible(true);JButton butt2 = new JButton(我是另一個按鈕);mw2=new MyWindowDemo(name2,butt2,Color.magenta,300,400);mw2.setVisible(true);class MyWindowDemo extends JFramepublic MyWindowDemo(String name,JButton button,Color c,int w,int h)獲得窗口內(nèi)容面板super();setTitle(name);setSize(w,h);Container contentPane=getContentPane();將按鈕添加在內(nèi)容面板中contentPane.add(button);contentPane.setBackground(c);設(shè)置背景顏色顯示顏色由java.awt包的color類管理,在Color類中預(yù)定義了一些常用的顏色,參見表7-1。JFrame類的部分常用方法參見表5-3。表5-3 JFrame類的部分常用方法方法意義JFrame()構(gòu)造方法,創(chuàng)建一個JFrame對象JFrame(String title)創(chuàng)建一個以title為標(biāo)題的JFrame對象add()從父類繼承的方法,向窗口添加窗口元素void addWindowListener(WindowListener ear)注冊監(jiān)視器,監(jiān)聽由JFrame對象擊發(fā)的事件Container getContentPane()返回JFrame對象的內(nèi)容面板void setBackground(Color c)設(shè)置背景色為cvoid setForeground(Color c)設(shè)置前景色為cvoid setSize(int w,int h)設(shè)置窗口的寬為w,高為hvoid setTitle(String title)設(shè)置窗口標(biāo)題void setVisible(boolean)設(shè)置窗口的可見性,true可見,false不可見5.3 標(biāo)簽、按鈕和按鈕事件標(biāo)簽和按鈕也許是圖形界面中最常見的兩種,按鈕又總是與激發(fā)動作事件有關(guān)。5.3.1 標(biāo)簽標(biāo)簽(JLabel)是最簡單的Swing組件。標(biāo)簽對象的作用是對位于其后的界面組件作聲明。可以設(shè)置標(biāo)簽的屬性,即其前景顏色、背景顏色、字體等等,但不能動態(tài)地編輯標(biāo)簽中的文本。程序關(guān)于標(biāo)簽的基本內(nèi)容有以下幾個方面:(1) 聲明一個標(biāo)簽名(2) 創(chuàng)建一個標(biāo)簽對象(3) 將標(biāo)簽對象加入到某個容器Jlabel類的主要構(gòu)造方法是:(1) JLabel(),構(gòu)造一個顯示文字的標(biāo)簽。(2) Jlabel(String s),構(gòu)造一個顯示文字為s的標(biāo)簽。(3) JLabel(String s,int align),構(gòu)造一個顯示文字為s的標(biāo)簽。Align為顯示文字的水平對齊方式。對齊方式有三種,以下三個常量分別表示顯示文字左對齊、中心對齊和右對齊。Jlabel.LEFT、Jlabel.CENTER、Jlabel.RIGHTJLabel類的其他常用方法是:(1) srtText(String s),設(shè)置標(biāo)簽顯示文字。(2) getText(),獲取標(biāo)簽顯示文字。(3) setBackground(Color c),設(shè)置標(biāo)簽的背景顏色,標(biāo)簽的默認(rèn)背景顏色是容器的背景顏色。(4) setForeground(color c),設(shè)置標(biāo)簽的前景顏色,默認(rèn)顏色是黑色。5.3.2 按鈕按鈕(JButton)在界面設(shè)計(jì)中用于激發(fā)動作事件。按鈕可顯示文本,當(dāng)按鈕被激活時(鼠標(biāo)點(diǎn)擊),能激發(fā)動作事件。JButton類的常用構(gòu)造方法:(1) Jbutton(),創(chuàng)建一個沒有標(biāo)題的按鈕對象。(2) Jbutton(String s),創(chuàng)建一個標(biāo)題為s的按鈕對象。JButton類的其他常用方法:(1) setLabel(),設(shè)置按鈕的標(biāo)題文字。(2) getLabel(String s),獲取按鈕的標(biāo)題文字。(3) setMnemonic(char mnemonic),設(shè)置熱鍵。(4) setToolTipText(String s),設(shè)置提示文字。(5) setEnabled(boolean b),設(shè)置是否響應(yīng)事件。(6) setRolloverEnabled(boolean aL),設(shè)置是否滾動。(7) addActionListener(ActionEvent aL),向按鈕添加動作監(jiān)視器。(8) removeActionListener(ActionListener aL),移去按鈕的監(jiān)視器。按鈕處理程序的基本內(nèi)容有以下幾個方面:(1) 與按鈕動作事件相關(guān)的接口是ActionListener。給出實(shí)現(xiàn)該接口的類的定義。(2) 聲明一個按鈕名。(3) 創(chuàng)建一個按鈕對象。(4) 將按鈕對象加入某個容器。(5) 為需要控制的按鈕對象注冊監(jiān)視器,對在這個按鈕上產(chǎn)生的事件實(shí)施監(jiān)聽。如果是按鈕對象所在的類實(shí)現(xiàn)監(jiān)視接口,注冊監(jiān)視器的代碼形式是:addActionListener(this);參見例5.3。如果是別的類A的對象a作為監(jiān)視器,類A必須實(shí)現(xiàn)ActionListener接口,完成監(jiān)視器注冊需用以下形式的兩行代碼:A a=new A();/創(chuàng)建類A的實(shí)例aaddActionListener(a);/用對象a作為監(jiān)視器對事件進(jìn)行監(jiān)視(6) 在實(shí)現(xiàn)接口ActionListener的類中,給出處理事件的方法的定義:public void actionPerformed(ActionEvent e)。在處理事件的方法中,用獲得事件源信息的方法獲得事件源信息,并判斷和完成相應(yīng)處理。獲得事件源的方法有:方法getSource()獲得事件源對象;方法getActionCommand()獲得事件源按鈕的文字信息?!纠?.3】處理按鈕事件實(shí)例。應(yīng)用程序定義了一個窗口,窗口內(nèi)設(shè)置了兩個按鈕,當(dāng)點(diǎn)擊Red按鈕時,窗口的背景色設(shè)置成紅色;點(diǎn)擊Green按鈕時,窗口的背景色置成綠色。參見圖5.4。import javax.swing.*;import java.awt.*;import java.awt.event.*;創(chuàng)建一個窗口public class Example5_1 public static void main(String args)給出實(shí)現(xiàn)(定義)該接口的類的定義。處理事件的方法要包含到這個接口類中。ButtonDemo myButtonGUI=new ButtonDemo();myButtonGUI.setVisible(true);class ButtonDemo extends JFrame implements ActionListenerpublic static final int Width =250;public static final int Height=200;獲取窗口對象“ButtonDemo”的內(nèi)容面板,并給該內(nèi)容面板起一個名字“conPan”。ButtonDemo()String qq=按鈕事件樣例;setSize(Width,Height);setTitle(qq);Container conPane=getContentPane();conPane.setBackground(Color.BLUE);采用FlowLayout布局conPane.setLayout(new FlowLayout();給Red按鈕注冊監(jiān)視器(監(jiān)聽者)JButton redBut=new JButton(Red);redBut.addActionListener(this);把按鈕添加到內(nèi)容面板中,conPane.add(redBut);JButton greenBut=new JButton(Green);實(shí)現(xiàn)(定義)接口處理事件的方法greenBut.addActionListener(this);conPane.add(greenBut);public void actionPerformed(ActionEvent e)Container conPane=getContentPane();if(e.getActionCommand().equals(Red)conPane.setBackground(Color.red);elseif(e.getActionCommand().equals(Green)conPane.setBackground(Color.GREEN);else 圖5.4 例5.3程序界面用鼠標(biāo)點(diǎn)擊按鈕產(chǎn)生事件對象,將事件送達(dá)監(jiān)視器對象,這個過程稱為激發(fā)事件。當(dāng)一個事件被送到監(jiān)視器對象時,監(jiān)視器對象實(shí)現(xiàn)的接口方法被調(diào)用,調(diào)用時系統(tǒng)會提供事件對象的參數(shù)。程序中雖然沒有調(diào)用監(jiān)視器方法的代碼,但是程序做了兩件事:第一,指定哪一個對象是監(jiān)視器,它將響應(yīng)由按鈕激發(fā)的事件,這個步驟稱為監(jiān)視器注冊。第二,必須定義一個方法,當(dāng)事件送到監(jiān)視器時,這個方法被調(diào)用。程序中沒有調(diào)用這個方法的代碼,這個調(diào)用是系統(tǒng)執(zhí)行的。在上面的程序中,代碼redBut.addActionListener(this);注冊this作為redBut按鈕的監(jiān)視器,隨后的代碼也注冊this作為greenBut按鈕的監(jiān)視器。在上述程序中,this就是當(dāng)前的ButtonDemo類的對象myButtonGUI。這樣,ButtonDemo類就是監(jiān)視器對象的類,對象myButtonGUI作為兩個按鈕的監(jiān)視器。在類ButtonDemo中有監(jiān)視器方法的實(shí)現(xiàn)。當(dāng)一個按鈕被點(diǎn)擊時,系統(tǒng)以事件的激發(fā)者為參數(shù),自動調(diào)用方法actionPerformed()組件不同,激發(fā)的事件種類也不同,監(jiān)視器類的種類也不同。按鈕激發(fā)的事件稱為action事件,相應(yīng)的監(jiān)視器稱為action監(jiān)視器。一個action監(jiān)視器對象的類型為ActionListener,類要實(shí)現(xiàn)ActionListener接口。程序體現(xiàn)這些內(nèi)容需要做的兩點(diǎn):(1) 在類定義的首行接上代碼implements ActionListener;(2) 類內(nèi)定義方法actionPerformed()。前面程序中的類ButtonDemo正確地做到了這兩點(diǎn)。每個界面元素當(dāng)激發(fā)事件時,都有一個字符串與這個事件相對應(yīng),這個字符串稱為action命令。用代碼e.getActionCommand()就能獲取action事件參數(shù)e的命令字符串,據(jù)此,方法actionPerformed()就能知道是哪一個激發(fā)的事件。在默認(rèn)情況下,按鈕的命令字符串就是按鈕上的文字。如有必要可以用方法setActionCommand()為界面組件設(shè)置命令字符串。5.4 面板面板有兩種,一種是普通面板JPanel,另一種是滾動面板JscrollPane。5.4.1 JPanel面板(JPanel)是一種通用容器,JPanel的作用是實(shí)現(xiàn)界面的層次結(jié)構(gòu),在它上面可以放置一些組件,也可以在上面繪畫,將放有組件和有畫的JPanel再放入另一個容器里。JPanel的默認(rèn)布局為FlowLayout。面板處理程序的基本內(nèi)容有以下幾個方面:(1) 通過繼承聲明JPanel類的子類,子類中有一些組件,并在構(gòu)造方法中將組件加入面板。(2) 聲明JPanel子類對象。(3) 創(chuàng)建JPanel子類對象(4) 將JPanel子類對象加入到某個容器。JPanel類的常用構(gòu)造方法有:(1) JPanel(),創(chuàng)建一個JPanel對象。(2) JPanel(LayoutManager layout),創(chuàng)建JPanel對象時指定布局layout。JPanel對象條件組件的方法:(1) add(組件),添加組件。(2) add(字符串,組件),當(dāng)面板采用CordLayout布局時,字符串是引用添加組件的代碼。【例5.4】小應(yīng)用程序有兩個JPanel子類對象和一個按鈕。每個JPanel子類對象又有兩個按鈕和一個標(biāo)簽。參見圖5.5。import java.applet.*;import javax.swing.*;class MyPanel extends JPanelJButton button1,button2;JLabel label;MyPanel(String s1,String s2,String s3)button1=new JButton(s1);button2=new JButton(s2);label=new JLabel(s3);add(button1);add(button2);add(label);public class Example5_4 extends AppletMyPanel panel1,panel2;JButton button;public void init()panel1=new MyPanel(確定,取消,標(biāo)簽,我們在面板1中);panel2=new MyPanel(確定,取消,標(biāo)簽,我們在面板2中);button=new JButton(我是不在面板中的按鈕);add(panel1);add(panel2);add(button);setSize(300,200);圖5.5 例5.4程序的界面5.4.2 JScrollPane當(dāng)一個容器內(nèi)放置了許多組件,而容器的顯示區(qū)域不足以同時顯示所有組件時,如果讓容器帶滾動條,通過移動滾動條的滑塊,容器中其他位置上的組件就能看到。滾動面板JscrollPane就能實(shí)現(xiàn)這樣的要求,JscrollPane是帶有滾動條的面板。JscrollPane是Container類的子類,也是一種容器,但是只能添加一個組件。JscrollPane的一般用法是先將一些組件添加到一個JPanel中,然后再把這個JPanel添加到JscrollPane中。這樣,從界面上看,在滾動面板上,好像也有多個組件。在Swing中,像JTextArea、Jlist、JTable等組件都沒有自帶滾動條,都需要將它們放置于滾動面板,利用滾動面板的滾動條瀏覽組件中的內(nèi)容。JscrollPane類構(gòu)造方法有:(1) JScrollPane(),先創(chuàng)建JScrollPane對象,然后再用方法setViewPortView(component com)為滾動面板對象放置組件對象。(2) JScrollPane(Component com),創(chuàng)建JScrollPane對象,參數(shù)com是要放置于JScrollPane對象的組件對象。為JScrollPane對象指定了顯示對象之后,再用add()方法將JScrollPane對象放置于窗口中。JScrollPane對象設(shè)置滾動條的方法是:(1) setHorizontalScrollBarPolicy(int policy),設(shè)置水平滾動條。policy取下列3個值之一:JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS,水平滾動條總是可見。JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED,水平滾動條需要時才顯示。JScrollPane.HORIZONTAL_SCROLLBAR_NEVEN,水平滾動條總是不可見。(2) setVerticalScrollBarPolicy(int policy),設(shè)置垂直滾動條。policy取下列3個值之一:JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,水平滾動條總是可見。JScrollPane.VERTICAL _SCROLLBAR_AS_NEEDED,水平滾動條需要時才顯示。JScrollPane. VERTICAL _SCROLLBAR_NEVEN,水平滾動條總是不可見。以下代碼將文本區(qū)放置于滾動面板,滑動滾動面板的滾動條能瀏覽文本區(qū)(參見5.6.2):JTextArea textA=new JTextArea(20,30);JScrollPane jsp=new JScrollPane(textA);getContentPane().add(jsp); /將含文本區(qū)的滾動面板加入到當(dāng)前窗口中進(jìn)一步的程序例子見例5.6。5.5 布局設(shè)計(jì)在界面設(shè)計(jì)中,一個容器要放置許多組件,為了美觀,為組件安排在容器中的位置,這就是布局設(shè)計(jì)。Java.awt中定義了多種布局類,每種布局類對應(yīng)一種布局的策略。常用的有以下布局類:FlowLayout,依次放置組件。BorderLayout,將組件放置在邊界上。CardLayout,將組件像撲克牌一樣疊放,而每次只能顯示其中一個組件。GridLayout,將顯示區(qū)域按行、列劃分成一個個大小相等的格子,組件依次放入這些格子中。GridBagLayout,將顯示區(qū)域劃分成許多矩形小單元,每個組件可占用一個或多個小單元。其中GridBagLayout能進(jìn)行精細(xì)的位置控制,也最復(fù)雜,本書不討論這種布局策略。每個容器都有一個布局管理器,由它來決定如何安排放入容器內(nèi)的組件。布局管理器是實(shí)現(xiàn)LayoutManager接口的類。5.5.1 FlowLayout布局FlowLayout布局是將其中的組件按照加入的先后順序從左到右排列,一行排滿之后就轉(zhuǎn)到下一行繼續(xù)從左到右排列,每一行中的組件都居中排列。這是一種最簡單的布局策略,一般用于組件不多的情況,當(dāng)組件較多時,容器中的組件就會顯得高低不平,各行長短不一。FlowLayout布局是小應(yīng)用程序和面板的默認(rèn)布局。FlowLayout布局的構(gòu)造方法有:(1) FlowLayout(),生成一個默認(rèn)的FlowLayout布局。默認(rèn)情況下,組件居中,間隙為5個像素。(2) FlowLayout(int alignment),設(shè)定每一行的組件的對齊方式。alignment取值可以為:FlowLayout.LEFT,F(xiàn)lowLayout.RIGHT, FlowLayout.CENTER。(3) FlowLayout(int alignment,int horz,int wert),設(shè)定對齊方式,并設(shè)定組件的水平間距horz和垂直間距vert。用超類Container的方法setLayout()為容量設(shè)定布局。例如,代碼setLayout(new FlowLayout()為容器設(shè)定FlowLayout布局。將組件加入容器的方法是add(組件名)。5.5.2 BorderLayout布局BorderLayout布局策略是把容器內(nèi)的空間簡單地劃分為東“East”、西“West”、南“South”、北“North”、中“Center”五個區(qū)域。加入組件時,都應(yīng)該指明把組件放在哪一個區(qū)域中。一個位置放一個組件。如果某個位置要加入多個組件,應(yīng)先將要加入該位置的組件放入另一個容器中,然后再將這個容器加入到這個位置。BorderLayout布局的構(gòu)造方法有:(1) BorderLayout(),生成一個默認(rèn)的BorderLayout布局。默認(rèn)情況下,沒有間隙。(2) BorderLayout(int horz,int wert),設(shè)定組件之間的水平間距horz和垂直間距wert。BorderLayout布局策略的設(shè)定方法是setLayout(new BorderLayout()。將組件加入到容器的方法是add(組件名,位置),如果加入組件時沒有指定位置,則默認(rèn)為“中”位置。BorderLayout布局是JWindow、JFrame和JDialog的默認(rèn)布局?!纠?.5】應(yīng)用程序設(shè)有五個標(biāo)簽、分別放于窗口的東、西、南、北和中五個區(qū)域。參見圖5.6。import javax.swing.*;import java.awt.*;public class Example5_5public static void main(String args)JLabel label1,label2,label3,label4,label5;JFrame mw=new JFrame(我是一個窗口);mw.setSize(250,200);Container con=mw.getContentPane();con.setLayout(new BorderLayout();label1=new JLabel(東標(biāo)簽);label2=new JLabel(南標(biāo)簽,JLabel.CENTER);label3=new JLabel(西標(biāo)簽);label4=new JLabel(北標(biāo)簽,JLabel.CENTER);label5=new JLabel(中標(biāo)簽,JLabel.CENTER);con.add(label1,East);圖5.6 例5.5程序界面con.add(label2,South);con.add(label3,West);con.add(label4,North);con.add(label5,Center);mw.setVisible(true);5.5.3 GridLayout布局GridLayout布局是把容器劃分成若干行和列的網(wǎng)格,行數(shù)和列數(shù)由程序控制,組件放在網(wǎng)格的小格子中。GridLayout布局的特點(diǎn)是組件定位比較精確。由于GridLayout布局中每個網(wǎng)格具有相同形狀和大小,要求放入容器的組件也應(yīng)保存相同的大小。GridLayout布局的構(gòu)造方法有:(1) GridLayout(),生成一個單列的GridLayout布局。默認(rèn)情況下,無間隙。(2) GridLayout(int row,int col),設(shè)定一個有行row和列col的GridLayout布局。(3) GridLayout(int row,int col,int horz,int wert),設(shè)定布局的行數(shù)和列數(shù)、組件的水平間距horz和垂直間距vert。GridLayout布局以行為基準(zhǔn),當(dāng)放置的組件個數(shù)超額時,自動增加列;反之,組件太少也會自動減少列,組件按行優(yōu)先順序排列。GridLayout布局的每個網(wǎng)格都必須填入組件,如果希望某個網(wǎng)格為空白,可以用一個空白標(biāo)簽(add(new Label()頂替?!纠?.6】小應(yīng)用程序先將若干個按鈕和若干個標(biāo)簽放入JPanel中,然后將JPanel放入JScrollPane中,最后,將JScrollPane放入小程序的窗口中。程序所創(chuàng)建的JScrollPane總是帶水平和垂直滾動條,滾動面板的可視范圍小于面板的實(shí)際要求,可以移動滾動條的滑塊顯示面板原先不在可視范圍內(nèi)的區(qū)域。參見圖5.7。import java.applet.*;import javax.swing.*;import java.awt.*;class MyWindow extends JFramepublic MyWindow(int w,int h)setTitle(滾動面板實(shí)例);Container con=getContentPane();con.setPreferredSize(new Dimension(w,h);con.setLayout(new BorderLayout();JPanel p=new JPanel();p.setLayout(new
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 礦物在熱交換器材料中的應(yīng)用考核試卷
- 紙制品行業(yè)品牌價值評估方法探討考核試卷
- 外貿(mào)英語函電module8
- 探秘化學(xué)反應(yīng)
- 塑造未來的高二之路
- 外貿(mào)英文函電課件unit9
- 婁底市重點(diǎn)中學(xué)2024-2025學(xué)年高三歷史試題一模歷史試題試卷含解析
- 汕頭大學(xué)《古生物地史學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古自治區(qū)興安盟烏蘭浩特市第十三中學(xué)2025年初三1月階段性測試數(shù)學(xué)試題文試題含解析
- 江西師大附中2025年高三第二次模擬考試卷歷史試題含解析
- 全國防災(zāi)減災(zāi)日宣傳課件
- 2025阿里地區(qū)普蘭縣輔警考試試卷真題
- 青年紀(jì)律教育課件:共青團(tuán)紀(jì)律條例解讀與實(shí)踐
- 2025鄂爾多斯準(zhǔn)格爾旗事業(yè)單位引進(jìn)40名高層次人才和急需緊缺專業(yè)人才筆試備考試題及答案解析
- 銀行領(lǐng)導(dǎo)力培養(yǎng)試題及答案
- 中醫(yī)養(yǎng)生館運(yùn)營方案中醫(yī)養(yǎng)生館策劃書
- 醫(yī)療社工筆試題及答案
- 新時期統(tǒng)戰(zhàn)知識課件
- 【MOOC】理解馬克思-南京大學(xué) 中國大學(xué)慕課MOOC答案
- 傳統(tǒng)園林技藝智慧樹知到期末考試答案章節(jié)答案2024年華南農(nóng)業(yè)大學(xué)
- JGT266-2011 泡沫混凝土標(biāo)準(zhǔn)規(guī)范
評論
0/150
提交評論