《Java語言程序設(shè)計案例教程》課件第9章_第1頁
《Java語言程序設(shè)計案例教程》課件第9章_第2頁
《Java語言程序設(shè)計案例教程》課件第9章_第3頁
《Java語言程序設(shè)計案例教程》課件第9章_第4頁
《Java語言程序設(shè)計案例教程》課件第9章_第5頁
已閱讀5頁,還剩273頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第9章圖形用戶界面程序設(shè)計9.1進入JavaGUI編程世界9.2創(chuàng)建應(yīng)用程序窗口9.3窗口中常用組件的設(shè)計9.4交互式GUI程序的設(shè)計9.5GUI程序界面布局設(shè)計9.6Swing的其他組件第9章圖形用戶界面程序設(shè)計學習目標

了解AWT和Swing的概念;

學會使用常用組件創(chuàng)建交互式圖形用戶界面的方法;

掌握圖形用戶界面中布局管理器的使用方法;

學會事件處理程序的編寫方法。除第8章的Applet程序外,本書前面各章介紹的程序都是控制臺應(yīng)用程序(即在DOS下執(zhí)行的程序)。在學習面向?qū)ο蟮幕A(chǔ)知識時,控制臺程序可以免去圖形用戶界面程序(GraphicUserInterface,GUI)中與面向?qū)ο箨P(guān)系不大的內(nèi)容,便于讀者學習。但畢竟當前的各類應(yīng)用軟件都是在圖形用戶界面下開發(fā)的,因此在掌握了Java語言的一些基本知識后,有必要學習Java語言中有關(guān)GUI程序設(shè)計的基本知識。本章介紹使用Java語言中的有關(guān)組件來構(gòu)建GUI應(yīng)用程序的知識?;炯寄?.1進入JavaGUI編程世界為了使讀者對JavaGUI程序設(shè)計有一個比較全面的了解,本節(jié)先簡要介紹一下JavaGUI程序設(shè)計的發(fā)展歷程及JavaGUI程序設(shè)計中的幾個基本概念。9.1.1AWT與Swing

1.?AWT在Java語言出現(xiàn)以前,各種操作系統(tǒng)平臺如Windows、Linux、Solaris等有其專有的圖形用戶界面。Java語言為了達到獨立于平臺的目的,最初設(shè)計了一種名叫AWT(AbstractWindowToolkit,抽象窗口工具包)的GUI程序開發(fā)類庫。在AWT中提供了建立GUI程序的工具集,主要包括基本的GUI程序組件,如按鈕、標簽、菜單、顏色、字體、布局管理器等;另外,還提供了事件處理機制及圖像操作等功能。

AWT可用于Java語言的Applet程序和Application程序中。AWT提供的組件都位于java.awt包中。

AWT只是一組通用的無關(guān)于特定平臺的類。在具體平臺上使用AWT組件(如Button,即按鈕)時,由運行時系統(tǒng)調(diào)用本地代碼(nativecode)來實現(xiàn)該組件。例如,如果在Windows平臺上運行的一個JavaGUI程序中使用了一個按鈕組件,則運行時系統(tǒng)會調(diào)用該系統(tǒng)中實現(xiàn)按鈕的代碼來顯示一個Windows風格的按鈕;而同樣的代碼在Solaris平臺上運行時,系統(tǒng)會調(diào)用Solaris中實現(xiàn)按鈕的代碼來顯示一個Motif(Solaris中窗口風格的名稱)風格的按鈕。這樣,就會出現(xiàn)在Java中具有相同名稱的組件,由于在不同平臺上本地實現(xiàn)的不同,而產(chǎn)生不同的外觀效果。因此,AWT組件要在不同的平臺上給用戶提供一個一致的外觀效果時就遇到了困難。也正是因為AWT所提供的窗口組件并非由AWT完全真實地實現(xiàn),因此才將AWT稱為抽象的(abstract)窗口工具。AWT的設(shè)計思想可以使Java語言系統(tǒng)的設(shè)計人員很快實現(xiàn)在不同平臺下的GUI組件,但其缺點是,隨著操作系統(tǒng)平臺的不同會顯示出不同的樣子。另外,AWT中的組件比較呆板,如按鈕Button只能是一個方框中顯示按鈕的名稱這種樣子,而無法改變。為此,在Java2以后,SUN公司開發(fā)出了一種功能更為強大的名叫Swing的組件。

2.?Swing

Swing組件與AWT組件相比有如下特點:●?Swing組件完全用Java語言編寫?!?Swing組件的實現(xiàn)沒有使用本地代碼。●?Swing組件的外觀靈活多樣,如按鈕可以是某種圖形,其形狀除了矩形外還可以是圓形或其他形狀。●?Swing提供的組件比AWT更豐富,如Swing提供了AWT中所沒有的導(dǎo)航、打印等功能。但要注意,Swing并不是完全替代了AWT,而是對AWT的擴展,因為Swing中的組件繼承自AWT,Swing中的版面布局管理和事件處理使用的還是AWT中定義的內(nèi)容。一般將AWT組件稱為重量級組件,而將Swing中不依賴于本地GUI資源的組件稱為輕量級組件。

Swing組件位于javax.swing包中,該包中定義了250多個類,其中的組件類有近50個(以J字母開頭)。javax表示的是javaextension的縮寫,因此對Java的所有擴展功能都放在javax中,Swing就是其中之一。

3.?GUI程序組件簡介在JavaGUI程序設(shè)計中,一個程序通常由以下4個基本部分組成:

1)基本組件基本組件具體是指構(gòu)成GUI程序的按鈕(Button)、標簽(Label)、文本框(TextField)、選擇框(Choice)等?;窘M件都是抽象類Component的子類,而Component類又繼承自O(shè)bject類,如圖9-1所示。

2)容器類組件一個GUI程序中的基本組件通常要放在一個容納這些基本組件的容器中,所以,把在AWT中專門容納其他組件的一些特定組件叫容器(Container)。容器的基類是Container類,Container類是Component類的子類,如圖9-1所示。圖9-1AWT類層次結(jié)構(gòu)圖

3)布局管理類一個容器中的組件按照什么樣的方式排列(即容器中的組件如何擺放),是由AWT中的布局管理類組件負責的,布局管理類組件也叫布局管理器。布局管理器類在圖9-1的左下方,它實現(xiàn)了LayoutManager接口或LayoutManager2接口。

