JAVA語言程序設(shè)計(jì) 圖形用戶界面
《JAVA語言程序設(shè)計(jì) 圖形用戶界面》由會員分享,可在線閱讀,更多相關(guān)《JAVA語言程序設(shè)計(jì) 圖形用戶界面(71頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、第第7 7章章 圖形用戶界面圖形用戶界面2主要內(nèi)容n7.1 Java GUI概述nSwing組件nSwing容器(重點(diǎn):JFrame類)n7.2 圖形與繪圖n7.3 事件處理與Swing常用組件nJava事件處理機(jī)制n常用組件n7.4 布局管理器37.1 Java GUI概述7.1.1 AWT與SwingAWT組件:Java 2版本之前的Java平臺提供的一套圖形用戶界面;java.awt包中包含了一個完整的類集以支持GUI程序的設(shè)計(jì);重量級組件,平臺相關(guān);沒有彈性,缺乏效率。Swing組件:建立在AWT組件之上;輕量級組件,平臺無關(guān);有彈性;效率高;豐富的視覺感受。47.1.2 Swing組
2、件Swing組件都是AWT的Container類的直接子類和間接子類。57.1.2 Swing組件Swing組件以J開頭,除了有與AWT類似的按鈕(JButton)、標(biāo)簽(JLabel)、復(fù)選框(JCheckBox)、菜單(JMenu)等基本組件外,還增加了一個豐富的高層組件集合,如表格(JTable)、樹(JTree)。Swing組件從功能上分:(參見表7。1)容器組件(頂層容器,中間層容器,特殊容器)原子組件(基本組件,不可編輯組件,可編輯組件)原子組件必須加在容器組件內(nèi)。7.1.3 Swing容器 容器(Container)也是一個類,實(shí)際上是Component的子類,因此容器本身也是一
3、個組件,具有組件的所有性質(zhì),但是它的主要功能是容納其它組件和容器。1)容器可以簡化圖形化界面的設(shè)計(jì),以整體結(jié)構(gòu)來布置界面。2)所有的容器都可以通過add()方法向容器中添加組件。6Swing容器層次結(jié)構(gòu)頂層容器頂層容器JLayeredPaneJLayeredPaneJRootPaneJRootPaneJContentPaneJContentPaneJGlassPaneJGlassPaneJMenuBarJMenuBarJRootPaneJRootPane(根面板)根面板):虛擬容器,無法操作。JLayeredPaneJLayeredPane(層次面板)層次面板):管理菜單欄和內(nèi)容面板。JCon
4、tentPaneJContentPane(內(nèi)容面板)內(nèi)容面板):Swing組件不能直接加入到的頂層容器中,必須添加到頂層容器的內(nèi)容面板上。JGlassPaneJGlassPane(玻璃面板)玻璃面板):用來產(chǎn)生繪圖效果及觸發(fā)窗口程序的各種事件。注注:中間層容器沒有根面板,不能在桌面上浮動,必須添加到頂層容器中才能顯示。7容器分類n頂層容器窗體nJFrame;JWindow;JApplet;n對話框JDialog(JOptionPane)n中間層容器n面板JPanel;滾動窗格JScrollPane,JScrollBar;拆分窗格JSplitPane;索查標(biāo)簽窗格JTabbedPanen特殊容器
5、n內(nèi)部窗體JInternalFrame;分層窗格JLayeredPane;根窗格JRootPane81.框架窗口JFrame框架窗口是一種窗體,其中帶有邊框、標(biāo)題欄及用于關(guān)閉和最大/最小化窗口的圖標(biāo)等,簡稱窗口。1。JFrame構(gòu)造方法主要有:nJFrame(),建立一個無標(biāo)題的JFrame。nJFrame(String title),建立一個標(biāo)題為title的JFrame。窗口的基本操作:(1)創(chuàng)建窗口 JFrame frame=new JFrame();(2)設(shè)置標(biāo)題JFrame frame=new JFrame(“窗口示例”);或者:JFrame myFrame=new JFrame()
6、;myFrame.setTitle(“窗口示例”);(3)設(shè)置初始位置setLocation(int x,int y)(4)設(shè)置大小setSize(int width,int height)(5)設(shè)置圖標(biāo)setIconImage(Icon icon)9框架窗口JFrame(6)定義關(guān)閉行為setDefaultCloseOperation(int operation)。operation取值:nDO_NOTHING_ON_CLOSE:當(dāng)窗口關(guān)閉時,不做任何處理;nHIDE_ON_CLOSE:當(dāng)窗口關(guān)閉時,隱藏這個窗口;nDISPOSE_ON_CLOSE:當(dāng)窗口關(guān)閉時,隱藏并處理這個窗口;nEXI
7、T_ON_CLOSE:當(dāng)窗口關(guān)閉時,退出程序。n默認(rèn)是HIDE_ON_CLOSE。(7)添加組件兩種方式:n用getContentPane()方法獲得JFrame的內(nèi)容面板,再對其加入組件:frame.getContentPane().add(childComponent)n建立一個JPanel或 JDesktopPane之類的中間容器,把組件添加到容器中,用setContentPane()方法把該容器置為JFrame的內(nèi)容面板:JPanel conPane=new JPanel();/把其它組件添加到JPanel中;frame.setContentPane(conPane);/把conPan
8、e對象設(shè)置成為frame的內(nèi)容面板 10框架窗口JFrame【例7.1】建立一個標(biāo)題為“Swing窗口”,大小為(300,200),圖標(biāo)為javalogo.gif,位置居中的窗口。屏幕效果如圖所示。11Swing容器2.無邊框的窗口JWindowJWindow可以構(gòu)造無邊框的窗口。主要構(gòu)造方法有:nJWindow():創(chuàng)建一個無邊界的窗口;nJWindow(Frame owner):創(chuàng)建一個依賴Frame對象的窗口。3對話框JDialog 對話框與框架窗口類似,是有邊框、有標(biāo)題、可獨(dú)立存在的頂級容器。對話框分為無模態(tài)對話框和模態(tài)對話框(只響應(yīng)對話框內(nèi)的事件)。構(gòu)造方法有:nJDialog(Fr
9、ame owner);nJDialog(Frame owner,Boolean modal);nJDialog(Frame owner,String title);nJDialog(Frame owner,String title,Boolean modal);4面板JPanelJPanel是一個非頂級的通用容器,總是處于其它一些容器中。JPanel不能象JFrame那樣能夠在桌面上浮動。利用JPanel可以使版面的排列方式更生動,對于復(fù)雜GUI,通常由多個面板組成,而每個面板以特定的布局來排列組件。JPanel的構(gòu)造方法有:nJPanel();nJPanel(boolean isDouble
10、Buffered);nJPanel(LayoutManager layout);nJPanel(LayoutManager layout,boolean isDoubleBuffered);12Swing容器5.分割面板JSplitPane一次可將兩個組件同時顯示在兩個顯示區(qū)中,若想要同時在多個顯示區(qū)顯示組件,便必須同時使用多個JSplitPane。JSplitPane提供兩個常數(shù):HORIZONTAL_SPLIT、VERTICAL_SPLIT,用來設(shè)置水平分割或是垂直分割。6.JTabbedPane如果一個窗口的功能有幾項(xiàng),可以給每項(xiàng)設(shè)置一個標(biāo)簽,每個標(biāo)簽下面包含為完成此功能專用的若干組件。
11、用戶要使用哪項(xiàng)功能,只要單擊相應(yīng)的標(biāo)簽,就可以進(jìn)入相應(yīng)的頁面。這種選項(xiàng)卡功能的實(shí)現(xiàn)就需要使用JTabbedPane這個中間層容器。7.滾動面板JScrollPane當(dāng)容器內(nèi)要容納的內(nèi)容大于容器時,希望容器能夠有一個滾動條,通過拖動滑塊,就可以看到更多的內(nèi)容。JScrollPane就是能夠?qū)崿F(xiàn)這種功能的容器。8.JInternalFrame使用JInternalFrame容器類可以實(shí)現(xiàn)在一個主窗口中打開很多個文檔,每個文檔各自占用一個新的窗口。JInternalFrame的使用跟JFrame幾乎一樣,可以最大化、最小化、關(guān)閉窗口、加入菜單;唯一不同的是JInternalFrame是輕量級組件,它
12、只能是中間容器,必須依附于頂層容器上。137.1.4 基于Swing的Java GUI設(shè)計(jì)思路構(gòu)造用戶界面主要包括下述幾個概念:組件Component (API)容器-Container布局管理器LayoutManager事件處理在Java中,開發(fā)一個GUI程序,通常需要以下幾步:(1)構(gòu)建一個頂層容器;通常是JFrame或JApplet(2)構(gòu)建若干個組件,組件可以是其它容器(因?yàn)槿萜饕彩墙M件);(3)設(shè)定容器的布局管理器;用容器的add方法將這些組件加入到這個容器中;(4)設(shè)置組件事件;并將組件事件與代碼關(guān)聯(lián)。147.2 圖形與繪圖7.2.1 繪圖表面在Swing程序中可以直接在頂層窗口(
13、通常是JApplet和JFrame)上繪圖,或者在JPanel的子類上繪圖。7.2.2 圖形環(huán)境和圖形對象GUI組件(諸如applet或窗口)的左上角坐標(biāo)默認(rèn)為(0,0),坐標(biāo)對由一個x坐標(biāo)(水平坐標(biāo))和一個y坐標(biāo)(垂直坐標(biāo))組成。(x,y)(0,0)x軸y軸+x+y15圖形環(huán)境和圖形對象在屏幕上繪圖要使用Java圖形環(huán)境,每個Java組件(包括Swing組件),都有一個與之關(guān)聯(lián)的圖形環(huán)境,也稱圖形上下文,用java.awt.Graphics類的一個對象來表示。Graphics對象用于管理圖形環(huán)境,并在屏幕上繪制代表文本或其它圖形對象(如線條、橢圓、矩形或其它多邊形)的像素。Graphics
14、類是所有圖形上下文的抽象基類,允許應(yīng)用程序?qū)D形繪制到由不同設(shè)備實(shí)現(xiàn)的組件上,以及繪制到空閑屏幕的映像中。一個 Graphics 對象封裝有 Java 所支持的基本繪圖操作所需的狀態(tài)信息。此狀態(tài)信息包括下列屬性:n要被繪制到其上的組件對象;n繪制和剪貼坐標(biāo)的平移原點(diǎn);n當(dāng)前的剪貼區(qū);n當(dāng)前顏色;n當(dāng)前的字體;n當(dāng)前的邏輯像素操作函數(shù)(XOR 或 Paint);16圖形圖像處理類Graphics類常用方法1)畫線g.drawLine(xcenter,ycenter,xs,ys);2)畫圓g.drawArc(xcenter-50,ycenter-50,100,100,0,360);3)繪制字符串
15、g.drawString(lastdate,5,125)4)設(shè)置字體 g.setFont(clockFaceFont);Font clockFaceFont=new Font(Serif,Font.PLAIN,14);5)設(shè)置顏色 g.setColor(handColor);Color handColor=Color.blue;177.2.3 顏色njava.awt.Color類定義了顏色常量和方法。每種顏色都是從RGB值創(chuàng)建出來的。public Color(int r,int g,int b);n預(yù)定義了13個顏色常量。見表7.4nColor類的常用方法見表7.5187.2.4 字體 jav
16、a.awt.Font類:字體是從字形創(chuàng)建的,一個字形是一個位映射圖像,它定義字體中的字符和符號的外觀。Font clockFaceFont=new Font(Serif,Font.PLAIN,14);Font類的構(gòu)造函數(shù)有3個參數(shù):字體名稱、字體風(fēng)格和字體大小。1)字體名稱可以是運(yùn)行程序的當(dāng)前系統(tǒng)所支持的任何字體,在Java1.1和以后的版本中,所支持的字體名字有Monospaced、SansSerif、Serif、Dialog和DialogInput。2)字體風(fēng)格public final static int PLAIN一個代表普通字體風(fēng)格的常量public final static int
17、 BOLD一個代表粗體字體風(fēng)格的常量public final static int ITALIC一個代表斜體字體風(fēng)格的常量也可以是BOLD與ITALIC的結(jié)合197.2.5 使用Graphics類繪圖當(dāng)在AWT組件和Swing頂層窗口(JApplet和JFrame,是java.awt.Component的子類)上繪圖時,需要重寫組件的paint()方法;當(dāng)在Swing的JComponent的子類組件上繪圖時,則需重寫paintComponent()方法。在這兩種情況(Swing和AWT)下,都是以一個Graphics對象作為參數(shù)。在某個組件需要進(jìn)行繪圖操作時,系統(tǒng)會將Graphics對象傳遞給
18、paint方法或paintComponent方法。paint方法和paintComponent方法的頭部分別為:npublic void paint(Graphics g)npublic void paintComponent(Graphics g)20使用Graphics類繪圖【例7.2】使用各種顏色、字體繪制文字及各種圖形。Graphic.java 217.3事件處理與Swing常用組件聲明組件,處理事件,將組件置于容器內(nèi)n事件處理機(jī)制:一種事件處理框架,其目的是把GUI交互動作(鼠標(biāo)點(diǎn)擊、菜單選擇等)轉(zhuǎn)變?yōu)檎{(diào)用相關(guān)的事件處理程序進(jìn)行處理。JDK1.1以后Java采取了授權(quán)處理機(jī)制(Del
19、egation-based Model),事件源可以把在其自身所有可能發(fā)生的事件分別授權(quán)給不同的事件處理者來處理。n窗口管理器無法直接調(diào)用開發(fā)人員提供的事件處理程序,必須在運(yùn)行時告訴事件模型,哪一個例程用于處理事件。因此,為了獲取任何事件,開發(fā)人員必須事先通知窗口系統(tǒng),令其將事件發(fā)送給自己提供的事件處理程序,把事件處理程序注冊為窗口管理器中的一個回調(diào)例程,使之連接到產(chǎn)生事件的組件上。227.3.1 Java事件處理機(jī)制在事件處理的過程中,主要涉及三類對象:n事件源,事件發(fā)生的場所,通常就是各個組件,例如按鈕JButton。n事件對象,用戶對界面操作在java語言上的描述,以類的形式出現(xiàn),例如點(diǎn)
20、擊按鈕對應(yīng)的事件類是ActionEvent。n事件處理者,接收事件對象并對其進(jìn)行處理的對象。(事件監(jiān)聽器對象)該對象所屬的類實(shí)現(xiàn)了java.awt.event或javax.swing.event包中的一個或多個事件監(jiān)聽器的接口23【例7.3】關(guān)閉窗口事件處理。/CloseDemo1.javaimport javax.swing.*;import java.awt.event.*;public class CloseDemo1 public static void main(String args)JFrame jframe=new JFrame(關(guān)閉窗口例);/創(chuàng)建一個窗口 jframe.se
21、tSize(400,100);/設(shè)置窗口大小 jframe.setVisible(true);/使窗口可見 myWinClose handler=new myWinClose();/聲明事件對象 jframe.addWindowListener(handler);/注冊事件監(jiān)聽器 /實(shí)現(xiàn)了WindowListener接口的類的定義class myWinClose implements WindowListener/關(guān)閉窗口的事件處理方法public void windowClosing(WindowEvent e)System.exit(0);public void windowClosed(
22、WindowEvent e)public void windowOpened(WindowEvent e)public void windowIconified(WindowEvent e)public void windowDeiconified(WindowEvent e)public void windowActivated(WindowEvent e)public void windowDeactivated(WindowEvent e)事件處理程序均可采用以下步驟進(jìn)行編寫:n編寫一個實(shí)現(xiàn)了SomethingListener接口的類。在其中包括用于事件處理的方法。n聲明一個類的對象,如
23、handler。n調(diào)用組件的addSomethingListener(handler)方法。注冊事件監(jiān)聽器對象,同時也就注冊了用于事件處理的回調(diào)程序。247.3.2精簡事件處理程序的技巧1.使用監(jiān)聽器適配器類一個適配器類實(shí)現(xiàn)一個接口,并為該接口的所有方法提供默認(rèn)實(shí)現(xiàn)(空方法體),從而允許我們僅僅覆蓋自己感興趣的少量方法。【例7.4】利用適配器,進(jìn)行關(guān)閉窗口事件處理。/CloseDemo2.javaimport javax.swing.*;import java.awt.event.*;public class CloseDemo2 public static void main(String
24、args)JFrame jframe=new JFrame(關(guān)閉窗口例);jframe.setSize(400,100);jframe.setVisible(true);myWinClose2 handler=new myWinClose2();jframe.addWindowListener(handler);/定義繼承于窗口適配器的類class myWinClose2 extends WindowAdapter public void windowClosing(WindowEvent e)System.exit(0);25精簡事件處理程序的技巧2.匿名內(nèi)部類的使用【例7.5】使用匿名類進(jìn)
25、行關(guān)閉窗口事件處理。/CloseDemo3.javaimport javax.swing.*;import java.awt.event.*;public class CloseDemo3 public static void main(String args)JFrame jframe=new JFrame(關(guān)閉窗口例);jframe.setSize(400,100);jframe.setVisible(true);jframe.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)Syste
26、m.exit(0););26精簡事件處理程序的技巧3.讓頂級類實(shí)現(xiàn)監(jiān)聽器接口【例7.6】讓頂級類實(shí)現(xiàn)監(jiān)聽器接口,進(jìn)行關(guān)閉窗口事件處理。/CloseDemo4.javaimport javax.swing.*;import java.awt.event.*;public class CloseDemo4 extends WindowAdapter/*定義頂級類時,另其繼承于窗口適配器*/public static void main(String args)JFrame jframe=new JFrame(關(guān)閉窗口例);jframe.setSize(400,100);jframe.setVisi
27、ble(true);jframe.addWindowListener(new CloseDemo4();/窗口關(guān)閉事件處理程序public void windowClosing(WindowEvent e)System.exit(0);277.3.3 JLabel組件與鼠標(biāo)事件處理1.鼠標(biāo)事件用于處理鼠標(biāo)事件監(jiān)聽器接口有MouseListener和MouseMotionListener接口。任何派生于java.awt.Component的GUI組件都可以捕獲鼠標(biāo)事件。表7.9總結(jié)了MouseListener和MouseMotionListener接口的方法。2.JLabelGUI使用標(biāo)簽輸出文
28、本提示或信息。標(biāo)簽由JLabel類定義。JLabel是最簡單的JComponent。標(biāo)簽顯示單行只讀文本、影像或者兩者兼有,根據(jù)提供給構(gòu)造函數(shù)的參數(shù),其內(nèi)容可以是左、右或中間對齊的。默認(rèn)情況是左對齊。JLabel的主要構(gòu)造方法如下:nJlabel():創(chuàng)建一個無文本也無影像的標(biāo)簽;nJLabel(String text);創(chuàng)建一個帶有指定文本的標(biāo)簽實(shí)例;nJLabel(Icon image):創(chuàng)建一個帶有指定影像的標(biāo)簽實(shí)例。28JLabel組件與鼠標(biāo)事件處理【例7.7】設(shè)計(jì)一個GUI程序,要求該程序可進(jìn)行鼠標(biāo)事件處理,當(dāng)發(fā)生鼠標(biāo)按下、拖動、移動、進(jìn)入窗口、離開窗口等操作時,用標(biāo)簽指明鼠標(biāo)所處的
29、坐標(biāo)值。297.3.4 按鈕、文本字段與動作事件1.動作事件n動作事件ActionEvent只包含一個事件:ACTION_PERFORMED,需完成重寫actionPerformed()方法,能夠觸發(fā)該事件的動作包含:n(1)點(diǎn)擊按鈕(JButton);n(2)在文本框(JTextField)中輸入回車;n(3)雙擊列表(JList)中的選項(xiàng);n(4)選擇菜單項(xiàng)(JMenuItem)等。n動作事件屬于AWT事件,接口為ActionListener,對應(yīng)的動作事件處理方法是:npublic void actionPerformed(ActionEvent e)n在這個事件處理方法中,使用e.ge
30、tActionCommand可以獲得事件源的命令名。2.JButton與ActionEventnJButton類用于創(chuàng)建命令按鈕,按鈕表面所顯示的文本稱為按鈕標(biāo)簽,在GUI中使用多個JButton時,應(yīng)確保為每個按鈕提供唯一的標(biāo)簽。n單擊按鈕會引發(fā)事件:ActionEvent,開發(fā)人員提供的事件處理程序應(yīng)能夠在單擊按鈕時采取適當(dāng)?shù)奶幚韯幼?。nJButoon常用構(gòu)造方法有:nJButton():創(chuàng)建一個無標(biāo)簽的按鈕;nJButton(String text):創(chuàng)建一個標(biāo)簽為text的按鈕;nJButton(Icon icon):創(chuàng)建一個圖標(biāo)為icon的按鈕。30按鈕、文本字段與動作事件【例7.8
31、】設(shè)計(jì)一個簡易加法器的GUI程序,通過點(diǎn)擊數(shù)字按鈕得到兩個加數(shù),進(jìn)行求和運(yùn)算。313.文本框JTextField與ActionEventJTextField是屏幕上的一個區(qū)域,可用于輸入文本行信息。JTextField包括兩個子類:nJTextArea(可以輸入若干文本行)nJPasswordField(不回顯輸入的內(nèi)容)(擴(kuò)展JTextField類)。JTextField和JPasswordField都是單行區(qū)域,用戶可以通過鍵盤在該區(qū)域中輸入文本,或者程序在區(qū)域中顯示文本。JTextField的主要構(gòu)造方法有:nJTextField():創(chuàng)建一個空文本的文本框;nJTextField(St
32、ring text):創(chuàng)建一個初始文本為text的文本框;nJTextField(String text,int columns):創(chuàng)建一個初始文本為text的文本框,并指定初始字段長度為columns。32文本框JTextField與ActionEventJTextField的主要方法有:nvoid setFont(Font f):設(shè)置字體;nString getText():獲取文本框中的文本;nvoid setText():設(shè)置文本;nvoid setEditable(boolean b):設(shè)置文本框是否可編輯;nvoid setHorizontalAlignment(int align
33、ment):設(shè)置文本對齊方式??捎玫膶R方式有左對齊JTextField.LEFT,中間對齊JTextField.CENTER和右對齊JTextField.RIGHT。JPasswordField的構(gòu)造方法基本與JTextField一致,它的主要方法有:nchar getPassword():獲取密碼框的密碼;nvoid getEchoChar():獲得回顯示字符;nvoid setEchoChar(char c):設(shè)置回顯字符為c。33文本框JTextField與ActionEvent【例7.9】程序JTextFieldDemo.java使用JTextField和JPasswordField
34、類來創(chuàng)建和操作2個文本字段。接收用戶輸入時,當(dāng)按下回車鍵時將會產(chǎn)生一個ActionEvent。在事件處理程序中判斷用戶輸入的用戶名與密碼名是否正確,會彈出相應(yīng)消息對話框進(jìn)行回應(yīng)。347.3.5單、復(fù)選按鈕,組合框與項(xiàng)目事件1項(xiàng)目事件(ItemEvent)ItemEvent類包含一個事件:ITEM_STATE_CHANGED引發(fā)項(xiàng)目事件的動作包括:(1)改變單選按鈕JRadioButton對象的選中或不選中狀態(tài);(2)改變復(fù)選按鈕JCheckBox對象的選中或不選中狀態(tài);(3)改變組合框(也稱下拉列表框)JComboBox對象中某選項(xiàng)的選中或不選中狀態(tài)。項(xiàng)目事件屬于AWT事件,接口為ItemLi
35、stener,接口中只有一個事件處理方法:public void itemStateChanged(ItemEvent e)ItemEvent類有以下主要方法:nObject getItem():返回事件發(fā)生處的項(xiàng)目;nItemSelectable getItemSelectable():返回產(chǎn)生該事件的 ItemSelectable 對象;nint getStateChange():返回生成事件的狀態(tài)改變類型,如果選中,返回的值為ItemEvent.SELECTED,否則,返回值為ItemEvent.DESELECTED。352單選按鈕(JRadioButton)與復(fù)選框(JCheckBox
36、)Swing GUI組件包含3種類型的狀態(tài)按鈕:nJToggleButton(父類)nJcheckBox(復(fù)選)nJRadioButton(單選)每次對單選按鈕或復(fù)選框進(jìn)行選擇時都會產(chǎn)生ActionEvent和ItemEvent兩個事件。JRadioButton的主要構(gòu)造方法如下:nJRadioButton():建立一個新的JRadioButton;nJRadioButton(String text,boolean selected):建立一個有文字的JRadioButton,且設(shè)置初始狀態(tài)(是否選中);nJRadioButton(String text,Icon icon):建立一個有文字且
37、有圖像的JRadioButton。362單選按鈕(JRadioButton)與復(fù)選框(JCheckBox)單選按鈕通常是成組出現(xiàn)的,一次只能選中該組中的一個單選按鈕,必須使用ButtonGroup類(位于javax.swing包)的一個對象維護(hù)單選按鈕間的邏輯關(guān)系,該對象本身并不是GUI組件,它只負(fù)責(zé)組織一組按鈕,并不顯示在用戶界面中。建立組的方法如下:ButtonGroup group=new ButtonGroup;/建立組Group.add(radiobutton);/將單選鈕添加到組中【例7.10】設(shè)計(jì)一個GUI程序,進(jìn)行字體設(shè)置,要求使用一組單選按鈕,允許一次只能選擇一種字體風(fēng)格。3
38、7單選按鈕(JRadioButton)與復(fù)選框(JCheckBox)JCheckBox是一種復(fù)選框屏幕對象,可以選擇多項(xiàng)。JCheckBox采用布爾值表示用戶所做的選擇:按鍵或未按鍵、開或關(guān)等。JCheckBox的常用構(gòu)造方法如下:nJCheckBox():建立一個新的JCheckBox;nJCheckBox(String text):建立一個有文字的JCheckBox;nJCheckBox(String text,boolean selected):建立一個有文字的JCheckBox,且設(shè)置其初始狀態(tài)(是否選中)?!纠?.11】利用JCheckBox對象來改寫例7.10。383組合框(JCo
39、mboBox)組合框(或稱下拉列表)提供一列選項(xiàng),用戶可以在這列選項(xiàng)中進(jìn)行單項(xiàng)選擇。組合框由JComboBox來實(shí)現(xiàn),可產(chǎn)生ItemEvent事件。在使用JcomboBox組件編程時,如果列表項(xiàng)的數(shù)目大于可顯示的行數(shù)時,組合框會自動提供一個滾動條。組合框的常用構(gòu)造方法:nJComboBox():創(chuàng)建一個無選項(xiàng)的組合框組件;nJComboBox(Object items):利用數(shù)組對象建立一個JComboBox組件;nJComboBox(Vector items):利用向量對象建立一個JComboBox組件。組合框的常用方法有:nvoid addItem(Object object):通過字符串
40、類或其他類加入選項(xiàng);nint getItemCount():獲取條目的總數(shù);nint getSelectedIndex():獲得所選項(xiàng)的索引值(索引值從0開始)39組合框(JComboBox)【例7.12】應(yīng)用程序JComboBoxDemo.java用一個JComboBox來提供4個圖像文件名。在選中一個圖像文件名時,則相應(yīng)的圖像將顯示在JLabel的Icon中。屏幕效果如圖7.12所示。407.3.6 列表(JList)與ListSelectionEvent事件1.列表(JList)可以讓用戶選擇一到多個選項(xiàng).JList所提供的構(gòu)造函數(shù)如下所示:nJList():建立一個新的JList組件。
41、nJList(ListModel dataModel):利用ListModel建立一個新的JList組件.nJList(Object listData):利用數(shù)組對象建立一個新的JList組件。nJList(Vector listData):利用向量對象建立一個新的JList組件。常用方法如下:nvoid setSelectionMode(int selectionMode):設(shè)置選擇模式。n單一選擇ListSelectionModel.SINGLE_SELECTIONn連續(xù)區(qū)間選擇ListSelectionModel.SINGLE_INTERVAL_SELECTIONn與多重選擇ListSe
42、lectionModel.MULTIPLE_INTERVAL_SELECTION(默認(rèn))nvoid setSelectedIndex(int index):通過索引值選擇某選項(xiàng)。nvoid setVisibleRowCount(int n):設(shè)置可見行數(shù)。nint getSelectedIndex():單選時,獲得被選項(xiàng)索引。41列表(JList)與ListSelectionEvent事件JList的事件一般可分為兩種:n一種是在JList的項(xiàng)目上雙擊鼠標(biāo),產(chǎn)生ActionEvent事件。n另一種是取得用戶選取的項(xiàng)目,產(chǎn)生列表選擇事件(ListSelectionEvent)處理,該事件可以檢測
43、用戶是否對JList的選取有任何的改變,該事件的接口是ListSelectionListener。這個接口中只有一個方法:public void valueChanged(ListSelectionEvent e)42列表(JList)與ListSelectionEvent事件2.JList與ListSelectionEvent事件【例7.13】應(yīng)用程序JListDemo.java創(chuàng)建一個JList列表,該列表包含13種顏色的名稱。在單擊列表中的顏色名稱時,將產(chǎn)生一個ListSelectionEvent(此類在javax.swing.event包中)事件,并且該程序?qū)?yīng)用程序窗口的背景色改為所
44、選中的顏色。437.3.7 進(jìn)度條與時間組件1.進(jìn)度條進(jìn)度條提供直觀的圖形化的進(jìn)度描述,由JProgressBar生成。JProgressBar的主要構(gòu)造方法有:nJProgressBar():創(chuàng)建一個水平進(jìn)度條,顯示邊界,但沒有進(jìn)度字符串。nJProgressBar(int orient):創(chuàng)建一個指定方向的進(jìn)度條,方向包括垂直JProgressBar.VERTICAL和水平JProgressBar.HORIZONTAL。nJProgressBar(int min,int max):創(chuàng)建一個指定最小值和最大值的水平進(jìn)度條。nJProgressBar(int orient,int min,in
45、t max):創(chuàng)建一個具有指定的方向、最小值和最大值的進(jìn)度條。44進(jìn)度條與時間組件2.時間組件時間組件可以使用程序在一段時間內(nèi)依次執(zhí)行指定的操作,由Timer類生成時間組件可以周期地觸發(fā)ActionEvent事件。Timer的構(gòu)造方法有:nTimer(int delay,ActionListener listener):建立一個Timer組件,并在每一次delay的時間點(diǎn)上觸發(fā)ActionEvent事件。Timer的主要方法有:nvoid addActionListener(ActionListener listener):注冊動作事件。nvoid start():激活Timer組件。nvoi
46、d stop():停止Timer組件。nvoid restart():重新激活Timer組件。nvoid setDelay(int delay):設(shè)置間隔時間。nvoid setRepeats(boolean flag):設(shè)置是否只觸發(fā)一次ActionEvent事件。453.進(jìn)度條與時間組件的應(yīng)用【例7.14】啟動界面程序設(shè)計(jì)。屏幕效果如圖7.14所示。467.3.8 菜單與工具欄1.菜單構(gòu)造菜單步驟:n通過JMenuBar建立一個菜單欄,它是菜單容器,n使用JMenu菜單組件建立菜單,n每個菜單再通過JMenuItem建立菜單項(xiàng)。(1)菜單欄菜單欄位于容器的層次面板上,它本身是可選的,創(chuàng)建菜
47、單欄使用JmenuBar類.JMenuBar的構(gòu)造方法有JMenuBar():建立一個新的JMenuBar。使用容器的setJMenuBar()方法將新生成的菜單欄添加到容器中47菜單與工具欄(2)菜單菜單組件用來存放和整合菜單項(xiàng)組件。菜單組件可以是單一層次的結(jié)構(gòu),也可以是一個層次式的結(jié)構(gòu)。生成菜單組件使用JMenu類,JMenu的構(gòu)造方法有:nJMenu():建立一個新的菜單組件。nJMenu(Action a):建立一個支持Action的菜單組件。nJMenu(String s):以指定的字符串建立一個名為s的菜單組件。nJMenu(String s,boolean b):以指定的字符串名
48、稱建立一個菜單組件,并指定這個菜單是否具有下拉的屬性。48菜單與工具欄(3)菜單項(xiàng)生成菜單項(xiàng)使用JMenuItem類,JMenuItem繼承AbstractButton類,因此可以說JMenuItem是一種特殊的Button,當(dāng)在菜單中選擇某一項(xiàng)JMenuItem時就如同按下按鈕的操作一樣觸發(fā)ActionEvent事件。JMenuItem的主要構(gòu)造方法有:nJMenuItem():建立一個菜單項(xiàng)。nJMenuItem(Icon icon):建立一個有圖標(biāo)的菜單項(xiàng)。nJMenuItem(String text):建立一個有文字的菜單項(xiàng)。nJMenuItem(String text,int mne
49、monic):建立一個有文字和熱鍵的菜單項(xiàng)。JMenuItem的主要方法:nsetMNemonic(char mnemonic):設(shè)置熱鍵。nsetAccelerator(KeyStroke keyStroke):設(shè)置快捷鍵。49菜單與工具欄(4)單、復(fù)選菜單項(xiàng)菜單項(xiàng)的建立還可使用JRadioButtonMenuItem或JCheckBoxMenuItem類生成單、復(fù)選菜單項(xiàng),單、復(fù)選菜單項(xiàng)可認(rèn)為是單、復(fù)選按鈕和菜單項(xiàng)的綜合。JCheckBoxMenuItem的構(gòu)造方法主要有:nJCheckBoxMenuItem():建立一個復(fù)選菜單項(xiàng)。nJCheckBoxMenuItem(String te
50、xt):建立一個有文字的復(fù)選菜單項(xiàng)。nJCheckBoxMenuItem(String text,boolean b):建立一個有文字和設(shè)置選擇狀態(tài)的復(fù)選菜單項(xiàng)。nJRadioButtonMenuItem的構(gòu)造方法主要有:nJRadioButtonMenuItem():建立一個單選菜單項(xiàng)。nJRadioButtonMenuItem(String text):建立一個有文字的單選菜單項(xiàng)。nJRadioButtonMenuItem(String text,boolean b):建立一個有文字和設(shè)置選擇狀態(tài)的單選菜單項(xiàng)。50菜單與工具欄2.工具欄構(gòu)造菜單步驟:n首先利用JToolBar創(chuàng)建一個工具欄
51、對象n使用該對象的add方法將帶圖標(biāo)的按鈕加到工具欄中。JToolBar的構(gòu)造方法有:nJToolBar():建立一個工具欄對象,位置為默認(rèn)的水平方向。nJToolBar(int orientation):建立一個指定位置的工具欄。nJToolBar(String name):建立一個指定名稱的工具欄。nJToolBar(String name,int orientation):建立一個指定名稱和位置的工具欄。JToolBar的主要方法有:nvoid setFloatable(boolean b):設(shè)置工具欄是否可以浮動。nvoid setRollover(boolean b):設(shè)置工具欄是否
52、可以轉(zhuǎn)滾。nvoid setOrientation(int orientation):設(shè)置工具欄方向。nvoid addSeparator():添加分隔條。nvoid setToolTipText():為按鈕設(shè)置提示文字。51菜單與工具欄【例7.15】菜單與工具欄的使用示例。程序執(zhí)行后,屏幕效果如圖7.15所示。527.3.9 表格組件JTable與樹JTree1.表格表格是一種常用的數(shù)據(jù)輸入和顯示的組件,常和數(shù)據(jù)庫相關(guān)聯(lián)。用JTable類來建立表格,JTable主要控制數(shù)據(jù)的顯示方式。JTable的部分構(gòu)造方法:nJTable():建立一個新的JTable,并使用系統(tǒng)默認(rèn)的模型。nJTabl
53、e(Object rowData,String columnNames):建立一個顯示二維數(shù)組數(shù)據(jù)的表格,并且可以顯示列的名稱。nJTable(TableModel dm):建立一個表格,有默認(rèn)的字段模型和選擇模型,并設(shè)置數(shù)據(jù)模型。53表格組件JTable與樹JTree2.樹(JTree)樹提供了用樹型結(jié)構(gòu)分層顯示數(shù)據(jù)的視圖。數(shù)據(jù)中最基本的對象叫結(jié)點(diǎn),它表示在給定層次結(jié)構(gòu)中的數(shù)據(jù)項(xiàng)。樹中只有一個根結(jié)點(diǎn),所有的結(jié)點(diǎn)從這里引出。樹的建立使用JTree類。JTree的構(gòu)造方法:nJTree():建立一棵系統(tǒng)默認(rèn)的樹。nJTree(Hashtable value):利用哈希表建立樹,不顯示根結(jié)點(diǎn)。nJ
54、Tree(Object value):利用對象數(shù)組建立樹,不顯示根結(jié)點(diǎn)。nJTree(TreeModel newModel):利用數(shù)據(jù)模型建立樹。nJTree(TreeNode root):利用樹結(jié)點(diǎn)建立樹。nJTree(TreeNode root,boolean asksAllowsChildren):利用樹結(jié)點(diǎn)建立樹,并決定是否允許子結(jié)點(diǎn)的存在。nJTree(Vector value):利用向量建立樹,不顯示根結(jié)點(diǎn)。54表格組件JTable與樹JTree【例7.16】樹和表格的使用示例。此例中利用分割面板,使用了水平分割的方法,將窗口分割為左右兩部分,左窗格添加樹,右空格添加表格。當(dāng)點(diǎn)擊左
55、側(cè)窗格中的某班級節(jié)點(diǎn)時,在右側(cè)將顯示此班級的學(xué)生信息表格。屏幕效果如圖所示。557.3.10 桌面面板JDesktopPane與內(nèi)部窗口JInternalFrame1.桌面面板JDesktopPaneJDesktopPane是一種特殊的層面板。分層面板(JLayeredPane)的子類,用來建立虛擬桌面??娠@示并管理眾多內(nèi)容窗口。JDesktopPane的構(gòu)造方法有:nJDesktopPane():建立JDesktopPane組件。JDesktopPane的常用方法有:nJInternalFrame getAllFrames():返回桌面上顯示的所有子窗體。nJInternalFrame ge
56、tAllFramesInLayer(int layer):返回顯示在桌面指定層內(nèi)的所有子窗體。nDesktopManager getDesktopManager():返回桌面管理器。nInt getDragMode():返回拖曳模式。nJInternalFrame getselectedFrame():返回當(dāng)前激活子窗體。nvoid setDragMode(int dragMode):設(shè)置拖曳模式。nvoid setSelectedFrame(JInternalFrame f):設(shè)置激活子窗體。567.3.10 桌面面板JDesktopPane與內(nèi)部窗口JInternalFrame2.內(nèi)部窗口
57、JInternalFrame內(nèi)部窗口JInternalFrame也稱子窗口,它的使用跟JFrame幾乎一樣,可以最大化、最小化、關(guān)閉窗口、加入菜單等功能;唯一不同的是JInternalFrame是輕量級組件,也就是說JInternalFrame不能單獨(dú)出現(xiàn),必須依附在最上層組件上。由于這個特色,JInternalFrame能夠利用Java提供的Look&Feel功能作出完全不同于原有操作系統(tǒng)所提供的窗口外型,也比JFrame更具有彈性。JInternalFrame的構(gòu)造方法有:nJInternalFrame():創(chuàng)建一個子窗口,但不能更改大小、不可關(guān)閉、不可最大最小化、也沒有標(biāo)題。nJInte
58、rnalFrame(String tilte):創(chuàng)建一個指定標(biāo)題的子窗口,但不能更改大小、不可關(guān)閉、不可最大最小化。577.3.10 桌面面板JDesktopPane與內(nèi)部窗口JInternalFrame3.父子窗體設(shè)計(jì)【例7.17】多文檔界面設(shè)計(jì)。本例中主要演示了多文檔窗口的建立方法。屏幕效果如圖所示。587.4 布局管理器布局管理器用于確定組件在窗口中的位置和實(shí)際的大小,組織和管理一個容器里的元素,它要執(zhí)行的任務(wù)有:(1)決定容器的全面尺寸;(2)決定容器里每個元素的大小;(3)決定元素之間的間隔;(4)決定元素的位置。每個容器同一時刻只能有一個布局管理器,同一程序的不同窗口可以有不同的布
59、局管理器。雖然自己可以管理布局,但是并不容易做好。對大多數(shù)應(yīng)用程序來說,最好是通過使用AWT或Swing內(nèi)置的布局來避免這項(xiàng)工作。表7.10給出了一些AWT與Swing的布局管理器。59關(guān)于布局管理器在程序中安排組件的位置和大小時,應(yīng)注意:n如果用戶確實(shí)需要自己設(shè)置組件的大小和位置,則應(yīng)取消該容器的布局管理器 setLayout(null)n用戶必須使用setLocation(),setSize(),setBounds()等方法為組件設(shè)置大小和位置。n容器中布局管理器負(fù)責(zé)各組件的大小和位置,用戶無法設(shè)置組件的這些屬性,如試圖調(diào)用setLocation(),setSize(),setBounds
60、()等。60布局管理器在容器中所有組件的布局都由布局管理器來控制,每個容器,如JPanel、JWindows或JFrame都有各自缺省的布局管理器(表7。11),程序員也可以在程序中指定一個新的布局管理器。Java.awt包中有五種布局管理器:nFlowLayout:JPanel的缺省布局管理器nBorderLayout:JWindow、JDialog、JFrame和JApplet的缺省布局管理器nGridLayoutnCardLayoutnGridBagLayout(難度大)617.4.1 FlowLayout流式布局管理器FlowLayout是把組件從左向右、從上向下,一個接一個的放到容器
61、中。FlowLayout類有三種構(gòu)造方法:npublic FlowLayout()使用缺省居中對齊方式,組件間的水平和豎直間距為缺省值5個象素。npublic FlowLayout(int alignment)使用指定的對齊方式(FlowLayout.LEFT,F(xiàn)lowLayout.RIGHT,F(xiàn)lowLayout.Center),水平和豎直間距為缺省值5象素。npublic FlowLayout(int alignment,int horizontalGap,int verticalGap)使用指定的對齊方式,水平和豎直間距也為指定值。使用FlowLayout,組件的位置會隨著窗口大小的變化
62、而自動調(diào)整。62FlowLayout流式布局管理器【例7.18】應(yīng)用程序FlowLayoutDemo.java中創(chuàng)建了3個JButton對象,分別為“Left”、“Center”、“Right”按鈕,并使用一個FlowLayout布局管理器將這些按鈕添加到應(yīng)用程序中,這三個按鈕的事件處理程序完成三種對齊方式的設(shè)置。默認(rèn)組件是居中對齊的。在用戶單擊某一按鈕時,該布局管理器的對齊方式改為相應(yīng)對齊方式。637.4.2 BorderLayout邊界布局管理器BorderLayout是JWindow、JFrame、JDialog、JApplet的缺省布局管理器,它是將容器分成五個區(qū)域來安排組件:Nort
63、h、South、East、West、Center。1.構(gòu)造函數(shù)BorderLayout()建立一個BorderLayout的對象,組件之間的缺省間隔(水平和垂直)為零。BorderLayout(int hgap,int vgap)建立一個BorderLayout的對象,組件之間的水平間隔為hgap,垂直間隔為vgap。2.常用方法n見API。64BorderLayout邊界布局管理器將組件添加到邊界布局的容器中JFrame f=new JFrame(“BorderLayout的用法”);Container content=f.getContentPane();content.setLayout
64、(new BorderLayout(5,10);JButton b1=new JButton(“North);JButton b2=new JButton(“South);JButton b3=new JButton(“East);JButton b4=new JButton(“West);JButton b5=new JButton(“Center);content.add(b1,“North”);content.add(b2,“South”);content.add(b3,“East”);content.add(b4,“West”,);content.add(b5,“Center”);65
65、BorderLayout邊界布局管理器【例7.19】BorderLayout布局管理器示例。667.4.3 GridLayout網(wǎng)格布局管理器GridLayout布局方式可以使容器中的各組件呈網(wǎng)格狀分布。容器中各組件的高度和寬度相同,當(dāng)容器的尺寸發(fā)生變化時,各組件的相對位置不變,但各自的尺寸會發(fā)生變化。各組件的排列方式為:從上到下,從左到右。與BorderLayout類相類似,如果想在一個網(wǎng)格單元中添加多個組件,則必須先在該網(wǎng)格單元放一個容器,再將多個組件放在該容器中。67GridLayout網(wǎng)格布局管理器1.構(gòu)造函數(shù)nGridLayout():建立一個GridLayout的對象,在一行中排列
66、組件,組件之間的缺省間隔為零。nGridLayout(int rows,int cols):建立一個GridLayout的對象,將容器分成rows行,cols列,組件之間的水平間隔和垂直間隔均為零。nGridLayout(int rows,int cols,int hgap,int vgap):建立一個GridLayout的對象,將容器分成rows行,cols列,組件之間的水平間隔為hgap,垂直間隔為vgap?!纠?.20】GridLayout布局管理器示例。687.4.4 CardLayout卡片布局管理器CardLayout是將容器中的所有組件如同撲克牌般的堆疊在一起。CardLayout可以象換牌一樣處理這些共享空間的組件:為每張牌定義一個名字,可按名字選牌;可以按順序向前或向后翻牌;也可以直接選第一張或最后一張牌。69CardLayout卡片布局管理器1.構(gòu)造函數(shù)nCardLayout():建立一個CardLayout的對象,組件之間的缺省間隔為零。1.CardLayout(int hgap,int vgap):建立一個CardLayout的對象,組件之間的水平間隔為hgap
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。