第7章 圖形用戶界面
《第7章 圖形用戶界面》由會(huì)員分享,可在線閱讀,更多相關(guān)《第7章 圖形用戶界面(68頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第7章 圖形用戶界面 圖形用戶界面(Graphics User Interface, GUI),是指用圖形的方式實(shí)現(xiàn)用戶與計(jì)算機(jī)之間的交互。它通過(guò)圖形的方式,借助菜單、按鈕等標(biāo)準(zhǔn)界面元素和鼠標(biāo)操作,幫助用戶方便地向計(jì)算機(jī)發(fā)出命令,啟動(dòng)程序,并將程序的運(yùn)行結(jié)果同樣以圖形的形式顯示給用戶。 GUI通常由GUI組件(有時(shí)稱為控件或窗口小部件)構(gòu)成。GUI組件是用戶通過(guò)鼠標(biāo)、鍵盤或其它諸如聲音識(shí)別等輸入形式與應(yīng)用程序進(jìn)行交互的對(duì)象。學(xué)習(xí)Java的GUI設(shè)計(jì)就必須了解幾個(gè)概念:容器、組件、容器布局、事件處理機(jī)制。本章將通過(guò)實(shí)例剖析Swing常用組件的功能、如何在組件中繪圖、各種事件的應(yīng)用、以及各
2、種布局的設(shè)置等問(wèn)題。 7.1 Java GUI概述 隨著JDK1.2(現(xiàn)改名為Java 2)的發(fā)布,Java的API有兩套完整的按鈕、菜單、文本域以及其它GUI組件:抽象窗口工具集(Abstract Window Toolkit ,AWT)和Swing組件集。AWT從JDK1.0開始就是Java的一部分,由AWT擴(kuò)展而來(lái)的Swing組件集,是Java1.2引入的新的GUI組件庫(kù)。二者均包括在JFC(Java Foundation Classes,Java基礎(chǔ)類)中,JFC是一組支持在流行平臺(tái)的客戶端應(yīng)用程序中創(chuàng)建GUI和圖形功能的Java類庫(kù),作為J2SE的一個(gè)有機(jī)部分,主要包含五
3、個(gè)部分,即AWT、Java2D、Accessibility、Drag&Drop、Swing,它是一套幫助開發(fā)人員設(shè)計(jì)復(fù)雜應(yīng)用程序的開發(fā)包。 7.1.1 AWT與Swing AWT是Java2版本之前的Java平臺(tái)提供的一套圖形用戶界面組件類型。AWT庫(kù)最重要的特征之一是,它與運(yùn)行Java程序的計(jì)算機(jī)窗口系統(tǒng)(經(jīng)常被稱作本地窗口系統(tǒng),native windowing system)底層相結(jié)合。AWT組件建立在對(duì)等模型(peer model)的基礎(chǔ)上。每個(gè)AWT組件有一個(gè)相應(yīng)的用本地系統(tǒng)的代碼編寫的對(duì)等類,對(duì)等類充當(dāng)Java代碼與本地窗口系統(tǒng)之間的接口,對(duì)等類里的方法是用本地代碼編寫的
4、。例如,若要顯示Button類型的對(duì)象時(shí),需用java.awt.Button類,它有一個(gè)名為java.awt.peer.Button的對(duì)等類,在運(yùn)行微軟的Windows 操作系統(tǒng)的計(jì)算機(jī)上,該Button對(duì)象將具有與其它Windows應(yīng)用程序相同的外觀和感覺;同樣,在運(yùn)行Apple公司的Mac OS操作系統(tǒng)的計(jì)算機(jī)上,該Button對(duì)象將具有與其它Macintosh應(yīng)用程序相同的外觀和感覺。因此,AWT組件天生就是平臺(tái)相關(guān)的,AWT組件被認(rèn)為是重量級(jí)組件,它們直接映射到本地組件,需要由本地窗口系統(tǒng)提供資源。 注意:本地方法封裝了用非Java語(yǔ)言(通常是C或者C++)編寫的代碼的調(diào)用,使JVM
5、的功能獲得擴(kuò)展。 Swing組件從根本上來(lái)說(shuō)建立在AWT上,它的四個(gè)頂層的窗口類(JApplet, JDialog, JFrame與JWindow)是由AWT重量級(jí)組件派生而來(lái),如圖7.1所示。它們本身也依賴于本地窗口,除此以外,所有Swing組件都是輕量級(jí)組件。Swing的一個(gè)顯著特點(diǎn)是用Swing實(shí)現(xiàn)的圖形界面外觀可以按需更換,而無(wú)需重寫任何代碼。這就讓Swing程序能自動(dòng)適應(yīng)于它所運(yùn)行的計(jì)算機(jī)的常規(guī)風(fēng)格和外觀,不需要程序員為特定的計(jì)算機(jī)開發(fā)特定的界面。事實(shí)上,這些外觀不限于常見的幾種機(jī)器,Swing可以開發(fā)新的外觀風(fēng)格。Swing中內(nèi)置了幾個(gè)觀感包。例如,javax.swing.pla
6、f.motif包里有實(shí)現(xiàn)Motif界面的類。Motif界面是一種常用的基于UNIX的界面。這些類知道如何畫出每個(gè)組件,也知道如何響應(yīng)鼠標(biāo)、鍵盤以及其它和這些組件聯(lián)系在一起的事件。javax.swing.plaf.windows包則負(fù)責(zé)實(shí)現(xiàn)Windows風(fēng)格的界面。Java缺省的設(shè)計(jì)風(fēng)格是“Java外觀”(被稱為“Metal”),它獨(dú)立于任何一種窗口系統(tǒng)的Java外觀。 圖7.1 AWT與Swing頂層窗口類之間的關(guān)系 Swing改善了AWT包沒(méi)有彈性、缺乏效率的缺點(diǎn),提供了更豐富的視覺感受,人們?cè)絹?lái)越多地使用Swing組件構(gòu)建圖形用戶界面,在本書中給出的有關(guān)GUI程序中均使用Swing
7、組件。 7.1.2 Swing組件 輕量級(jí)組件不是依靠本地組件來(lái)支持它的顯示,而是完全由Java代碼來(lái)繪制并顯示。Swing平臺(tái)無(wú)關(guān)的觀感,是通過(guò)把所有負(fù)責(zé)畫出一個(gè)組件的代碼從組件中抽出來(lái)形成一個(gè)單獨(dú)的類而實(shí)現(xiàn)的。例如,除了定義按鈕控件的JButton類之外,還有一個(gè)單獨(dú)的類負(fù)責(zé)把按鈕在屏幕上畫出來(lái)。畫圖的這個(gè)類將控制按鈕的顏色、形狀以及其它外面上的特征。構(gòu)建輕量級(jí)組件的一種方法是擴(kuò)展抽象的java.awt.Component 類,然后改寫它的paint()方法: public class LightWeightButton extends Component{ public
8、 void paint(Graphics g){ /*在此寫繪制組件的Java代碼*/ } } 抽象類JComponent是能夠出現(xiàn)在屏幕上的大多數(shù)組件的父類。Java GUI的基本組件都是JComponent類的子類,因此,每個(gè)組件都繼承了JComponent的所有方法和數(shù)據(jù)字段。JComponent直接從Container類派生而來(lái),它和它的所有Swing子類都是輕量級(jí)組件(見圖7.2)。 圖7.2 Swing部分輕量級(jí)組件 Swing提供了若干包,在程序中,若使用Swing必須導(dǎo)入javax.swing包。swing包是Swing提供的最大包,它包含將近100個(gè)類和25個(gè)
9、接口,幾乎所有的Swing組件都在swing包中。 Swing組件從功能上可分為容器組件和原子組件。又可細(xì)分為:頂層容器、中間層容器、特殊容器、基本組件、不可編輯組件以及可編輯組件,如表7.1所示。原子組件必須加在容器組件中,容器組件用來(lái)容納其它容器組件或原子組件,并在其可視區(qū)域內(nèi)顯示這些組件。以下稱容器組件為容器,原子組件為組件。 表7.1 Swing組件分類表 GUI類別 組件 Swing類名 基本組件 按鈕 JButton, JCheckBox, JRadioButton 組合框 JComboBox 列表 JList 菜單 JMenu, JMenuBar, J
10、MenuItem, JPopupMenu 滑塊 JSlider 工具欄 JToolBar 文本區(qū) JTextField, JPasswordField, JTextArea, JFormattedTextField 不可編輯的顯示組件 標(biāo)簽 JLabel 工具提示 JToolTip 進(jìn)度條 JProgressBar 可編輯的顯示組件 表 JTable 文本 JTextPane, JEditorPane 樹 JTree 顏色選擇器 JColorChooser 文件選擇器 JFileChooser 數(shù)值選擇器 JSpinner 頂層容器 窗體
11、 JFrame,JWindow applet JApplet 對(duì)話框 JDialog,JOptionPane 中間層容器 面板 JPanel 滾動(dòng)窗格 JScrollPane, JScrollBar 拆分窗格 JSplitPane 索查標(biāo)簽窗格 JTabbedPane 特殊容器 內(nèi)部窗體 JInternalFrame 分層窗格 JLayeredPane 根窗格 JRootPane 7.1.3 Swing容器 AWT中的Container類是容器組件的超類,其目的是容納其它若干組件。一個(gè)窗口實(shí)際上指的是屏幕上的一個(gè)矩形區(qū)域,允許程序員將若干獨(dú)
12、立的組件作為一個(gè)整體處理。我們不能直接顯示組件,而是需要把它們加到容器中,由容器進(jìn)行顯示。 容器也提供一些方法,用于獲取和設(shè)置許多屬性、增加和從自身中刪除組件等。在屏幕上顯示容器之前,必須調(diào)用容器的pack()方法,或者設(shè)置其初始尺寸。設(shè)置尺寸時(shí)可以使用容器的setSize方法: public void setSize(int width,int height) 其中的參數(shù)以像素(屏幕上的點(diǎn))為單位。 由于輕量級(jí)組件和重量級(jí)組件之間的差別,為使輕量級(jí)組件能夠正確地工作,必須使用Swing容器容納Swing組件。Swing容器按其用途分為頂層容器、中間層容器以及特殊容器。頂層容器(Top
13、 Level Container)是一個(gè)窗口容器對(duì)象,在這樣的一個(gè)對(duì)象里可以再加入其它的窗口對(duì)象。JFrame、JApplet、JDialog、JWindow等就可以作為頂層容器,其余的Swing組件都必須依附在此四組件之一上才能顯示出來(lái)。 容器本身具有層次性,每一層都是一種特殊容器,這些特殊容器實(shí)際上是在GUI上起特殊作用的中間層。Swing容器具有獲取和調(diào)整這些面板層的方法。在簡(jiǎn)單編程過(guò)程中主要涉及到將組件加到容器的內(nèi)容面板中。 Swing容器的層次結(jié)構(gòu)如圖7.3所示。 JFrame JDialog JApplet JWindow JLayeredPane JRootPane
14、JContentPane JGlassPane JMenuBar 圖7.3 Swing容器層次結(jié)構(gòu) (1) 根面板JRootPane 根面板是頂層容器中所包含的最內(nèi)層,四個(gè)頂層容器均實(shí)現(xiàn)RootPaneContainer這個(gè)接口,此接口定義了各種容器取得與設(shè)置。根面板并不是真實(shí)的容器,它是由層次面板(JLayeredPane)與玻璃面板(JGlassPane)所組成,不能在JRootPane上加入任何的組件,因?yàn)樗皇且粋€(gè)虛擬的容器,通常無(wú)法在這一層做操作與處理。若要在最上層組件上加入組件,必須加在JLayeredPane或是JLayeredPane里的內(nèi)容面板上。 需要注意的是,
15、只有頂層容器才有根面板,其它中間層容器沒(méi)有根面板。 (2) 層次面板JLayeredPane JLayeredPane用于管理JMenuBar和內(nèi)容面板JContentPane,并維護(hù)一個(gè)層次疊放順序(Z-order)標(biāo)記數(shù)據(jù),可以對(duì)加入在層次面板中的對(duì)象設(shè)定層次,而不會(huì)被內(nèi)容面板中的對(duì)象屏蔽。一般程序會(huì)提供良好的Z-order自動(dòng)管理機(jī)制,當(dāng)然java也不例外,大部分情況我們不會(huì)使用到Z-order,因?yàn)橄到y(tǒng)會(huì)自動(dòng)幫我們管理好。用戶只需將所需的組件直接加入內(nèi)容面板即可,不需要知道它們之間的順序關(guān)系。JMenuBar是一個(gè)對(duì)象,用于跟蹤與容器相關(guān)聯(lián)的任何菜單。JMenuBar是可選的,如果
16、沒(méi)有,內(nèi)容面板就會(huì)充滿整個(gè)頂層容器。 (3) 內(nèi)容面板JContentPane 與AWT組件不同,Swing組件不能直接添加到頂層容器中,它必須添加到頂層Swing容器的內(nèi)容面板(JContentPane)上。JContentPane是Swing容器中一個(gè)對(duì)象,可以把Swing組件加到其中,并設(shè)置布局策略。大部分的可視對(duì)象都放在內(nèi)容面板中,一般在程序中必須用getContentPane()方法來(lái)獲取內(nèi)容面板,然后將其加到這一層中。內(nèi)容面板是頂層容器包含的一個(gè)普通容器,它是一個(gè)輕量級(jí)組件,應(yīng)避免在其上添加非Swing的重量級(jí)組件。 (4) 玻璃面板JGlassPane 在玻璃面板這一層次
17、上主要用來(lái)產(chǎn)生繪圖效果,以及觸發(fā)窗口程序的各種事件。 中間層容器主要有JPanel、JScrollPane、JSplitPane、JTabbedPane等,它們沒(méi)有根面板,不能在桌面上浮動(dòng),必須填加到頂層容器中才能顯示。 下面介紹一些常用的Swing容器。 1.框架窗口JFrame 窗口是最基本的用戶界面元素??蚣艽翱谑且环N窗體,其中帶有邊框、標(biāo)題欄及用于關(guān)閉和最大/最小化窗口的圖標(biāo)等。在GUI的應(yīng)用程序中,一般至少應(yīng)使用一個(gè)框架窗口。通常將框架窗口簡(jiǎn)稱為窗口。 JFrame類是由Container類派生而來(lái)的,是一種頂層容器類,可用于創(chuàng)建框架窗口。JFrame作為最頂層容器存
18、在,不能被其它容器所包含。它可將加到其內(nèi)容面板的組件顯示在屏幕上,每個(gè)加到窗口中的組件需要明確它的大小和位置,以及在窗口中如何顯示。 JFrame構(gòu)造方法主要有: JFrame(),建立一個(gè)無(wú)標(biāo)題的JFrame。 JFrame(String title),建立一個(gè)標(biāo)題為title的JFrame。 窗口的基本操作: (1) 創(chuàng)建窗口 直接生成一個(gè)JFrame類的實(shí)例即可建立一個(gè)窗口,或通過(guò)繼承JFrame類來(lái)定義子類,再建立窗口。 例如,創(chuàng)建一個(gè)無(wú)標(biāo)題的窗口,語(yǔ)句如下: JFrame frame=new JFrame(); (2) 設(shè)置標(biāo)題 通過(guò)super(String ti
19、tle)調(diào)用基類的構(gòu)造方法,或通過(guò)setTitle(String title)方法來(lái)設(shè)置窗口標(biāo)題。 例如: JFrame frame=new JFrame(“JFrame testing”); 或者: JFrame frame=new JFrame(); frame.setTitle(“JFrame testing”); (3) 設(shè)置初始位置 通過(guò)setLocation(int x,int y)方法設(shè)置窗口初始位置。其中x,y是窗口左上角在屏幕上的坐標(biāo)值。 (4) 設(shè)置大小 通過(guò)setSize(int width,int height)方法設(shè)置窗口初始大小。 (5) 設(shè)置圖
20、標(biāo) 通過(guò)setIconImage(Icon icon)方法設(shè)置窗口圖標(biāo)。 (6) 定義關(guān)閉行為 通過(guò)setDefaultCloseOperation(int operation)方法設(shè)置窗口關(guān)閉行為。其中operation的取值可以是以下幾種: DO_NOTHING_ON_CLOSE:當(dāng)窗口關(guān)閉時(shí),不做任何處理; HIDE_ON_CLOSE:當(dāng)窗口關(guān)閉時(shí),隱藏這個(gè)窗口; DISPOSE_ON_CLOSE:當(dāng)窗口關(guān)閉時(shí),隱藏并處理這個(gè)窗口; EXIT_ON_CLOSE:當(dāng)窗口關(guān)閉時(shí),退出程序。 operation默認(rèn)值是HIDE_ON_CLOSE。 (7) 添加組件 創(chuàng)建好J
21、frame之后,就可以向它的內(nèi)容面板中添加組件。對(duì)Jframe添加組件有兩種方式: 第一種方式,用getContentPane( )方法獲得JFrame的內(nèi)容面板,再對(duì)其加入組件,語(yǔ)句如下: frame.getContentPane().add(childComponent) 第二種方式,先建立一個(gè)JPanel或 JDesktopPane之類的中間容器,把組件添加到容器中,用窗口對(duì)象的setContentPane()方法把該容器置為JFrame的內(nèi)容面板: JPanel conPane=new JPanel(); …… // 把其它組件添加到JPanel
22、中 frame.setContentPane(conPane); //把conPane對(duì)象設(shè)置成為窗口對(duì)象frame的內(nèi)容面板 這里需要注意的是,Swing容器都可以用來(lái)容納其他組件,但除了JPanel及其子類可以直接添加組件以外,其它Swing容器都不允許把組件直接加進(jìn)去,添加方法和JFrame中添加組件一樣。 【例7.1】 建立一個(gè)標(biāo)題為“Swing窗口”,大小為(300,200),圖標(biāo)為javalogo.gif,位置居中的窗口。屏幕效果如圖7.4所示。 圖7.4 Swing窗口 源程序如下: //JFrameDemo.java import javax.swing.*
23、; import java.awt.*; public class JFrameDemo extends JFrame // 定義一個(gè)窗口子類 { JFrameDemo() { setIconImage(new ImageIcon("javalogo.gif").getImage()); // 設(shè)置圖標(biāo) setSize(300,200); // 設(shè)置窗口大小 setTitle("Swing窗口"); // 設(shè)置窗口標(biāo)題 // 取得屏幕尺寸 Dimension screen=Toolkit.getDefaultTo
24、olkit().getScreenSize(); Dimension mySize=this.getSize(); // 取得窗口尺寸 //設(shè)置初始位置于屏幕中央 setLocation((screen.width-mySize.width)/2, (screen.height-mySize.height)/2); setVisible(true); // 使窗口可見 } public static void main(String args[]) { JFrameDemo myFrame=new J
25、FrameDemo(); // 創(chuàng)建窗口 myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 設(shè)置關(guān)閉行為 } } 2. 無(wú)邊框的窗口JWindow JWindow可以構(gòu)造無(wú)邊框的窗口。主要構(gòu)造方法有: JWindow():創(chuàng)建一個(gè)無(wú)邊界的窗口; JWindow(Frame owner):創(chuàng)建一個(gè)依賴Frame對(duì)象的窗口。 3.對(duì)話框JDialog 對(duì)話框與框架窗口類似,是有邊框、有標(biāo)題、可獨(dú)立存在的頂級(jí)容器。對(duì)話框分為無(wú)模態(tài)對(duì)話框和模態(tài)對(duì)話框。模態(tài)對(duì)話框只讓程序響應(yīng)對(duì)話框內(nèi)部的事件,對(duì)于對(duì)話框以
26、外的事件程序不響應(yīng),并且在該對(duì)話框被關(guān)閉之前,其他窗口無(wú)法接受任何形式的輸入;而無(wú)模態(tài)對(duì)話框可以讓程序響應(yīng)對(duì)話框以外的事件,沒(méi)有限制。 JDialog的構(gòu)造方法有: JDialog(Frame owner); JDialog(Frame owner,Boolean modal); JDialog(Frame owner,String title); JDialog(Frame owner,String title,Boolean modal); 其中,參數(shù)owner指明對(duì)話框隸屬哪個(gè)窗口,參數(shù)title指明對(duì)話框的標(biāo)題。參數(shù)modal為true時(shí),指明對(duì)話框是模態(tài)的;如果modal
27、為false,則指明對(duì)話框是無(wú)模態(tài)的。 用JDialog來(lái)作對(duì)話框,必須實(shí)現(xiàn)對(duì)話框中的每一個(gè)組件,但有時(shí)候?qū)υ捒蛑灰@示一段文字,或是作一些簡(jiǎn)單的選擇,這時(shí)候可以利用JOptionPane類,從而大大的減少了程序代碼的編寫。JOptionPane類也在javax.swing包內(nèi)。要利用JOptionPane類來(lái)輸出對(duì)話框,通常不使用new創(chuàng)建一個(gè)JOptionPane對(duì)象出來(lái),而是使用JOptionPane所提供的一些靜態(tài)方法,這些方法都是以showXxxxxDialog的形式出現(xiàn)。例如,建立一個(gè)消息對(duì)話框可使用JOptionPane.showMessageDialog();另外,JOpti
28、onPane.showConfirmDialog()會(huì)建立一個(gè)確認(rèn)對(duì)話框,JOptionPane.showInputDialog()會(huì)建立一個(gè)輸入對(duì)話框。 4.面板JPanel Swing的JPanel,它替代了AWT的畫布(Canvas)和面板(Panel),兼有二者的功能。JPanel是一個(gè)非頂級(jí)的通用容器,總是處于其它一些容器中。JPanel不能象JFrame那樣能夠在桌面上浮動(dòng)。利用JPanel可以使版面的排列方式更生動(dòng),對(duì)于復(fù)雜GUI,通常由多個(gè)面板組成,而每個(gè)面板以特定的布局來(lái)排列組件。 JPanel的構(gòu)造方法有: JPanel(); JPanel(boolean isD
29、oubleBuffered); JPanel(LayoutManager layout); JPanel(LayoutManager layout,boolean isDoubleBuffered); 其中,isDoubleBuffered指明是否具有雙緩沖,layout指明布局方式。JPanel默認(rèn)是非雙緩沖,布局為流式布局(FlowLayout)。 5. 分割面板JSplitPane JSplitPane一次可將兩個(gè)組件同時(shí)顯示在兩個(gè)顯示區(qū)中,若想要同時(shí)在多個(gè)顯示區(qū)顯示組件,便必須同時(shí)使用多個(gè)JSplitPane。JSplitPane提供兩個(gè)常數(shù):HORIZONTAL_SPLIT
30、、VERTICAL_SPLIT,用來(lái)設(shè)置水平分割或是垂直分割。 6. JTabbedPane 如果一個(gè)窗口的功能有幾項(xiàng),可以給每項(xiàng)設(shè)置一個(gè)標(biāo)簽,每個(gè)標(biāo)簽下面包含為完成此功能專用的若干組件。用戶要使用哪項(xiàng)功能,只要單擊相應(yīng)的標(biāo)簽,就可以進(jìn)入相應(yīng)的頁(yè)面。這種選項(xiàng)卡功能的實(shí)現(xiàn)就需要使用JTabbedPane這個(gè)中間層容器。 7. 滾動(dòng)面板JScrollPane 當(dāng)容器內(nèi)要容納的內(nèi)容大于容器時(shí),希望容器能夠有一個(gè)滾動(dòng)條,通過(guò)拖動(dòng)滑塊,就可以看到更多的內(nèi)容。JScrollPane就是能夠?qū)崿F(xiàn)這種功能的容器。 8. JInternalFrame 使用JInternalFrame容器類可以實(shí)現(xiàn)在
31、一個(gè)主窗口中打開很多個(gè)文檔,每個(gè)文檔各自占用一個(gè)新的窗口。JInternalFrame的使用跟JFrame幾乎一樣,可以最大化、最小化、關(guān)閉窗口、加入菜單;唯一不同的是JInternalFrame是輕量級(jí)組件,它只能是中間容器,必須依附于頂層容器上。 7.1.4 基于Swing的Java GUI設(shè)計(jì)思路 構(gòu)造用戶界面會(huì)涉及到一些基本概念,包括前面已經(jīng)提到的組件、容器,還有后面要說(shuō)明的布局管理器和事件處理等。Java GUI編程,一般可依據(jù)下面的設(shè)計(jì)思路: 1. 設(shè)置頂層容器。通常是JFrame或Japplet,用于設(shè)計(jì)Java應(yīng)用程序或Java小應(yīng)用程序。 2. 創(chuàng)建組件。組件
32、包括按鈕、菜單以及選項(xiàng)等。 3. 使用某種布局把組件加到某個(gè)容器中。對(duì)于復(fù)雜的用戶界面,通常會(huì)使用若干中間層容器,這樣便于對(duì)組件的管理,在編程時(shí)先將組件置于中間層容器中,之后再將中間層容器加到頂層容器中。對(duì)于組件在容器中的位置和大小,也可交給布局管理器全權(quán)負(fù)責(zé)。 4. 實(shí)現(xiàn)事件處理程序,以便響應(yīng)點(diǎn)擊按鈕、菜單選擇、窗口縮放以及其它活動(dòng)等。 7.2 圖形與繪圖 7.2.1 繪圖表面 為了在Java程序里進(jìn)行繪圖和繪畫,需要有一個(gè)可以操作的表面。在抽象窗口工具包(AWT)中,這個(gè)繪圖表面通常是一個(gè)Canvas組件。在Swing程序中可以直接在頂層窗口(通常是JApplet和J
33、Frame)上繪圖,或者在JPanel的子類上繪圖。 7.2.2 圖形環(huán)境和圖形對(duì)象 要在Java中繪圖,還需理解Java的坐標(biāo)系統(tǒng),如圖7.5所示。GUI組件(諸如applet或窗口)的左上角坐標(biāo)默認(rèn)為(0,0),坐標(biāo)對(duì)由一個(gè)x坐標(biāo)(水平坐標(biāo))和一個(gè)y坐標(biāo)(垂直坐標(biāo))組成。x坐標(biāo)是從左上角向右移動(dòng)的水平距離,y坐標(biāo)是從左上角向下移動(dòng)的垂直距離。坐標(biāo)的單位是像素,它是顯示器分辨率的最小單位。 圖7.5 以像素為單位的Java坐標(biāo)系統(tǒng) 在屏幕上繪圖要使用Java圖形環(huán)境,每個(gè)Java組件(包括Swing組件),都有一個(gè)與之關(guān)聯(lián)的圖形環(huán)境,也稱圖形上下文,用java.awt.G
34、raphics類的一個(gè)對(duì)象來(lái)表示。Graphics對(duì)象用于管理圖形環(huán)境,并在屏幕上繪制代表文本或其它圖形對(duì)象(如線條、橢圓、矩形或其它多邊形)的像素。Graphics 類是所有圖形上下文的抽象基類,這個(gè)上下文允許應(yīng)用程序?qū)D形繪制到由不同設(shè)備實(shí)現(xiàn)的組件上,以及繪制到空閑屏幕的映像中。 java.awt.Graphics類是一個(gè)抽象類,不能直接創(chuàng)建一個(gè)Graphics對(duì)象,這是由Java的可移植性決定的,因?yàn)樵谥С諮ava的各個(gè)平臺(tái)上,執(zhí)行的繪圖操作是不同的,例如運(yùn)行Microsoft Windows的PC機(jī)繪制矩形的圖形功能不同于UNIX工作站上繪制矩形的圖形功能,而且它們也不同于Maci
35、ntosh系統(tǒng)中繪制矩形的圖形功能。在各個(gè)平臺(tái)實(shí)現(xiàn)Java時(shí),系統(tǒng)將創(chuàng)建Graphics的一個(gè)子類,以實(shí)現(xiàn)繪圖功能。 一個(gè) Graphics 對(duì)象封裝有 Java 所支持的基本繪圖操作所需的狀態(tài)信息。此狀態(tài)信息包括下列屬性: (1) 要被繪制到其上的組件對(duì)象; (2) 繪制和剪貼坐標(biāo)的平移原點(diǎn)。; (3) 當(dāng)前的剪貼區(qū); (4) 當(dāng)前顏色; (5) 當(dāng)前的字體; (6) 當(dāng)前的邏輯像素操作函數(shù) (XOR 或 Paint) ; (7) 當(dāng)前的 XOR 替換顏色。 其中XOR模式稱為位異或模式,它符合邏輯操作異或。在XOR模式下,當(dāng)在背景色和前景色上執(zhí)行一個(gè)異或操
36、作時(shí),像素點(diǎn)的前景色是由畫筆的顏色來(lái)決定的。在黑白繪圖方式下,如果畫筆是黑色的,在背景為白色的任何位置,繪圖都是黑色的;如果背景已經(jīng)是黑色的,那么繪圖就會(huì)是白色的。這樣,在這種情況下XOR模式會(huì)對(duì)背景色進(jìn)行反色操作。在有顏色的背景下,也能獲得類似的效果。 Graphics類中定義了許多方法,包含用于改變上述屬性默認(rèn)值的訪問(wèn)方法,以及各種繪圖方法,分別如表7.2和表7.3所示。 表7.2 Graphics類的部分獲取和設(shè)置屬性默認(rèn)值的方法 名稱 說(shuō)明 Shape getClip() 返回表示當(dāng)前剪貼區(qū)域的 Shape 對(duì)象 Color getColor() 返回該圖形上下文的當(dāng)前
37、顏色 Font getFont() 返回該圖形上下文的當(dāng)前字體 FontMetrics getFontMetrics() 返回該圖形上下文當(dāng)前字體的字體度量 void setClip(Shape?clip) 將當(dāng)前的剪貼域設(shè)置為任意剪貼形狀 void setColor(Color?c) 將該圖形上下文的當(dāng)前顏色設(shè)置為指定的顏色 void setFont(Font?font) 將指定的字體設(shè)置為該圖形上下文的字體。 void translate(int?x,int?y) 將圖形上下文的原點(diǎn)平移到當(dāng)前坐標(biāo)系的 (x ,y) 點(diǎn)處。修改該圖形的上下文,使得它的新原點(diǎn)與該圖形上
38、下文原先坐標(biāo)系中的 (x,y) 點(diǎn)相一致 表7.3 Graphics類的繪圖方法 方法 說(shuō)明 void drawString(String str,int x,int y) 使用該圖形上下文的當(dāng)前字體和顏色,從坐標(biāo)點(diǎn)(x,y)位置處開始繪制由指定的字符串給出的文本 void drawLine(int?x1,int?y1,int?x2,int?y2) 繪制一條在點(diǎn)(x1,y1) 和(x2,y2) 之間的線 void drawRect(int x,int y,int width,int height) 畫一矩形,左上角坐標(biāo)為(x,y),寬width ,高h(yuǎn)eight void
39、fillRect(int x,int y,int width,int height) 繪制一個(gè)使用當(dāng)前顏色填充的指定矩形 void clearRect(int?x, int?y, int?width, int?height) 通過(guò)用當(dāng)前繪圖表面的背景顏色填充的方法來(lái)清除指定的矩形。 void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) 使用當(dāng)前顏色繪制圓角矩形。圓角是一個(gè)橢圓的1/4弧,此橢圓由arcWidth,arcHeight確定兩軸長(zhǎng) void fillRoun
40、dRect(int x, int y, int width,int height, int arcWidth, int arcHeight) 用當(dāng)前顏色填充指定的圓角矩形 void draw3DRect(int x, int y, int width, int height, boolean raised) 繪制指定矩形的一個(gè)突出顯示的三維輪廓。raised為true時(shí),該矩形為凸的,反之為凹的 void fill3DRect(int x, int y, int width, int height, boolean raised) 繪制一個(gè)用當(dāng)前顏色填充的三維矩形 void dra
41、wOval(int x,int y,int width,int height) 繪制橢圓形的輪廓。結(jié)果是一個(gè)圓或橢圓,并適合由 x ,y ,width 和 height 參數(shù)指定的矩形 void fillOval(int x, int y, int width, int height) 用當(dāng)前顏色填充由指定矩形限定的橢圓 void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) 繪制一個(gè)覆蓋指定矩形的圓或橢圓弧的輪廓 void fillArc(int x, int y, int
42、width, int height, int startAngle, int arcAngle) 填充一個(gè)覆蓋了指定矩形的圓或橢圓弧 void drawPolyline(int xPoints[],int yPoints[],int nPoints) 繪制由 x 和 y 坐標(biāo)數(shù)組定義的連接線序列。每對(duì) (x,y)坐標(biāo)定義一個(gè)點(diǎn) void drawPolygon(int xPoints[],int yPoints[],int nPoints) 繪制由 x 和 y 坐標(biāo)數(shù)組定義的閉合多邊形。每對(duì) (x,y) 坐標(biāo)定義一個(gè)點(diǎn) void drawPolygon(Polygon p) 繪制
43、由指定的 Polygon 對(duì)象定義的多邊形的輪廓 void fillPolygon(int xPoints[],int yPoints[], int nPoints) 填充由 x 和 y 坐標(biāo)數(shù)組定義的閉合多邊形 void fillPolygon(Polygon p) 用圖形上下文的當(dāng)前顏色填充由指定的 Polygon 對(duì)象定義的多邊形。多邊形內(nèi)的區(qū)域使用奇偶填充規(guī)則和交替填充規(guī)則來(lái)定義 boolean drawImage(Image img, int x,int y, ImageObserver observer) 繪制指定圖像的當(dāng)前可用部分。繪制的圖像,其左上角位于坐標(biāo)(x,y
44、) 位置。如果圖像沒(méi)有被完全裝入,那么 drawImage 方法將返回 false 7.2.3 顏色 顏色美化了程序的外觀,并有助于信息的表達(dá)。Java的顏色是根據(jù)RGB值來(lái)建立的,RGB值是用于指定紅色、綠色和藍(lán)色量的3個(gè)數(shù)字的組合,這些顏色組件混合在一起形成了最終的顏色。java.awt.Color類聲明了用于操作Java程序中顏色的方法,同時(shí)Color類定義了一些標(biāo)準(zhǔn)顏色,作為類常量使用,這些常量共有13個(gè),它們的名稱有小寫名稱也有大寫名稱,表7.4中采用大寫形式,這樣符合常量的命名約定。表7.5給出了一些Color類的構(gòu)造函數(shù)和常用方法。 表7.4 Color類的常量
45、顏色常量 顏色 public final static Color BLACK 黑色 public final static Color BLUE 藍(lán)色 public final static Color CYAN 藍(lán)綠色 public final static Color DARKGRAY 深灰色 public final static Color GRAY 灰色 public final static Color GREEN 綠色 public final static Color LIGHT_GRAY 淺灰色 public final static Col
46、or MAGENTA 紫紅色 public final static Color ORANGE 橙色 public final static Color PINK 粉紅色 public final static Color RED 紅色 public final static Color WHITE 白色 public final static Color YELLOW 黃色 表7.5 Color類的方法 方法 說(shuō)明 Color(int r,int g,int b) 用指定的紅、綠和藍(lán)色成分創(chuàng)建一個(gè)顏色。三個(gè)參數(shù)都必須在 0-255 范圍內(nèi) Color(int
47、 rgb) 用指定的 RGB 值創(chuàng)建一個(gè)顏色,其中參數(shù)的 16-23 位表示紅色成分,8-15 位表示綠色成分,0-7 位表示藍(lán)色成分。0 表示這個(gè)基色成分沒(méi)有參與顏色構(gòu)成 Color(float r, float g, float b) 用指定的紅、綠和藍(lán)色值創(chuàng)建一個(gè)顏色,其中每個(gè)值在 0.0-1.0 范圍內(nèi)。0.0 值表示這個(gè)基色成分沒(méi)有貢獻(xiàn)。值 1.0 表示這個(gè)基色成分的最大飽和度 int getRed() 獲取這個(gè)顏色的紅色成分。返回結(jié)果是一個(gè)0 - 255 之間的整數(shù) int getGreen() 獲取這個(gè)顏色的綠色成分。返回結(jié)果是一個(gè) 0 - 255 之間的整數(shù) i
48、nt getBlue() 獲取這個(gè)顏色的藍(lán)色成分。返回結(jié)果是一個(gè) 0 - 255 之間的整數(shù) 設(shè)計(jì)使用顏色的程序時(shí)必須要小心,因?yàn)轭伾谋硎臼桥c系統(tǒng)有關(guān)的。在理論上講,可能指定256*256*256=16 777 216種不同的顏色。但是在實(shí)際系統(tǒng)中,真正能夠顯示的不同顏色的數(shù)目,取決于系統(tǒng)顯示器的質(zhì)量。如果顯示只允許使用8位顏色來(lái)表示每個(gè)像素,則最多可以表示28=256種顏色,在這種情況下,操作系統(tǒng)會(huì)決定顯示16 777 216種顏色中的哪256種顏色,如果程序需要這256種顏色之外的顏色,系統(tǒng)會(huì)選擇最相近的顏色。 7.2.4 字體 為了創(chuàng)建有吸引力的界面,常常需要選擇和控制
49、所用的字體。Java中有關(guān)字體控制的類是Font類,有關(guān)字體度量的類是FontMetrics,它們都在java.awt包中。前面已經(jīng)提到,每個(gè)圖形上下文都有一個(gè)相關(guān)的字體Font對(duì)象和字體度量FontMetrics對(duì)象,F(xiàn)ont對(duì)象包括字體名、字號(hào)和風(fēng)格等屬性,F(xiàn)ontMetrics對(duì)象封裝了字體的許多重要數(shù)據(jù),如字體的高度和寬度等。表7.6給出了Font類的一些常量和常用方法。 表7.6 Font類的方法和常量 常量或方法 說(shuō)明 public final static int PLAIN 一個(gè)代表普通字體風(fēng)格的常量 public final static int BOLD 一個(gè)
50、代表粗體字體風(fēng)格的常量 public final static int ITALIC 一個(gè)代表斜體字體風(fēng)格的常量 Font(String name,int style,int size) 利用指定的字體、風(fēng)格和大小創(chuàng)建一個(gè)Font對(duì)象 int getStyle() 返回一個(gè)表示當(dāng)前字體風(fēng)格的整數(shù)值 int getSize() 返回一個(gè)表示當(dāng)前字體大小的整數(shù)值 String getName() 以字符串形式返回當(dāng)前字體名稱 String getFamily() 以字符串形式返回當(dāng)前字體族名稱 Boolean isPlain() 測(cè)試一個(gè)字體是否是普通字體風(fēng)格 Boo
51、lean isBold() 測(cè)試一個(gè)字體是否是粗體字體風(fēng)格 Boolean isItalic() 測(cè)試一個(gè)字體是否是斜體字體風(fēng)格 Font類的構(gòu)造函數(shù)有3個(gè)參數(shù):字體名稱、字體風(fēng)格和字體大小。字體名稱可以是運(yùn)行程序的當(dāng)前系統(tǒng)所支持的任何字體,在Java1.1和以后的版本中,所支持的字體名字有Monospaced、SansSerif、Serif、Dialog和DialogInput。字體風(fēng)格可以是表7.6已列出的三個(gè)之一,也可以是Font.ITALIC+Font.BOLD組合。字體大小以磅為度量單位,一磅等于1/72英寸。這些名字和風(fēng)格是平臺(tái)無(wú)關(guān)的,當(dāng)用于程序中時(shí),會(huì)映射成本地系統(tǒng)可用的
52、實(shí)際字體。如果本地系統(tǒng)沒(méi)有與指定字體確切相匹配的字體,就會(huì)提供一個(gè)替代字體。 7.2.5 使用Graphics類繪圖 當(dāng)在AWT組件和Swing頂層窗口(JApplet和JFrame,是java.awt.Component的子類)上繪圖時(shí),需要重寫組件的paint()方法;當(dāng)在Swing的JComponent的子類組件上繪圖時(shí),則需重寫paintComponent()方法。在這兩種情況(Swing和AWT)下,都是以一個(gè)Graphics對(duì)象作為參數(shù)。在某個(gè)組件需要進(jìn)行繪圖操作時(shí),系統(tǒng)會(huì)將Graphics對(duì)象傳遞給paint方法或paintComponent方法。paint方法和pa
53、intComponent方法的頭部分別為: public void paint(Graphics g ) public void paintComponent(Graphics g ) 程序員很少直接調(diào)用paint方法,因?yàn)槔L制圖形是一個(gè)事件驅(qū)動(dòng)過(guò)程。在執(zhí)行applet(在第九章對(duì)此進(jìn)行詳細(xì)說(shuō)明)時(shí),applet的容器調(diào)用paint方法,要再次調(diào)用paint方法,必須產(chǎn)生一個(gè)事件(如隱藏或重新顯示applet的窗口)。類似地,在顯示任何組件對(duì)象時(shí),將調(diào)用該組件對(duì)象的paint方法。 如果程序員需要強(qiáng)制執(zhí)行paint方法,一般是調(diào)用repaint()方法(此方法不應(yīng)重寫,因?yàn)樵摲椒▓?zhí)行一
54、些與系統(tǒng)相關(guān)的任務(wù)),該方法自動(dòng)調(diào)用Component類的update(Graphics g)方法以清除Component背景中的舊圖,然后update方法直接調(diào)用paint方法。 【例7.2】 使用各種顏色繪制文字及各種圖形。屏幕效果如圖7.6所示。源程序如下: // Graphic.java import java.awt.*; import javax.swing.*; public class Graphic extends JFrame{ public Graphic(){ super("字體、顏色與繪圖示例"); // 調(diào)用超類的構(gòu)造方法,設(shè)置窗口標(biāo)題
55、 setSize(480,240); // 設(shè)置窗口大小 setVisible(true); // 使窗口可見 } public void paint(Graphics g) // 重寫paint方法 { super.paint(g); g.setFont(new Font("Serif",Font.BOLD,12));/*設(shè)置圖形環(huán)境的字體,名為Serif, 黑體,12號(hào)*/ g.setColor(Color.BLACK); // 設(shè)置顏色 g.drawString("字體Serif,粗體,12號(hào)
56、,黑色",20,50); // 繪制字符串 g.setFont(new Font("SansSerif",Font.BOLD+Font.ITALIC,15)); g.setColor(new Color(255,0,0)); g.drawString("字體SansSerif,粗斜體,15號(hào),紅色",200,50); g.drawLine(20,60,450,60); // 繪制直線 g.setColor(Color.BLUE); g.drawRect(20,70,100,50); // 繪制矩形 g.fillRect(1
57、30,70,100,50); // 繪制實(shí)心矩形 g.setColor(Color.YELLOW); g.draw3DRect(20,130,100,50,true); // 繪制三維凸起矩形 g.fill3DRect(130,130,100,50,false); // 繪制三維凹陷實(shí)心矩形 g.setColor(Color.pink); g.drawOval(240,80,100,50); // 繪制橢圓 g.fillOval(350,80,100,50); // 繪制實(shí)心橢圓 g.setColor(Color.MAG
58、ENTA); int xValues[]={250,280,290,300,330,310,320,290,260,270}; int yValues[]={160,160,140,160,160,170,180,170,180,170}; g.drawPolygon(xValues,yValues,10); // 根據(jù)給定的10個(gè)坐標(biāo)點(diǎn),繪制空心多邊形 int xValues2[]={360,390,400,410,440,420,430,400,370,380}; g.fillPolygon(xValues2,yValues,10); // 根據(jù)給定的
59、10個(gè)坐標(biāo)點(diǎn),繪制實(shí)心多邊形 } public static void main(String args[]) { // 設(shè)置窗口的外觀和感覺為Java默認(rèn) JFrame.setDefaultLookAndFeelDecorated(true); Graphic myGraphic=new Graphic(); // 產(chǎn)生Graphic類的一個(gè)實(shí)例 myGraphic.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 關(guān)閉窗口 } } 圖7.6 使用Graphics類繪圖 7.3事件
60、處理與Swing常用組件 聲明組件、處理事件以及將組件置于容器內(nèi)這三個(gè)問(wèn)題聯(lián)系得非常緊密,在后續(xù)小節(jié)中我們將分別進(jìn)行說(shuō)明,而在所有基于GUI的程序中,其核心是事件處理,下面對(duì)此先進(jìn)行說(shuō)明。 GUI是事件驅(qū)動(dòng)的(即用戶與GUI進(jìn)行交互時(shí),GUI將產(chǎn)生事件)。一些常見的事件包括單擊鼠標(biāo)按鈕、移動(dòng)鼠標(biāo)、單擊按鈕、在文本字段內(nèi)進(jìn)行輸入、在菜單中選擇菜單項(xiàng)、關(guān)閉窗口等。若發(fā)生了一次用戶交互,就將一個(gè)消息發(fā)送給程序。GUI事件信息存儲(chǔ)在擴(kuò)展AWTEvent的類的一個(gè)對(duì)象中。AWT組件和Swing組件都可以使用java.awt.event包中的事件類型。javax.swing.event包還聲明了其
61、它一些事件類型,這些事件類型是專用于Swing組件的。 7.3.1 Java事件處理機(jī)制 事件處理機(jī)制是一種事件處理框架,其設(shè)計(jì)目的是把GUI交互動(dòng)作(鼠標(biāo)點(diǎn)擊、菜單選擇等)轉(zhuǎn)變?yōu)檎{(diào)用相關(guān)的事件處理程序進(jìn)行處理。JDK1.1以后Java采取了授權(quán)處理機(jī)制(Delegation-based Model),事件源可以把在其自身所有可能發(fā)生的事件分別授權(quán)給不同的事件處理者來(lái)處理。 由于窗口管理器無(wú)法直接調(diào)用開發(fā)人員提供的事件處理程序,必須在運(yùn)行時(shí)告訴事件模型,哪一個(gè)例程用于處理事件。因此,為了獲取任何事件,開發(fā)人員必須事先通知窗口系統(tǒng),令其將事件發(fā)送給自己提供的事件處理程序,把事件處理
62、程序注冊(cè)為窗口管理器中的一個(gè)回調(diào)例程,使之連接到產(chǎn)生事件的組件上。 要實(shí)現(xiàn)這個(gè)過(guò)程,就要用到事件處理機(jī)制中的三個(gè)對(duì)象:事件源、事件對(duì)象和事件監(jiān)聽器。 事件源是與用戶進(jìn)行交互的特定組件。事件源提供注冊(cè)監(jiān)聽器或取消監(jiān)聽器的方法,它維護(hù)一個(gè)已注冊(cè)的監(jiān)聽器列表,如有事件發(fā)生,就會(huì)通知每個(gè)已注冊(cè)的監(jiān)聽器。一個(gè)事件源可以注冊(cè)多個(gè)事件監(jiān)聽器。 事件對(duì)象封裝了有關(guān)已發(fā)生的事件的信息,這些信息包括事件源的一個(gè)引用和事件專用信息,事件監(jiān)聽器需要這些信息來(lái)處理事件。 事件監(jiān)聽器也是一個(gè)對(duì)象,該對(duì)象所屬的類實(shí)現(xiàn)了java.awt.event或javax.swing.event包中的一個(gè)或多個(gè)事件監(jiān)聽器的接口。
63、每個(gè)監(jiān)聽器可以對(duì)多種事件進(jìn)行響應(yīng)。事件監(jiān)聽器負(fù)責(zé)監(jiān)聽事件,它監(jiān)視所有事件類型,當(dāng)有事件發(fā)生時(shí),事件監(jiān)聽器會(huì)接收到事件源產(chǎn)生的事件對(duì)象,一旦該事件類型與自己所負(fù)責(zé)處理的事件類型一致,就會(huì)以該事件對(duì)象作為參數(shù)自動(dòng)調(diào)用相應(yīng)的事件處理程序作出響應(yīng)。 許多事件監(jiān)聽器類型是Swing組件和AWT組件所共有的。這樣的事件監(jiān)聽器類型聲明在java.awt.event包中,并且其中許多都顯示在表7.7中。不同的組件會(huì)產(chǎn)生不同的事件,不同的事件處理程序要實(shí)現(xiàn)不同的接口,表7.7概括了三者之間的關(guān)系。每個(gè)接口所承諾的方法可查閱Java doc的API。 表7.7 類別、事件與接口 一般類別 產(chǎn)生的事件 事
64、件處理程序?qū)崿F(xiàn)的接口 鼠標(biāo) 拖曳、移動(dòng)鼠標(biāo)產(chǎn)生的MouseEvent, 點(diǎn)擊、選擇、釋放鼠標(biāo)引起的MouseEvent MouseMotionListener MouseListener 鼠標(biāo)滾輪 鼠標(biāo)滾輪事件 MouseWheelListener 鍵盤 按鍵或釋放產(chǎn)生的KeyEvent KeyListener 選擇(列表、復(fù)選框等的某一項(xiàng)) 選擇某一選項(xiàng)時(shí)產(chǎn)生的ItemEvent ItemListener 文本輸入組件 輸入換行符時(shí)產(chǎn)生的TextEvent TextListener 滾動(dòng)控件 滾動(dòng)條滑動(dòng)時(shí)引起的AdjustmentEvent Adjus
65、tmentListener 其它組件(按鈕、菜單等) 點(diǎn)擊組件時(shí)或文本框中按下Enter鍵時(shí)產(chǎn)生的ActionEvent ActionListener 窗口變動(dòng) 打開、關(guān)閉窗口以及把窗口縮小為圖標(biāo)時(shí)產(chǎn)生的WindowEvent WindowListener 鍵盤焦點(diǎn)變動(dòng) 使用制表鍵轉(zhuǎn)到下一個(gè)字段,或者要求聚焦時(shí)引起的FocusEvent。組件必須在獲得聚焦時(shí)才能產(chǎn)生事件 FocusListener 組件變動(dòng) 縮放、隱藏、顯露或移動(dòng)組件時(shí)產(chǎn)生的ComponentEvent ComponentListener 容器變動(dòng) 加入或撤銷容器中的組件引起的ContainerEv
66、ent ContainerListener 要使程序能夠處理圖形用戶界面的事件,程序員必須完成2項(xiàng)關(guān)鍵任務(wù):為產(chǎn)生事件的GUI組件注冊(cè)一個(gè)事件監(jiān)聽器;實(shí)現(xiàn)一個(gè)事件處理方法(或一組事件處理方法)。事件處理方法通常稱為事件處理程序。下面以“關(guān)閉窗口”事件為例,來(lái)說(shuō)明Java事件處理框架。 【例7.3】 關(guān)閉窗口事件處理。 源程序如下: // CloseDemo1.java import javax.swing.*; import java.awt.event.*; public class CloseDemo1{ public static void main(String args[]){ JFrame jframe=new JFrame("關(guān)閉窗口例");// 創(chuàng)建一個(gè)窗口 jframe.setSize(400,100); // 設(shè)置窗口大小 jframe.setVisible(true); // 使窗口可見 myWinClose handler=new myWinClose();
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案