4)事件處理類當用戶按下GUI程序中的一個按鈕時,程序就要對該“事件”進行處理。如按下一個“保存”按鈕時,則要進行文件的存盤操作。AWT中定義的事件類AWTEvent是EventObject類的子類,而EventObject類繼承了Object類。圖9-2是Swing中主要類的層次結(jié)構(gòu)圖。由于Swing中的JApplet、JWindow、JFrame和JDialog等類直接繼承了AWT中的相關(guān)類,因此Swing中的這幾個類均包含在圖9-1中。從圖9-2中可以看出,AWT中的基本組件在Swing中用相應(yīng)的組件來代替,如AWT的Button組件在Swing中對應(yīng)的組件為JButton。Swing組件類的名稱前都加了“J”這個字母,以示與AWT組件的區(qū)別。圖9-2Swing類層次結(jié)構(gòu)圖在這里給出AWT和Swing組件層次結(jié)構(gòu)圖的主要目的是讓讀者對組件(Component)、容器(Container)和布局管理器(LayoutManager)之間的關(guān)系以及AWT組件與Swing組件之間的關(guān)系有一個初步了解,因為學習GUI程序設(shè)計時理解類之間的繼承關(guān)系非常重要。

AWT及Swing就好像一大片樹林,其中有各種資源,而其間又有許多資源之間是互動的關(guān)系。我們需要了解這片樹林到底有哪些可用資源,這些資源放在哪里,它們之間的關(guān)系是怎么樣的,這樣才不會見樹不見林,從而得心應(yīng)手地設(shè)計JavaGUI程序。下面介紹一個簡單JavaGUI程序,通過該程序使讀者先對Swing程序有一個直觀的印象。9.1.2【案例9-1】文本轉(zhuǎn)換器程序

1.案例描述設(shè)計一個GUI程序:在一個文本框中輸入一行英文,單擊轉(zhuǎn)換按鈕,便可將文本框中輸入的內(nèi)容轉(zhuǎn)換為大寫字母后顯示出來。

2.案例效果圖9-3(a)所示的窗口是案例程序執(zhí)行后的效果,圖9-3(b)所示的窗口是輸入文本內(nèi)容后轉(zhuǎn)換的結(jié)果。圖9-3案例9-1的執(zhí)行效果(a)圖9-3案例9-1的執(zhí)行效果(b)

3.技術(shù)分析該GUI程序也由前面介紹的4個部分組成:●基本組件:組成該GUI程序的基本組件包括一個按鈕(JButton)、兩個標簽(JLabel)和一個文本框(JTextField)。一個標簽用于顯示提示信息,另一個標簽用于顯示轉(zhuǎn)換后的結(jié)果,文本框用于輸入要轉(zhuǎn)換的文本內(nèi)容,按鈕用于發(fā)出轉(zhuǎn)換命令?!袢萜鳎荷鲜龌窘M件可以放在一個名叫JFrame的容器中,該窗口一般作為應(yīng)用程序的框架窗口?!癫季止芾恚悍胖没窘M件的容器可以使用一個名叫GridLayout的布局管理類來管理?!袷录幚恚涸摮绦蛞瓿蓪⑤斎氲奈谋緝?nèi)容轉(zhuǎn)換為大寫字母后顯示的功能,因此,事件處理程序中首先要取得在文本框中輸入的內(nèi)容,這可以使用文本框(JTextField)定義的getText方法。對取得的字符串可以使用String類定義的toUpperCase方法轉(zhuǎn)換為大寫字母,然后使用標簽類(JLabel)定義的setText方法,將轉(zhuǎn)換后的內(nèi)容設(shè)置為標簽要顯示的內(nèi)容。

4.程序解析下面是該案例的程序代碼:01//*********************************************02//案例:9-103//程序名:toUpperCase.java04//功能:轉(zhuǎn)換器程序,將句子中的小寫字母轉(zhuǎn)換為大寫字母05//*********************************************0607importjava.awt.*;08importjavax.swing.*;09importjava.awt.event.*;1011publicclasstoUpperCase{12 publicstaticvoidmain(String[]args){13 //創(chuàng)建一個框架作為頂層容器14 JFramefrm=newJFrame("文本轉(zhuǎn)換器程序");15 //取得frm中放置內(nèi)容的面板16 ContainercontentPane=frm.getContentPane();17 //設(shè)置frm的布局管理18 contentPane.setLayout(newGridLayout(4,1));19 20 //創(chuàng)建基本組件21 finalJLabellabel1=newJLabel(“請在下面的文本框中輸入要轉(zhuǎn)換的內(nèi)容:");22 finalJLabellabel2=newJLabel("");23 JButtonbutton=newJButton(“顯示轉(zhuǎn)換后的文本內(nèi)容");24 finalJTextFieldtextField=new

JTextField(40);25 26 //將基本組件添加到內(nèi)容面板27 contentPane.add(label1);28 contentPane.add(textField);29 contentPane.add(label2);30 contentPane.add(button);31 32 //設(shè)置frm的大小33 frm.setSize(300,200);34 //設(shè)置frm的可見性35 frm.setVisible(true);36 //設(shè)置frm的關(guān)閉功能37

frm.setDefaultCloseOperation(JFrame.EXIT_

ON_CLOSE);38 39 //給按鈕添加事件處理功能40 button.addActionListener(41 newActionListener(){42 publicvoidactionPerformed(ActionEventenent){43 //獲取輸入的文本內(nèi)容44 Stringinf=textField.getText();45 //設(shè)置標簽顯示的文本內(nèi)容46 label2.setText(“您輸入的文本轉(zhuǎn)換成大寫后是:"+inf.toUpperCase());47 }48 });49 }50}盡管在該程序中有比較詳細的注釋,但讀者在閱讀這些代碼時可能還是不太理解。本案例的主要目的是讓讀者對JavaGUI程序的基本架構(gòu)有一個初步的了解,至于程序中所涉及到的基本組件、容器、布局管理和事件處理等知識,將在以后的內(nèi)容中詳細介紹。通過該程序,我們大致對GUI程序的組成總結(jié)如下:●引入相關(guān)的包:案例9-1中的07、08和09行引入的3個包在一般的Swing程序設(shè)計中都要引入?!裨O(shè)置頂層容器:頂層容器常用JFrame?!駝?chuàng)建基本組件:如按鈕和標簽等?!駥⒒窘M件添加到容器中:一般使用容器類定義的add方法完成添加,如案例9-1中的27~30行。●給組件添加事件處理功能:如案例9-1中的40行?!窬帉懯录幚沓绦颍喝绨咐?-1中的41~48行。9.1.3【相關(guān)知識】組件類的層次結(jié)構(gòu)

1.組件類的層次結(jié)構(gòu)與分類

Swing組件的層次結(jié)構(gòu)如下:java.lang.Object∟java.awt.Component∟java.awt.Container∟javax.swing.JComponent

Component類是所有組件的頂層類,Container類是AWT中容器類的頂層類(該類下一節(jié)介紹),其子類JComponent是Swing組件的頂層類。在這些頂層類中,定義了大多數(shù)組件可以使用的常用操作。如在Component類中定義了在第8章Applet程序中所使用過的paint等方法;在Container類中定義了案例9-1中所用的給容器添加組件的add和設(shè)置容器布局管理的setLayout等方法。

Swing組件從功能上可分為頂層容器、中間層容器和基本組件。

2.?Component類

Java圖形用戶界面最基本的組成部分是組件(Component)。組件一般是一個可以以圖形化的方式顯示在屏幕上并能與用戶進行交互的對象,例如一個按鈕、一個標簽等。Java語言中的GUI組件不能獨立地顯示出來,必須將組件放在一個容器中才可以顯示出來。

java.awt.Component類是所有AWT組件的頂層抽象類,其他組件類(包括Swing組件,容器也算是一種組件)都直接或間接地繼承了該類。在這個類中定義了許多組件共用的屬性及大量的方法(如設(shè)置或獲取圖形組件對象的大小、顯示位置、前景色和背景色、邊界、可見性等),因此許多組件類也就繼承了Component類的成員方法和成員變量。

Component類里所定義的內(nèi)容很多,我們無法在此一一列舉,讀者在使用過程中應(yīng)該經(jīng)常查看JDK幫助文件。表9-1列舉了一些常用的屬性與方法。表9-1Component類的常用屬性與方法

3.?JComponent類

Jcomponent類是一個抽象類,用于定義Swing中一些基本子類組件可用的方法。但并不是所有的Swing組件都繼承于JComponent類(如JFrame、JApplet、JDialog和JWindow類就不是該類的子類,見圖9-1)。JComponent類繼承于Container類,所以,凡是此類的組件都可作為容器使用,這也是Swing組件對AWT組件的一個最重要的改進。

JComponent類增加的功能主要有:●邊框設(shè)置:使用setBorder()方法可以設(shè)置組件外圍的邊框,使用一個EmptyBorder對象能在組件周圍留出空白?!裉崾拘畔ⅲ菏褂胹etTooltipText()方法為組件設(shè)置對用戶有幫助的提示信息?!裨O(shè)置應(yīng)用程序的外觀風格(LookandFeel):用UIManager.setLookAndFeel()方法可以設(shè)置用戶所喜歡的外觀風格(有metal、windows、motif、mac等)?!裨O(shè)置組件布局:通過設(shè)置組件最大、最小、推薦尺寸的方法能指定布局管理器的約束條件,為布局提供支持。●支持組件的打印功能。關(guān)于JComponent類為Swing組件增加的更多的實用功能,讀者可以查看JDK幫助。

4.頂層容器頂層容器有JFrame、JApplet、JDialog和JWindow。這4個頂層容器都屬于重量級組件(Swing中只有這4個屬重量級組件),程序運行時要使用當?shù)氐腉UI資源(見圖9-1右邊部分)。要設(shè)計一個GUI應(yīng)用程序,該程序中一般至少要包含一個頂層容器,因為每一個GUI組件(如JButton等)都需放入一個頂層容器中。

5.中間層容器雖然說每一個Swing組件都是一種容器,但其樣式與所能承裝的內(nèi)容卻有所區(qū)別。有些Swing組件是專門用來盛裝別的組件用的,作為一種容器,好讓被承裝的組件能合適地、有組織地顯示出來。這些只作為容納別的組件的容器,是介于頂層容器與一般Swing組件之間的,所以叫中間層容器。中間層容器有JMenuBar、JOptionPane、JRootPane、JLayeredPane、JPanel、JInternalFrame、JScrollPane、JSplitPane、JTabbedPane、JToolBar、JDeskTopPane、JViewPort、JEditorPane、JTextPane。

6.基本組件基本組件是在GUI窗口中用來實現(xiàn)與用戶交互的組件,如Jbutton、JComboBox、JList、JMenu、JSlider、JtextField等。在Swing中,基本組件根據(jù)用途可以分為三種類型,如表9-2所示。表9-2基本組件9.2創(chuàng)建應(yīng)用程序窗口應(yīng)用程序窗口一般是一個容器類對象,容器是一種特殊的GUI組件,用來容納、組織其他組件。本節(jié)介紹Swing中創(chuàng)建應(yīng)用程序窗口和對話框的方法。9.2.1創(chuàng)建應(yīng)用程序窗口

1.創(chuàng)建應(yīng)用程序窗口(JFrame)在JavaGUI應(yīng)用程序設(shè)計中,要以一個頂層容器作為程序的窗口來容納其他的GUI組件。在容器類中,JFrame類就是專門用做應(yīng)用程序窗口的一個類,因此它也被稱做應(yīng)用程序框架窗口。設(shè)計一個GUI程序時,先要在程序中創(chuàng)建一個JFrame類的對象,以該對象作為程序的框架窗口,然后在框架窗口中放入其他組件。

JFrame窗口有標題欄,通過鼠標可以自由拖動并放置;在JFrame窗口的右上角有最小化、最大化和關(guān)閉按鈕。

1)?JFrame類的層次結(jié)構(gòu)JFrame容器類的繼承層次結(jié)構(gòu)如下:java.lang.Object∟java.awt.Component∟java.awt.Container∟javax.awt.Window∟javax.awt.Frame∟javax.swing.JFrame頂層容器類JFrame間接地繼承了Container類,Container類是所有容器類的父類。該類中定義了容器所要用到的屬性及方法,其中最常用的三個方法是:●?add(Componentomp):將一個組件添加到一個容器中。例如案例9-1的27~30行?!?setLayout(LayoutManagermgr):設(shè)置容器的布局管理器。例如案例9-1的18行?!?remove(Componentomp):從此容器中移去指定組件。從以上方法可以看出,任何容器中都可以添加組件,也可以設(shè)置一個容器的布局管理器,或從一個容器中將一個組件移去。由于JFrame間接地繼承了Container類,因此它也可以使用Container類定義的方法。

2)創(chuàng)建一個框架窗口創(chuàng)建JFrame時,常用的構(gòu)造方法是:●?JFrame():新建一個框架窗口,在默認狀態(tài)下,創(chuàng)建后的框架窗口是不可見的(即在創(chuàng)建一個框架窗口后,并不會立即將其顯示在屏幕上)?!?JFrame(Stringtitle):創(chuàng)建一個新的、初始不可見的、具有指定標題的框架窗口。如案例9-1的第14行。

3)框架窗口可以進行的操作

JFrame除了可以使用表9-1所示的方法外,其他常用的操作方法有:●?setVisible(booleanb)):由于默認情況下新建的JFrame窗口是不可見的,因此要使用setVisible(true)方法將窗口設(shè)置為可見狀態(tài)后,窗口才可以顯示在屏幕上。例如案例9-1的35行?!?setTitle(Stringtitle):設(shè)置框架窗口的標題?!?setSize(intwidth,intheight):設(shè)置框架窗口的大小。例如案例9-1的33行?!?setIconImage(Imageimage):設(shè)置框架窗口要顯示在最小化圖標中的圖像?!?pack():調(diào)整此窗口的大小,以適合其子組件的顯示。●?setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE):在默認狀態(tài)下,框架窗口右上角的關(guān)閉按鈕是不能正常關(guān)閉窗口的,使用該方法后,單擊關(guān)閉按鈕時,應(yīng)用程序正常退出。例如案例9-1的37行。注意:JFrame提供了大量的方法,在使用過程中可以查看JavaAPI文檔。

4)給框架窗口添加組件在創(chuàng)建好一個框架窗口后,如何向框架窗口添加組件呢?

Swing組件不能直接添加到一個框架窗口中,而要添加到一個包含在框架窗口內(nèi)的內(nèi)容面板(contentpane)中。內(nèi)容面板是框架窗口這種頂層容器包含的一個普通容器,當我們要給框架窗口添加組件時,只能添加到內(nèi)容面板。具體操作過程是:●用getContentPane()方法獲得JFrame的內(nèi)容面板。如案例9-1的第16行?!裼胊dd()方法將組件添加到內(nèi)容面板。如案例9-1的第27~30行。向JFrame容器中添加組件的另一種方法是,先建立一個JPanel類的對象(一般叫面板(即中間容器)),再將創(chuàng)建好的其他組件添加到JPanel面板中,然后用setContentPane()方法將JPanel面板設(shè)置為JFrame的內(nèi)容面板。具體操作過程如下:JFrameframe=newJFrame();JPanelcontentPane=newJPanel();contentPane.add(newJButton("退出"));frame.setContentPane(contentPane);這里使用的JPanel本身也是一種容器,該容器常稱為面板,事先設(shè)計好的其他組件可以放入一個面板中,而面板必須添加到一個頂層容器中(如框架窗口中)才能顯示出來。因此,面板是可以嵌套使用的。使用多層的嵌套面板來組織和管理多個組件,是GUI程序設(shè)計中常用的技巧。注意:一個組件只能在某一個容器中放置一次。如果一個組件已經(jīng)在一個容器中,而要將其放置在其他容器中,則這個組件就會從一個容器中被清除。

2.創(chuàng)建對話框(JDialog)可以用JDialog來創(chuàng)建一個對話框。對話框分為模式對話框和非模式對話框。模式對話框只能在結(jié)束對話框的操作后回到原來的窗口,而非模式對話框可以在對話框與其所屬的窗口之間互相切換。另外,一個對話框必須以另一個對話框或框架窗口(JFrame)作為其擁有者,即一個對話框要依附于另一個對話框或框架窗口。這與JFrame不同,JFrame可獨立地存在。創(chuàng)建JDialog對話框常用的構(gòu)造方法是:●?JDialog():新建一個無標題的非模式對話框?!?JDialog(Dialogowner,booleanmodal):新建一個無標題的、由modal指定其模式的對話框,modal為true時為模式對話框?!?JDialog(Frameowner,Stringtitle,booleanmodal):新建一個標題為title、由modal指定其模式的對話框。以上構(gòu)造方法由owner指出其擁有者。

3.創(chuàng)建簡單的對話框?qū)υ捒蚴菓?yīng)用程序最常用的組件,使用JDialog創(chuàng)建一個對話框的過程比較繁瑣,需要向?qū)υ捒蛑刑砑痈鞣N組件才能使其成為一個可用的對話框。對于一些常用的比較簡單的對話框,可以使用javax.swing包中JOptionPane類提供的靜態(tài)方法將對話框直接顯示出來,以簡化程序的設(shè)計。

JOptionPane類提供的對話框有三種基本格式:輸出信息對話框、輸入信息對話框和確認對話框。這些對話框的顯示由形如show×××Dialog的靜態(tài)方法完成。下面舉例說明其用法:

1)顯示一個輸出信息對話框顯示一個輸出信息對話框時,要使用JOptionPane類的showMessageDialog方法,該方法一般要指定一個顯示該對話框的父窗口。例如:JFramef=newJFrame();…JOptionPane.showMessageDialog(f,"Hello,Java!");JOptionPane.showMessageDialog(f,"Hello,Java!",

"這是一個有標題的輸出信息窗口!",JOptionPane.INFORMATION_MESSAGE);該程序段執(zhí)行的結(jié)果如圖9-4所示。圖9-4輸出信息對話框(a)(b)以上兩個方法在父窗口f中顯示了一個輸出信息對話框,對話框的內(nèi)容為"Hello,Java!"。前面一個對話框使用默認的標題“消息”,如圖9-4(a)所示;后一個對話框指定了名為“這是一個有標題的輸出信息窗口!”的標題,并指定輸出信息的類型,如圖9-4(b)所示。

showMessageDialog方法也可以將父窗口指定為空(即NULL),例如:JOptionPane.showMessageDialog(NULL,"Hello,Java!");輸出的信息可以用JOptionPane類的常量指出:●?ERROR_MESSAGE:包括一個出錯圖標?!?WARNING_MESSAGE:包括一個警告圖標?!?QUESTION_MESSAGE:包括一個問題圖標?!?PLAIN_MESSAGE:沒有圖標。●?INFORMATION_MESSAGE:包括一個信息圖標。

2)顯示一個輸入信息對話框顯示一個要求用戶鍵入字符串(String)信息的對話框時,要使用JOptionPane類的showInputDialog靜態(tài)方法。例如:StringinputValue=JOptionPane.showInputDialog("Pleaseinputavalue");如果要求輸入的是一個實數(shù),則可以用如下語句:floatval=Float.parseFloat(JOptionPane.showInputDialog("Pleaseinputavalue"));該行程序執(zhí)行的結(jié)果如圖9-5所示。圖9-5輸入信息對話框

3)顯示一個確認對話框在GUI程序中,如果對用戶的輸入或選擇等操作要進行簡單的確認,則可以使用JOptionPane類的showConfirmDialog靜態(tài)方法。例如:JFramefrm=newJFrame("文本轉(zhuǎn)換器程序");JOptionPane.showConfirmDialog(frm,"請確認您要修改嗎?","請確認",JOptionPane.YES_NO_CANCEL_OPTION);JOptionPane.showConfirmDialog(frm,"請確認您要修改嗎?","請確認",JOptionPane.YES_NO_OPTION);該例中使用的showConfirmDialog方法有4個參數(shù),分別指出父窗口、確認對話框提示信息、確認對話框名稱和確認對話框格式。以上程序段的執(zhí)行結(jié)果如圖9-6所示,其中圖9-6(a)為前一個showConfirmDialog方法顯示的對話框,圖9-6(b)為后一個showConfirmDialog方法顯示的對話框.圖9-6確認對話框(a)(b)

showConfirmDialog方法根據(jù)用戶的不同選擇,返回不同的整型常量值,具體情況如下:●?YES_OPTION:選擇YES時從類方法返回的值;●?NO_OPTION:選擇NO時的返回值;●?CANCEL_OPTION:選擇CANCEL時的返回值;●?CLOSED_OPTION:用戶沒有做出任何選擇而關(guān)閉了窗口時方法的返回值。9.2.2【案例9-2】求階乘的GUI程序

1.案例描述設(shè)計一個GUI程序:從鍵盤輸入一個整數(shù),求該數(shù)的階乘。

2.案例效果程序執(zhí)行后,從圖9-7(a)所示的對話框中輸入一個數(shù),單擊“確定”按鈕后,顯示如圖9-7(b)所示的結(jié)果信息對話框。在如圖9-7(b)所示的對話框中,單擊“確定”按鈕后,顯示如圖9-7(c)所示的對話框。如果還要求另一個數(shù)的階乘,則單擊圖9-7(c)對話框中的“是”按鈕。圖9-7案例9-2的執(zhí)行結(jié)果(a)圖9-7案例9-2的執(zhí)行結(jié)果(b)圖9-7案例9-2的執(zhí)行結(jié)果(c)

3.技術(shù)分析該GUI程序中只需要三個對話框,輸入整數(shù)后,可以使用JOptionPane類的輸入信息對話框;求出階乘后,可以使用輸出信息對話框顯示結(jié)果;是否還要繼續(xù)求另一個數(shù)的階乘,可以使用確認對話框?qū)崿F(xiàn)。由于輸入信息對話框輸入的是一個字符串,因此要使用Integer.parseInt方法將該字符串轉(zhuǎn)換成一個整數(shù)。求階乘的程序段可以使用for循環(huán)語句來實現(xiàn)。

4.程序解析下面是案例9-2的程序代碼:01//*********************************************02//案例:9-203//程序名:EvenOdd.java04//功能:求一個數(shù)的階乘05//*********************************************0607importjavax.swing.*;0809publicclassEvenOdd{10 publicstaticvoidmain(String[]args){11StringinputValue;12 longresult;//存放階乘的結(jié)果13 intagain;1415 do{16 result=1;17 inputValue=JOptionPane.showInputDialog("請輸入求階乘的數(shù):");18 intnum=Integer.parseInt(inputValue);19 20 //求階乘21 for(inti=1;i<=num;i++){22 result=result*i;23 }24 //輸出結(jié)果 25 JOptionPane.showMessageDialog(null,inputValue+"的階乘是:"+result);26 //顯示確認對話框27 again=JOptionPane.showConfirmDialog(null,"是否還要繼續(xù)求另一個數(shù)的階乘?");28 }29 while(again==JOptionPane.YES_OPTION);30 }31}

12行定義了一個long型的整型量保存結(jié)果。13行定義的again用于判斷是否還要求另一個數(shù)的階乘。27行將用戶從鍵盤上輸入的選擇信息賦給該變量。29行判別again的值是否為“JOptionPane.YES_OPTION”常量,即用戶是否按下了“是”按鈕,如果按下了“是”按鈕,則表示還要繼續(xù)求下一個數(shù)的階乘。

18行將用戶輸入的內(nèi)容(是一個字符串)轉(zhuǎn)換為整數(shù),21~23行求該數(shù)的階乘。25行將求出的結(jié)果顯示出來,27行顯示一個確認對話框。注意,25行和27行輸出對話框時第一個參數(shù)都為NULL,表示沒有定義對話框的父窗口,因為該程序中沒有必要定義框架窗口(JFrame)。9.2.3【相關(guān)知識】JFC介紹使用Swing編程時,會用到JFC的概念。JFC(JavaFoundationClasses)是Java基礎(chǔ)類的縮寫,它是一組支持在目前流行平臺上創(chuàng)建GUI程序和圖形功能程序的類的集合。使用JFC可以大大簡化Java應(yīng)用程序的開發(fā)和實現(xiàn)。JFC作為JDK1.2的一個有機組成部分,提供了幫助開發(fā)人員設(shè)計復(fù)雜應(yīng)用程序的一整套應(yīng)用程序開發(fā)包。

JFC主要包含以下幾個方面的內(nèi)容:●?AWT組件為各類Java應(yīng)用程序提供了多種GUI工具?!?Java2D是一個圖形API,它為Java應(yīng)用程序提供了一套高級的有關(guān)二維(2D)圖形圖像處理的類?!?AccessibilityAPI提供了一套高級工具,用以輔助開發(fā)使用非傳統(tǒng)輸入和輸出的應(yīng)用程序。它提供了一個輔助的技術(shù)接口,如觸摸屏、語音處理等?!?Drag&Drop技術(shù)提供了Java和本地應(yīng)用程序之間的互操作性,用來在Java應(yīng)用程序和不支持Java技術(shù)的應(yīng)用程序之間交換數(shù)據(jù)。●?Swing用來進行基于窗口的應(yīng)用程序開發(fā),它提供了一套豐富的組件和工作框架,以指定GUI如何獨立于平臺地展現(xiàn)其視覺效果。

JFC中最重要的內(nèi)容還是Swing,其他內(nèi)容在一些特別應(yīng)用領(lǐng)域才可能用到。這里介紹JFC的概念就是為了告訴讀者,使用Java語言可以設(shè)計出豐富多彩的應(yīng)用程序。9.3窗口中常用組件的設(shè)計一個窗口常常由若干個基本組件構(gòu)成。例如,圖9-8所示的登錄窗口由按鈕、標簽、文本框等組成。本節(jié)介紹如何使用基本組件設(shè)計一個應(yīng)用程序的窗口元素。圖9-8登錄窗口界面按鈕9.3.1在窗口中顯示信息與設(shè)置邊框

1.在窗口中顯示信息

1)標簽標簽上可以顯示文字、圖片或者既有文字又有圖片,如圖9-8所示。創(chuàng)建一個標簽要使用Swing中的JLabel組件。具體可以創(chuàng)建如下類型的標簽:●創(chuàng)建一個顯示文字信息的標簽。例如,下面的語句將創(chuàng)建一個圖9-8所示的“用戶”標簽:JLabellabUser=newJLabel("用戶");●創(chuàng)建一個顯示圖像的標簽。例如,下面的標簽將以文件“images/duke.gif”中的圖形作圖標:JLabelimageLabel=newJLabel(newImageIcon("images/duke.gif");●創(chuàng)建一個顯示文字和圖像的標簽。例如,要創(chuàng)建圖9-8所示的“密碼”標簽,可以使用下面的語句:JLabellabPwd=newJLabel("密碼",newImageIcon("images/key.gif"),SwingConstants.LEFT);以上三種創(chuàng)建標簽的方式中,都可以在構(gòu)造方法參數(shù)的最后使用一個表示對齊方式的參數(shù)。對齊方式有以下三種:●?SwingConstants.LEFT:左對齊方式?!?SwingConstants.CENTER:右對齊方式?!?SwingConstants.RIGHT:居中對齊方式。已創(chuàng)建的標簽可以使用setText方法設(shè)置標簽的內(nèi)容。如下面的語句將labUser標簽的內(nèi)容設(shè)置為User:labUser.setText("User");也可以用getText方法取得一個標簽的內(nèi)容,例如:Strings=labUser.getText();可以用setIcon方法給標簽設(shè)置一個圖像。如下面的語句是給labUser標簽設(shè)置圖像:labUser.setIcon(newImageIcon("images/user.gif"));

2)顯示組件的提示信息為了方便用戶使用軟件,當鼠標移動到一個窗口中的組件上時,應(yīng)該可以顯示出該組件的有關(guān)提示和說明信息。Swing中的每個組件都可以使用setToolTipText方法設(shè)置提示信息。如要給上面創(chuàng)建的labPwd標簽設(shè)置提示信息,可以使用如下的語句:labPwd.setToolTipText("這是一個用JLabel類創(chuàng)建的密碼標簽");這樣,當鼠標移到labPwd標簽上時,顯示“這是一個用JLabel類創(chuàng)建的密碼標簽”提示信息。

2.設(shè)置窗口邊框在圖9-8所示的窗口中,將所有組件放在了一個帶邊框的結(jié)構(gòu)中,邊框顯示的名稱叫“用戶登錄窗口”。給組件設(shè)置邊框是Swing組件的一個新特色,可以在Swing組件的任何對象上設(shè)置一個邊框。在相關(guān)用戶界面組件的面板上加一個標題邊框,是設(shè)計界面時常見的做法。給一個組件添加邊框的步驟是:先使用BorderFactory類提供的靜態(tài)方法創(chuàng)建一種邊框類型,然后使用組件類的setBorder方法設(shè)置邊框。BorderFactory類中提供的創(chuàng)建邊框的主要靜態(tài)方法有:●?createEtchedBorder():創(chuàng)建一個具有“浮雕化”外觀效果的邊框,將組件的當前背景色用于突出顯示和陰影顯示?!?createLineBorder(Colorcolor,intthickness):創(chuàng)建一個具有指定顏色和寬度的邊框?!?createLoweredBevelBorder():創(chuàng)建一個具有凹入斜面邊緣的邊框,將組件當前背景色的較亮的色度用于突出顯示,較暗的色度用于陰影顯示。●?createRaisedBevelBorder():創(chuàng)建一個具有凸出斜面邊緣的邊框,將組件當前背景色的較亮的色度用于突出顯示,較暗的色度用于陰影顯示。●?createTitledBorder(Stringtitle):創(chuàng)建一個有標題的邊框(TitledBorder類),使用默認邊框(浮雕化)、默認文本位置(位于頂線上)及當前外觀確定的默認字體和文本顏色,并指定了標題文本。圖9-8的窗口邊框是用如下的語句設(shè)置的:setBorder(BorderFactory.createTitledBorder("用戶登錄窗口"));圖9-9是以上各種邊框的樣式圖。圖9-9邊框示例圖9-9所示的窗口程序代碼如下:01importjava.awt.*;02importjavax.swing.*;0304publicclassBorderDemo{05 publicstaticvoidmain(String[]args){06 JFramefrm=newJFrame("邊框示例");07 Containercp=frm.getContentPane();08 cp.setLayout(newGridLayout(3,2,5,10));09 10 JPanelp1=newJPanel();11 JPanelp2=newJPanel();12 JPanelp3=newJPanel();13 JPanelp4=newJPanel();14 JPanelp5=newJPanel();15 16 JLabellabel1=newJLabel("EtchedBorder");17 JLabellabel2=newJLabel("LineBorder");18 JLabellabel3=newJLabel("LoweredBevelBorder");19 JLabellabel4=newJLabel("RaisedBevelBorder");20 JLabellabel5=newJLabel("TitledBorder");21 22 p1.add(label1);23 p1.setBorder(BorderFactory.createEtchedBorder());24 cp.add(p1);25 26 p2.add(label2);27 p2.setBorder(BorderFactory.createLineBorder

(Color.BLUE,4));28 cp.add(p2);29 30 p3.add(label3);31 p3.setBorder(BorderFactory.createLowered

BevelBorder());32 cp.add(p3);33 34 p4.add(label4);35 p4.setBorder(BorderFactory.createRaisedBevelBorder

());36 cp.add(p4);37 38 p5.add(label5);39 p5.setBorder(BorderFactory.createTitledBorder

("Title"));40 cp.add(p5);4142 frm.setDefaultCloseOperation(JFrame.EXIT

_ON_CLOSE);43 frm.setSize(500,200);44 frm.setVisible(true);45 }46}9.3.2在窗口中輸入文本信息使用一個GUI程序時,用戶經(jīng)常要通過輸入一些信息來與程序進行交互,如在圖9-8所示的窗口中要輸入用戶名和密碼信息。在Swing中,提供了文本框、密碼框等多種類型的文本輸入組件,這些組件都可以對用戶輸入的信息進行編輯。

Java提供的各種文本框類都繼承自JTextComponent抽象類,如圖9-2所示。下面介紹幾種常用文本框的設(shè)計方法。

1.輸入單行文本的文本框創(chuàng)建一個輸入單行文本的文本框要使用JTextField類。JTextField文本框的字符輸入?yún)^(qū)允許用戶輸入各種數(shù)據(jù),如姓名和描述文字??梢杂萌缦碌姆椒▌?chuàng)建一個單行文本框:●創(chuàng)建一個空文本框。例如:JTextFieldtxtField=newJTextField();●創(chuàng)建一個指定列數(shù)的空文本框。例如,可以用如下的語句創(chuàng)建圖9-8所示的輸入用戶名的文本框,文本框的列寬為12:JTextFieldtxtUser=newJTextField(12);●創(chuàng)建一個顯示指定初始文字信息的文本框。例如,下面的語句創(chuàng)建的文本框在初始狀態(tài)下將顯示“男”,列寬為8:JTextFieldtxtSex=newJTextField("男",8);JTextField常用的方法有:●?getText():該方法取得顯示在文本框中的字符串?!?setText(Stringtext):該方法將指定的字符串text寫入文本框中?!?setEditable(booleaneditable):該方法設(shè)置文本框的可編輯性,默認為true,表示可編輯。●?setColumns(int):該方法設(shè)置文本框的列數(shù)。

2.輸入多行文本的文本區(qū)如果想讓用戶輸入多行文本,則可以創(chuàng)建多個JTextField類的實例來實現(xiàn),但更好的方法是使用JTextArea組件直接創(chuàng)建一個輸入多行文本的文本區(qū)??梢杂萌缦碌姆椒▌?chuàng)建一個多行文本區(qū):●創(chuàng)建一個空的文本區(qū)。例如:JTextAreatxtArea1=newJTextArea();●創(chuàng)建一個指定行數(shù)和列數(shù)的文本區(qū)。例如:JTextAreatxtArea2=newJTextArea(5,20);//創(chuàng)建一個5行20列的文本區(qū)●創(chuàng)建初始時顯示指定文本、具有確定行數(shù)和列數(shù)的文本區(qū)。例如:JTextAreatxtArea3=newJTextArea("這是一個文本區(qū)",5,20);JTextArea常用的方法主要有在文本區(qū)中插入、追加和替換文本的方法,如:●?insert(Strings,intpos):將字符串s插入到文本區(qū)的指定位置pos?!?append(Strings):將字符串s添加到文本的末尾?!?replaceRange(Strings,intstart,intend):用字符串s替換文本中從位置start到end的文字。JTextArea也可以使用getText、setText、setEditable、setRows、getRows、setColumns、getColumns等方法。

3.密碼框密碼框與單行文本框非常類似,所不同的是,單行文本框中將顯示用戶輸入的內(nèi)容,而密碼框中則用“*”代替用戶輸入的內(nèi)容,如圖9-8所示。創(chuàng)建密碼框要用JPasswordField組件,創(chuàng)建方法與單行文本框的創(chuàng)建類似。例如,圖9-8中的密碼框可以用下面的語句創(chuàng)建:PasswordFieldtxtPwd=newJPasswordField(12);密碼框常用的方法有:●?getEchoChar():該方法返回用于回顯的字符。●?getPassword():該方法取得密碼框中的文本內(nèi)容?!?setEchoChar(charc):該方法用于設(shè)置回顯的字符。9.3.3【案例9-3】設(shè)計一個用戶登錄界面程序圖9-8所示的用戶登錄界面的程序如下:01//**********************************************02//案例:9-303//程序名:Login.java04//功能:用戶登錄界面程序05//**********************************************0607importjava.awt.*;08importjavax.swing.*;0910publicclassLoginextendsJFrame{11privateJLabellabUser=newJLabel("用戶");12privateJTextFieldtxtUser=newJTextField(12);13privateJLabellabPwd=newJLabel("密碼");14privateJPasswordFieldtxtPwd=newJPasswordField(12);15privateJButtonbtnLogin=newJButton("登錄");16privateJButtonbtnCancel=newJButton("取消"); 17privateJPanelp=newJPanel();18 19publicLogin(Strings){20super(s);//調(diào)用JFrame的構(gòu)造方法2122//設(shè)置各組件的圖標23labUser.setIcon(newImageIcon("images/user.gif"));24labPwd.setIcon(newImageIcon("images/key.gif"));25btnLogin.setIcon(newImageIcon("images/ok.gif")); 26btnCancel.setIcon(newImageIcon("images/cancel.gif")); 2728 //設(shè)置兩個文本框和面板的邊框29 txtUser.setBorder(BorderFactory.createRaisedBevel

Border());30 txtPwd.setBorder(BorderFactory.createRaisedBevel

Border());31 p.setBorder(BorderFactory.createTitledBorder

("用戶登錄窗口"));32 33 //設(shè)置兩個文本框提示信息34 txtUser.setToolTipText("請輸入用戶名");35 txtPwd.setToolTipText("請輸入登錄密碼");3637

p.add(labUser);38p.add(txtUser);39p.add(labPwd);40p.add(txtPwd);41p.add(btnLogin);42p.add(btnCancel);43this.getContentPane().add(p);4445this.setSize(250,160);46this.setVisible(true);47this.setResizable(false);//窗口尺寸不可變48this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);4950//將登錄窗口顯示在屏幕中央位置51Dimensiond=

Toolkit.getDefaultToolkit().getScreenSize();52this.setLocation((d.width-200)/2,(d.height-120)/2);53}5455publicstaticvoidmain(String[]args){56 newLogin("登錄");57}58}該程序與案例9-1不同,在案例9-1中是通過生成一個JFrame類的實例來創(chuàng)建一個窗口的,而該程序是通過繼承JFrame類來建立一個用戶自己的窗口類Login(第10行),然后在56行創(chuàng)建了一個Login類的實例,即創(chuàng)建了一個框架窗口。該窗口在17行創(chuàng)建了一個面板,在37~42行將窗口中的所有組件放到該面板中。

51行使用AWT包中的Toolkit類的getDefaultToolkit方法獲取當前默認的工具包,然后使用Toolkit類的getScreenSize方法取得當前屏幕的大小。?在52行使用JFrame的setLocation方法將要顯示的窗口放在屏幕中央位置。9.3.4在窗口中設(shè)計按鈕按鈕是GUI程序中最常用的一類組件。Java中的按鈕類都繼承自抽象類AbstractButton,如圖9-2所示。常用的按鈕組件有普通按鈕(JButton)、多選按鈕(JCheckBox)、單選按鈕(JRadioButton)等。如圖9-10所示的窗口是一個含有三種按鈕的窗口。圖9-10按鈕示例按鈕類常用的操作有:●取得(getText)或設(shè)置(setText)按鈕文字;●取得(getIcon)或設(shè)置(setIcon)按鈕圖標;●設(shè)置按鈕處于不可按狀態(tài)時的圖標(setDisabledIcon);●設(shè)置按鈕處于按下狀態(tài)時的圖標(setPressedIcon);●設(shè)置按鈕處于被選擇狀態(tài)時的圖標(setSelectedIcon);●返回按鈕的狀態(tài)(isSelected)。

1.普通按鈕(JButton)在用戶點擊普通按鈕時,表示要進行某種操作,如圖9-8所示的“登錄”按鈕和“取消”按鈕。創(chuàng)建一個普通按鈕要使用JButton組件,創(chuàng)建方法如下:●創(chuàng)建一個空按鈕。例如:JButtonbtn1=newJButton();●創(chuàng)建一個含有指定文字的按鈕。例如,創(chuàng)建圖9-8所示的“登錄”按鈕和“取消”按鈕:JButtonbtnLogin=newJButton("登錄");JButtonbtnCancel=newJButton("取消");●創(chuàng)建一個含有指定圖標的按鈕。例如:JButtonbtn2=newJButton(newImageIcon("images/duke.gif"));●創(chuàng)建一個含有指定文字和圖標的按鈕。例如:JButtonbtn3=newJButton("取消",newImageIcon("images/cancel.gif"));可以使用setText方法給一個按鈕設(shè)置要顯示的文字,也可以使用setIcon方法設(shè)置一個按鈕的圖標。給一個指定的按鈕可以設(shè)置一個熱鍵,這樣,當同時按下Alt鍵和指定熱鍵時,相當于按下了該按鈕。例如:btnLogin.setMnemonic(‘L’); //給登錄按鈕設(shè)置的熱鍵為LbtnCancel.setMnemonic(‘C’); //給取消按鈕設(shè)置的熱鍵為C

2.多選按鈕(JCheckBox)多選按鈕常稱為復(fù)選框,一個復(fù)選框可處于“選中”與“未選中”狀態(tài),通過鼠標的單擊操作可以改變復(fù)選框的選中狀態(tài)。創(chuàng)建一個復(fù)選框要使用JCheckBox組件。常用復(fù)選框的創(chuàng)建方法如下:●創(chuàng)建一個帶圖標的復(fù)選框,并指定其最初狀態(tài)是否處于選定狀態(tài)。例如,圖9-10中的“體育”復(fù)選框可以用如下的語句創(chuàng)建:JCheckBoxchkBox2=newJCheckBox("體育");●創(chuàng)建一個帶文本的復(fù)選框,并指定其最初是否處于選定狀態(tài)。例如,圖9-10中的“文學”復(fù)選框可以用如下的語句創(chuàng)建:

JCheckBoxchkBox1=newJCheckBox("文學",true);

//true表示初始狀態(tài)為選定狀態(tài)●創(chuàng)建一個帶文本和圖標的復(fù)選框。例如:JCheckBoxchkBox=newJCheckBox("文學",newImageIcon("images/duke.gif");●創(chuàng)建一個帶文本和圖標的復(fù)選框,并指定其最初是否處于選定狀態(tài)。例如:JCheckBoxchkBox=newJCheckBox("文學",newImageIcon("images/duke.gif"),true);一個復(fù)選框是否被選中,可以使用isSelected()方法進行判別。如果處于選中狀態(tài),則該方法返回true,否則返回false。

3.單選按鈕(JRadioButton)在一組單選按鈕中,只能有一個處于選中狀態(tài)。創(chuàng)建一個單選按鈕要使用JRadioButton組件和ButtonGroup組件。JRadioButton組件用于創(chuàng)建一個單選按鈕,ButtonGroup組件用于確定一個單選按鈕組。常用單選按鈕的創(chuàng)建方法如下:●創(chuàng)建一個初始狀態(tài)為未選中狀態(tài)的單選按鈕,其具有指定的圖像但無文本。例如:JRadioButtonradio1=newJRadioButton(newImageIcon("images/duke.gif"))●創(chuàng)建一個具有指定圖像和選擇狀態(tài)的單選按鈕,但無文本。例如:JRadioButtonradio2=newJRadioButton(newImageIcon("images/duke.gif"),true);//true表示處于選定狀態(tài)●創(chuàng)建一個具有指定文本且初始狀態(tài)為未選擇的單選按鈕。例如,圖9-10中的“女”單選框可以用如下的語句創(chuàng)建:JRadioButtonradioButton2=newJRadioButton("女");●創(chuàng)建一個具有指定文本和選擇狀態(tài)的單選按鈕。例如,圖9-10中的“男”單選框可以用如下的語句創(chuàng)建:JRadioButtonradioButton1=newJRadioButton("男",true); //true表示處于選定狀態(tài)●創(chuàng)建一個具有指定的文本、圖像和選擇狀態(tài)的單選按鈕。例如:JRadioButtonradio3=newJRadioButton(newImageIcon("中國","images/duke.gif"),true);單選按鈕在創(chuàng)建完成后,要將其放入相應(yīng)的單選按鈕組中,這樣才能達到“多選一”的目標。創(chuàng)建一個單選按鈕組要使用ButtonGroup組件。例如,要將圖9-10中的“男”和“女”兩個單選項放入一個組,可以使用如下的語句:ButtonGroupbtg=newButtonGroup();btg.add(radioButton1);btg.add(radioButton2);9.3.5在窗口中設(shè)計列表框組件列表框組件的特點是在窗口界面中已經(jīng)提供了某個輸入的備選選項,用戶可以從中選擇一項作為其輸入。使用列表框可以減少用戶的輸入工作量,也可以減少用戶在輸入過程中的錯誤。下面介紹JComboBox組合框和JList列表框的使用方法。

1.組合框(JComboBox)如圖9-10中的“職業(yè)”選項使用了組合框。該組合框的設(shè)計方法是:

(1)創(chuàng)建一個包含有指定選項的字符串數(shù)組。例如:String[]item={"公務(wù)員","公司職員","教師","公司經(jīng)理"};

(2)以該數(shù)組為參數(shù)創(chuàng)建一個組合框。例如:JComboBoxcombox=newJComboBox(item);

(3)使用容器的add方法將其添加到某一個容器中。

JComboBox常用的方法有:●?addItem(Objectitem):在組合框中添加一個選項,它可以是任何對象。●?getItemAt(intindex):取得組合框中指定序號的選項?!?emoveItem(ObjectanObject):從組合框中刪除指定的項?!?removeAllItems():刪除組合框中所有的選項。

2.列表框(JList)列表框的作用和組合框的作用基本相同,但它允許用戶同時選擇多項。創(chuàng)建一個列表框的過程與創(chuàng)建組合框的過程類似,一般也是以一個字符串數(shù)組為參數(shù)創(chuàng)建一個列表框。例如:

JListlst=newJList(item);9.3.6【案例9-4】設(shè)計一個個人信息選擇窗口該案例的執(zhí)行結(jié)果如圖9-10所示。程序代碼如下:01//***********************************************02//案例:9-403//程序名:SelectGUI.java04//功能:個人信息選擇窗口05//***********************************************0607importjava.awt.*;08importjavax.swing.*;0910publicclassSelectGUIextendsJFrame{11privateJCheckBoxchkBox1=newJCheckBox("文學",true);12privateJCheckBoxchkBox2=newJCheckBox("體育");13privateJCheckBoxchkBox3=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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論