版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、173第三篇 圖形程序設(shè)計(jì)第8章 圖形程序設(shè)計(jì)入門從軟件體系結(jié)構(gòu)上看,通常將軟件分為3層,即客戶層、邏輯層、數(shù)據(jù)層。其中,客戶層軟件的職責(zé)是提供數(shù)據(jù)輸入/輸出的圖形界面。在Java語(yǔ)言中,圖形界面是通過(guò)AWT類庫(kù)和Swing類庫(kù)來(lái)實(shí)現(xiàn)的。本章將介紹Java圖形類庫(kù)的應(yīng)用。8.1 圖形類庫(kù)簡(jiǎn)介類庫(kù)就是由多個(gè)類構(gòu)成的庫(kù)。實(shí)現(xiàn)圖形界面時(shí)用到j(luò)ava系統(tǒng)的兩組類庫(kù):l AWT類庫(kù)。又稱為重型類庫(kù),保存在java.awt包中。剛引入Java時(shí),使用此類庫(kù)實(shí)現(xiàn)圖形界面。l Swing類庫(kù)。又稱為輕型類庫(kù),保存在javax.swing包中。隨著Java2的發(fā)行,在實(shí)現(xiàn)圖形界面時(shí)以Swing類庫(kù)取代了AWT類
2、庫(kù)。AWT類庫(kù)和Swing類庫(kù)構(gòu)成的類層次結(jié)構(gòu)如圖8-1所示。圖8-1 類層次結(jié)構(gòu)圖注意:(1)非J字母開(kāi)頭的類都屬于AWT類庫(kù)。(2)以J字母開(kāi)頭的類屬于Swing類庫(kù)。(3)在Swing類庫(kù)中,只有JApplet、JFrame和Jdialog 3個(gè)類創(chuàng)建的對(duì)象是重型組件。圖8-1是java類庫(kù)的類層次結(jié)構(gòu)圖。根據(jù)類在界面設(shè)計(jì)方面的用途,我們把類分成3組,它們是:輔助類、重型組件類和輕型組件類。8.1.1 輔助類輔助類屬于AWT類庫(kù)。在界面設(shè)計(jì)時(shí),輔助類的作用是繪圖和設(shè)置容器組件的布局方式。常用的輔助類有Graphics、Color、Font、FontMetrics、LayoutManage
3、r。8.1.2 重型類庫(kù)重型類庫(kù)中的類創(chuàng)建的組件是重型組件。在界面設(shè)計(jì)時(shí),重型組件主要用于創(chuàng)建用戶界面元素。早期的圖形用戶界面設(shè)計(jì)都采用重型組件。重型組件又稱為AWT組件。由AWT類庫(kù)中的類(加上JApplet、JFrame和Jdialog 3個(gè)類及其子類)創(chuàng)建的對(duì)象稱為重型組件,如Button、Label、Frame、Dialog等都是重型組件。1重型組件的特點(diǎn)重型組件的特點(diǎn)如下:l 重型組件依賴本地GUI資源。l 重型組件只適用于簡(jiǎn)單的GUI程序設(shè)計(jì),不適用于復(fù)雜的GUI項(xiàng)目。l 重型組件易發(fā)生平臺(tái)故障,不穩(wěn)定,不靈活。2重型組件分類重型組件又分為容器組件和非容器組件兩類。能包含其他組件的
4、組件稱為容器組件;不能包含其他組件的組件稱為非容器組件。例如,用Panel、Window、JFrame、JDialog、JApplet及其子類創(chuàng)建的組件是容器組件;用Button、Label及其子類創(chuàng)建的組件是非容器組件。3重型組件的類層次結(jié)構(gòu)圖重型組件的類層次結(jié)構(gòu)圖如圖8-2所示。圖8-2 重型組件類層次結(jié)構(gòu)圖8.1.3 輕型類庫(kù)輕型類庫(kù)中的類創(chuàng)建的組件是輕型組件(除JApplet、JFrame和Jdialog 3個(gè)類及其子類以外)。在界面設(shè)計(jì)時(shí),輕型組件類主要用于創(chuàng)建用戶界面元素。隨著Java2的發(fā)行,圖形設(shè)計(jì)時(shí)以輕型組件取代了重型組件。常用到的輕型組件由類JButton、JLabel、J
5、TextField、JTectArea、JConmboBox、JList、JRadioButton和Jmenu創(chuàng)建的。1輕型組件的特點(diǎn)輕型組件的特點(diǎn)如下:l 輕型組件不依賴本地GUI資源。l 輕型組件適用于復(fù)雜的GUI項(xiàng)目。l 輕型組件比重型組件更穩(wěn)定、通用和靈活。2輕型組件分類輕型組件又分為容器組件和非容器組件兩類。由于JComponent的父類是Container,因此所有輕型組件都有容器特征。注意:Swing組件不能取代AWT的全部組件,只能取代AWT的用戶界面組件(Button、TextField、TextArea等)。在界面設(shè)計(jì)時(shí),仍需繼續(xù)使用輔助類(Graphics、Color、F
6、ont、FontMetrics、LayoutManager)。此外,Swing組件繼續(xù)采用AWT組件的事件模型。8.2 容器(Container類)容器是一種特殊組件,它能容納其他的組件。Java中有兩種主要容器,即窗口(Window)和面板(Panel),它們都是容器類Container的子類對(duì)象。窗口是可以自由移動(dòng)的、能獨(dú)立存在的容器,它又可分為框架(Frame)和對(duì)話框(Dialog);面板與窗口類似,但不能獨(dú)立存在,必須包含在另外一個(gè)容器中,如包含在Frame或Applet類及其子類創(chuàng)建的容器中。在圖形界面設(shè)計(jì)中,常使用Frame、Applet及其子類對(duì)象作為容器來(lái)存放用戶界面組件。應(yīng)
7、用程序使用框架及其子類對(duì)象作為容器,即在Frame對(duì)象(或子類對(duì)象)上放置面板來(lái)控制圖形界面的布局;小程序使用Panel類及其子類(Applet或Japplet的子類)創(chuàng)建的對(duì)象作為容器(Applet對(duì)象是一個(gè)能夠嵌入瀏覽器運(yùn)行的特殊容器)。8.2.1 框架(JFrame)JFrame是Window類的子類,是一種帶標(biāo)題框并且可以改變大小的窗口??蚣茴惖脑S多方法是從其超類Window或更上層的類Container和Component繼承過(guò)來(lái)的。下面介紹框架類的構(gòu)造方法和常用方法。1JFrame中的常用方法 JFrame類本身定義了一些方法外,它還從它的父類鏈條中繼承了一些方法。(1)JFram
8、e類本身定義的構(gòu)造方法和實(shí)用方法l JFrame():創(chuàng)建一個(gè)無(wú)標(biāo)題的窗口。 l JFrame(String title):創(chuàng)建一個(gè)標(biāo)題為title的窗口。其中,參數(shù)title指定窗口的標(biāo)題。沒(méi)有參數(shù)時(shí),則窗口無(wú)標(biāo)題。窗口的默認(rèn)布局是BorderLayout布局。l public void setTitle(String title):設(shè)置窗口的標(biāo)題為title。l public String getTitle():獲取窗口的標(biāo)題。l public void setBackground(Color color):設(shè)置窗口的背景顏色為color。l public void setResizabl
9、e(boolean bol):設(shè)置窗口是否可調(diào)整大小,窗口默認(rèn)是可調(diào)整大小的。bol的值是true時(shí),表示可以調(diào)整窗口大小。l boolean isResizable():獲取窗口是否可調(diào)整大小的信息,如果可調(diào)整窗口大小,該方法返回true,否則返回false。(2)從Component類中繼承的方法l public void setLocation(int x,int y):設(shè)置窗口位置。調(diào)用該方法后,將窗口的左上角的坐標(biāo)位置設(shè)置為(x,y)也就是距屏幕左面x像素,距屏幕上方y(tǒng)像素。l public void setBounds(int x,int y,int width,int heigh
10、t):設(shè)置窗口的大小和位置。調(diào)用該方法后,將窗口安排在屏幕上的一指定位置,即窗口左上角的坐標(biāo)位置為(x,y)(也就是距屏幕左面x像素,距屏幕上方y(tǒng)像素);窗口的寬是width,高是height。l public void setSize(int width,int height):設(shè)置窗口的大小。這時(shí)窗口左上角坐標(biāo)是(0,0)。l public void setVisible(boolean vis):設(shè)置窗口是否可見(jiàn),窗口默認(rèn)是不可見(jiàn)的。vis的值是true時(shí),窗口是可見(jiàn)的。(3)從Container類中繼承的方法l public Component add(Component comp):
11、在容器中添加一個(gè)組件comp。一個(gè)窗口中可以放置多個(gè)組件。l public void setLayout(LayoutManager mgr):將窗口的布局管理器設(shè)置為mgr。l public void validate():調(diào)用該方法,確保窗口中添加的組件能顯示出來(lái)。顯示窗口時(shí),有可能看不到窗口中的組件,當(dāng)用戶調(diào)整窗口大小時(shí)才能看到這些組件。如果窗口調(diào)用了該方法,就不會(huì)發(fā)生這種情況。另外,當(dāng)窗口調(diào)用方法setSize()或setBounds()調(diào)整窗口大小后,都應(yīng)該調(diào)用方法validate()以確保當(dāng)前窗口中添加的組件能顯示出來(lái)。(4)從Window類中繼承的方法l public void
12、dispose():調(diào)用該方法,將撤銷當(dāng)前窗口,并釋放當(dāng)前窗口所使用的資源。2創(chuàng)建框架(JFrame)下面的程序是創(chuàng)建一個(gè)帶標(biāo)題的窗口?!纠?.1】創(chuàng)建并顯示一個(gè)框架(框架是窗口的一種)。程序名:MyFrame.java【程序源代碼】import javax.swing.*;public class MyFrame public static void main(String args) JFrame frame = new JFrame(我是窗口標(biāo)題); /創(chuàng)建一個(gè)窗口 frame.setSize(300, 300); /設(shè)置窗口大小 frame.setVisible(true); /使窗口
13、可見(jiàn) / JDK 1.3關(guān)閉窗口的語(yǔ)句格式如下: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /當(dāng)窗口產(chǎn)生關(guān)閉事件時(shí),關(guān)閉窗口 在默認(rèn)情況下,框架對(duì)象不可見(jiàn),處于最小化狀態(tài)(即框架的寬和高都是0)。必須通過(guò)setSize()方法設(shè)置框架的大小,通過(guò)setVisible(true)方法使框架變?yōu)榭梢?jiàn)。3框架居中默認(rèn)情況下,框架在屏幕的左上角顯示。要指定框架顯示位置,必須使用JFrame類中的方法setLocation(x,y)將框架的左上角位置安排在(x,y)處。要把框架放在屏幕的中心位置,需要知道框架和屏幕的寬和高,以便計(jì)算出將框
14、架居中時(shí)框架左上角的坐標(biāo)。可以通過(guò)java.awt.Toolkit類得到屏幕的寬和高。(1)獲取屏幕的寬度和高度Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();int screenWidth = screenSize.width;/獲取屏幕的寬度int screenHeight = screenSize.height;/獲取屏幕的高度(2)框架居中時(shí)左上角的坐標(biāo)(x,y)Dimension frameSize = frame.getSize();int x = (screenWidth - frameSize
15、.width)/2;int y = (screenHeight - frameSize.height)/2;【例8.2】創(chuàng)建一個(gè)框架并顯示在屏幕中心。程序名:CenterFrame.java【程序源代碼】import javax.swing.*;import java.awt.*;public class CenterFrame public static void main(String args) JFrame frame = new JFrame(框架居中); frame.setSize(300, 300); frame.setDefaultCloseOperation(JFrame.E
16、XIT_ON_CLOSE); /當(dāng)窗口產(chǎn)生關(guān)閉事件時(shí),關(guān)閉窗口 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();/獲取屏幕的大小 int screenWidth = screenSize.width; int screenHeight = screenSize.height; /獲取框架的大小 Dimension frameSize = frame.getSize(); int x = (screenWidth - frameSize.width)/2; int y = (screenHeight - fra
17、meSize.height)/2; frame.setLocation(x, y);/設(shè)置框架的位置,其左上角坐標(biāo)為(x,y) frame.setVisible(true);/使框架可見(jiàn) 4在框架中添加組件JFrame類創(chuàng)建的窗口中還包含一個(gè)內(nèi)容窗格,使用getContentPane()方法獲取窗口(JFrame)的內(nèi)容窗格。要向窗口中添加組件,就是指向窗口的內(nèi)容窗格中添加組件。此時(shí)可以把內(nèi)容窗格看作是嵌入到窗口中的一個(gè)容器。Fame類創(chuàng)建的窗口不包含內(nèi)容窗格,因此,直接用add(Component comp)方法向窗口(Frame類創(chuàng)建的窗口)中添加組件就可以了。【例8.3】向框架中添加組件
18、。程序名:Addcom.java【程序源代碼】import javax.swing.*;public class Addcom public static void main(String args) JFrame frame = new JFrame(向框架中添加組件); frame.getContentPane().add(new JButton(我是一個(gè)按鈕);/向內(nèi)容窗格添加按鈕 frame.setSize(300, 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /
19、當(dāng)收到關(guān)閉事件時(shí),關(guān)閉窗口 表達(dá)式frame.getContentPane()的作用是獲取框架JFrame的內(nèi)容窗格;表達(dá)式new JButton(OK)則用于創(chuàng)建JButton類對(duì)象。內(nèi)容窗格有自已的默認(rèn)布局管理器(BorderLayout),默認(rèn)布局管理器將按鈕放到框架的中央。注意:要?jiǎng)?chuàng)建一個(gè)應(yīng)用程序界面,必須使用Frame類或其子類創(chuàng)建一個(gè)窗口;要?jiǎng)?chuàng)建一個(gè)小程序界面,必須使用Applet類或其子類創(chuàng)建一個(gè)窗口。這些獨(dú)立的窗口作為容器,用來(lái)存放其他界面元素或容器。窗口是不能嵌套的。8.2.2 面板(JPanel)面板類(Jpanel)是Container類的子類,是一種沒(méi)有標(biāo)題的容器。面板
20、不能獨(dú)立存在。創(chuàng)建面板后,必須使用Container類的add()方法將它裝入到另一面板或框架中。面板有兩個(gè)作用:一是作為容器,把其它組件組織在一起;二是在面板上繪制字符串和圖形。1構(gòu)造方法public JPanel();public JPanel(LayoutManager layout);其中,參數(shù)layout指定面板的布局管理器,沒(méi)有參數(shù)時(shí),面板使用默認(rèn)的布局管理器(FlowLayout)。面板類的主要方法都是從Container和Component類繼承過(guò)來(lái)的,在此從略。注意:所謂布局管理器(是一個(gè)對(duì)象)是一種如何在容器中擺放組件的規(guī)則,每個(gè)容器都有自已的默認(rèn)布局管理器。在下一節(jié)將會(huì)講
21、到。2用面板作容器【例8.4】使用面板組織組件,創(chuàng)建一個(gè)電話撥號(hào)鍵盤界面。程序名:TestPhone.java【程序源代碼】import java.awt.*; import javax.swing.*;public class TestPhone extends JFrame public TestPhone()/構(gòu)造方法 Container container = getContentPane(); /獲取框架的內(nèi)容窗格 container.setLayout(new BorderLayout();/為內(nèi)容窗格設(shè)置布局管理器 /創(chuàng)建容納12個(gè)按鈕的面板 p1并為面板設(shè)置網(wǎng)格布局管理器(4行
22、3列): JPanel p1 = new JPanel(); p1.setLayout(new GridLayout(4, 3); for (int i=1; i=9; i+) p1.add(new JButton( + i); /向面板p1添加按鈕 p1.add(new JButton(*); p1.add(new JButton( + 0); p1.add(new JButton(#); JPanel p2 = new JPanel();/創(chuàng)建面板p2,用來(lái)容納文本域和面板p1 p2.setLayout(new BorderLayout(); p2.add(p1, BorderLayout
23、.CENTER); /將面板 p2 和按鈕添加到內(nèi)容窗格 container.add(p2, BorderLayout.SOUTH); container.add(new Button(Press to Call), BorderLayout.CENTER); public static void main(String args) /主方法 TestPhone frame = new TestPhone(); frame.setTitle(The Front View of a Microwave Oven); frame.setDefaultCloseOperation(JFrame.EX
24、IT_ON_CLOSE);/當(dāng)收到關(guān)閉事件時(shí),關(guān)閉窗口 frame.setSize(400, 300); frame.setVisible(true); 【程序注釋】面板類JPanel是Container類的子類,是一種沒(méi)有標(biāo)題的容器。面板不能獨(dú)立存在,創(chuàng)建面板后,必須使用Container類的add()方法將它裝入到另一面板或框架中。【程序運(yùn)行結(jié)果】 程序運(yùn)行結(jié)果如圖8-3所示。圖8-3 TestPhone.java運(yùn)行結(jié)果8.3 布局管理器每個(gè)容器都有一個(gè)默認(rèn)的布局管理器。如何在容器中擺放組件是容器的布局管理器的職責(zé)。布局管理器就是一個(gè)布局對(duì)象。java.awt包中有5個(gè)常見(jiàn)的布局類,分別
25、是FlowLayout、GridLayout、BorderLayout、CardLayout和GridBagLayout。我們使用它們來(lái)創(chuàng)建布局對(duì)象。假設(shè)container是容器對(duì)象,對(duì)容器常見(jiàn)的3種操作如下:1.設(shè)置容器的布局管理器container.setLayout(new specificlayout(); /將容器container的布局管理器改為new specificlayout()表達(dá)式new specificlayout()表示用布局管理器類創(chuàng)建一個(gè)布局管理器(對(duì)象),容器使用該布局管理器對(duì)容器中的組件進(jìn)行擺放。2.向容器添加組件container.add(component
26、); /把組件component添加到容器container中3.從容器中刪除組件container.remove(component);/把組件component從容器container中刪除掉8.3.1 FlowLayout布局用FlowLayout類創(chuàng)建的對(duì)象稱為FlowLayout布局對(duì)象,它是JPanel型容器的默認(rèn)布局對(duì)象。FlowLayout布局規(guī)則:向容器中添加組件時(shí),從容器的第一行開(kāi)始,按組件添加的順序,由左到右將組件排列在容器中,第一行排滿后,再?gòu)牡诙虚_(kāi)始從左向右排列組件,依次類推,直到所有組件排完。組件之間的對(duì)齊方式可以使用FlowLayout.RIGHT、FlowLa
27、yout.CENTER、FlowLayout.LEFT 3個(gè)常量之一指定。FlowLayout類常用的方法如下:(1) FlowLayout():利用該構(gòu)造方法可以創(chuàng)建一個(gè)布局對(duì)象,容器使用該布局對(duì)象時(shí),組件之間的水平和垂直間距默認(rèn)是5像素。例如:FlowLayout flow=new FlowLayout();/創(chuàng)建布局對(duì)象flowcon.setLayout(flow);/容器con使用布局對(duì)象(flow)擺放容器中的組件當(dāng)向容器(con)中添加組件時(shí),組件按照加入的先后順序,從左向右排列,一行排滿之后就轉(zhuǎn)到下一行繼續(xù)從左至右排列。每一行中的組件都居中排列,組件之間的默認(rèn)水平和垂直間距是5像
28、素。(2)FlowLayout(int aligin,int hgap,int vgap):利用該構(gòu)造方法可以創(chuàng)建一個(gè)布局對(duì)象,則容器中組件的對(duì)齊方式aligin可取FlowLayout.LEFT、FlowLayout.CENTER、FlowLayout.RIGHT之一。(3)public void setAlignment(int aligin):FlowLayout布局對(duì)象調(diào)用該方法可以設(shè)置布局的對(duì)齊方式。(4)public void set Hgap(int hgap):FlowLayout布局對(duì)象調(diào)用該方法可以設(shè)置容器中組件的水平間距為hgap象素。(5)public void set
29、Vgap(int hgap):FlowLayout布局對(duì)象調(diào)用該方法可以設(shè)置容器中組件的垂直間距為hgap象素。FlowLayout布局非常簡(jiǎn)單,每一行中的組件都按著布局指定的對(duì)齊方式和水平間距排列;當(dāng)形成多行組件時(shí),行與行之間的間距就是布局的垂直間距。盡管這種布局非常方便,但是當(dāng)容器內(nèi)的組件太多時(shí),就顯得高低參差不齊。為了布局的美觀,我們常采用容器嵌套的方法,即把一個(gè)容器嵌入到另一個(gè)容器中,使整個(gè)容器的布局達(dá)到應(yīng)用的需求?!纠?.5】使用FlowLayout布局放置9個(gè)組件。程序名:FlowLayoutTest.java【程序源代碼】import java.awt.*; import jav
30、a.applet.*;public class FlowLayoutTest extends Applet public void init()FlowLayout fL=new FlowLayout(); fL.setAlignment(FlowLayout.RIGHT);fL.setHgap(30); /設(shè)置組件的垂直間距為30像素fL.setVgap(40); /設(shè)置組件的水平間距為40像素setLayout(fL); /設(shè)置容器的布局對(duì)象為fLsetBackground(Color.blue);for(int n=1;n=9;n+) add(new Button(This is +n)
31、; /向容器中添加按鈕【程序運(yùn)行結(jié)果】 程序運(yùn)行結(jié)果如圖8-4所示。圖8-4 FlowLayoutTest.java 運(yùn)行結(jié)果【例8.6】在一個(gè)框架中以指定的對(duì)齊方式和間距排列12個(gè)按鈕。程序名:ShowFlowLayout.java【程序源代碼】/使用FlowLayout布局對(duì)象import javax.swing.JButton; import javax.swing.JFrame;import java.awt.Container; import java.awt.FlowLayout;public class ShowFlowLayout extends JFrame public S
32、howFlowLayout() Container container = getContentPane();/獲取框架的內(nèi)容窗格 container.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 20); /設(shè)置container的布局方式。 for (int i=1; i=12; i+) container.add(new JButton(Component + i); /向框架中添加按鈕 public static void main(String args) /主方法 ShowFlowLayout frame = new ShowFlo
33、wLayout(); frame.setTitle(Show FlowLayout); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 200); frame.setVisible(true); 表達(dá)式new FlowLayout(FlowLayout.CENTER, 10, 20)的作用是創(chuàng)建一個(gè)FlowLayout布局對(duì)象,布局規(guī)則是組件居中對(duì)齊;組件間的水平間距是10像素;垂直間距是20像素。8.3.2 GridLayout布局用GridLayout類創(chuàng)建的對(duì)象稱為GridLayout布局對(duì)
34、象。GridLayout布局對(duì)象將容器劃分為若干行、若干列的網(wǎng)格區(qū)域,組件就安置在這些網(wǎng)格中。GridLayout布局規(guī)則:向容器中添加組件時(shí),從容器的第一行開(kāi)始,按組件添加的順序,由左到右將組件排列在容器的網(wǎng)格中,第一行排滿后,再?gòu)牡诙械淖筮呴_(kāi)始排列組件,依次類推,直到組件排完。GridLayout類的構(gòu)造方法如下:l public GridLayout(int rows, int columns, int hGap, int vGap):該方法用于創(chuàng)建一個(gè)布局對(duì)象,該布局對(duì)象將容器劃分為rows行、columns列。組件在容器中排列時(shí)的水平和垂直間距分別為hGap和vGap象素。l pu
35、blic GridLayout(int rows, int columns):該方法用于創(chuàng)建一個(gè)布局對(duì)象,此布局對(duì)象將容器劃分為rows行、columns列。組件在容器中排列時(shí)的水平和垂直間距均為0象素。l public GridLayout():每行存放一個(gè)組件。【例8.7】將10個(gè)按鈕排列成4行3列的網(wǎng)格。程序名:ShowGridLayout.java【程序源代碼】/使用GridLayout布局對(duì)象import javax.swing.JButton; import javax.swing.JFrame; import java.awt.GridLayout;import java.awt
36、.Container;public class ShowGridLayout extends JFrame public ShowGridLayout() Container container = getContentPane();/獲取框架的內(nèi)容窗格 container.setLayout(new GridLayout(4, 3, 35, 5); /為內(nèi)容窗格設(shè)置布局管理器 for (int i=1; i=10; i+) container.add(new JButton(Component + i); /向內(nèi)容窗格添加按鈕 public static void main(String a
37、rgs) /主方法 ShowGridLayout frame = new ShowGridLayout(); frame.setTitle(Show GridLayout); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 200); frame.setVisible(true); 【程序注釋】表達(dá)式new GridLayout(4, 3, 35, 5)創(chuàng)建的布局是將容器劃分為4行3列的網(wǎng)格,組件的水平間距為35像素,垂直間距為5像素?!境绦蜻\(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖8-5所示。圖8-5 Show
38、GridLayout.java運(yùn)行結(jié)果采用GridLayout布局,每個(gè)網(wǎng)格大小相同,而組件與網(wǎng)格的大小也相同,這樣容器中的每個(gè)組件也都是大小相同的。為了克服這個(gè)缺點(diǎn),可以使用容器嵌套。例如,使用GridLayout布局將一個(gè)容器分為3行1列的網(wǎng)格,然后將另一個(gè)容器添加到某個(gè)網(wǎng)格中,而添加的這個(gè)容器又可以設(shè)置為GridLayout布局、FlowLayout布局、CardLayout布局或BorderLayout布局之一。利用這種嵌套方法,可以設(shè)計(jì)出符合用戶要求的布局。8.3.3 BorderLayout布局用BorderLayout類創(chuàng)建的對(duì)象稱為BorderLayout布局對(duì)象,它將容器空間
39、劃分為東、西、南、北、中5個(gè)區(qū)域,中間的區(qū)域最大。BorderLayout布局對(duì)象是JFrame容器的默認(rèn)布局對(duì)象。BorderLayout對(duì)象的布局規(guī)則:每向容器中加入一個(gè)組件,都應(yīng)該指明這個(gè)組件放置在哪個(gè)區(qū)域中。區(qū)域由BorderLayout中的靜態(tài)常量CENTER、NORTH、SOUTH、WEST、EAST標(biāo)識(shí)。例如,一個(gè)使用BorderLayout布局的容器container,可以使用add()方法將一個(gè)組件b添加到中心區(qū)域:container.add(b,BorderLayout.CENTER);上面的語(yǔ)句等價(jià)于下面的語(yǔ)句:container.add(BorderLayout.CEN
40、TER, b);注意:語(yǔ)句container.add(b)與container.add(BorderLayout.CENTER, b)是等價(jià)的,即若將組件b添加到容器container的中央,則可以省略參數(shù)BorderLayout.CENTER。添加到某個(gè)區(qū)域的組件將占據(jù)整個(gè)區(qū)域。每個(gè)區(qū)域只能放置一個(gè)組件,如果向某個(gè)已放置了組件的區(qū)域再放置一個(gè)組件,那么先前的組件將被后者替換掉。使用BorderLayout布局的容器最多能添加5個(gè)組件,如果容器中需要加入超過(guò)5個(gè)組件,就必須使用容器的嵌套或采用其他的布局策略。BorderLayout類的構(gòu)造方法如下:l public BorderLayout(
41、int hGap, int vGap):該方法用于創(chuàng)建一個(gè)布局對(duì)象,該布局把容器中組件之間的水平和垂直間距分別設(shè)置為hGa和vGap個(gè)像素。l public BorderLayout():該方法用于創(chuàng)建一個(gè)布局對(duì)象,該布局把容器中組件之間的水平和垂直間距都設(shè)置為0像素?!纠?.8】使用BorderLayout管理器在框架中放置5個(gè)按鈕。程序名:ShowBorderLayout.java【程序源代碼】/使用BorderLayout布局import javax.swing.JButton; import javax.swing.JFrame; import java.awt.Container;i
42、mport java.awt.BorderLayout;public class ShowBorderLayout extends JFrame public ShowBorderLayout()/構(gòu)造方法 /獲取框架的內(nèi)容窗格 Container container = getContentPane(); container.setLayout(new BorderLayout(5, 10); /為內(nèi)容窗格設(shè)置BorderLayout布局 /將5個(gè)按鈕分別添加到內(nèi)容窗格中的5個(gè)區(qū)域中 container.add(new JButton(East), BorderLayout.EAST); c
43、ontainer.add(new JButton(South), BorderLayout.SOUTH); container.add(new JButton(West), BorderLayout.WEST); container.add(new JButton(North), BorderLayout.NORTH); container.add(new JButton(Center), BorderLayout.CENTER); public static void main(String args) /主方法 ShowBorderLayout frame = new ShowBorder
44、Layout(); frame.setTitle(使用BorderLayout布局); frame.setDefaultCloseOperation(3); /收到窗口關(guān)閉事件時(shí),關(guān)閉窗口 frame.setSize(300, 200); frame.setVisible(true); 【程序注釋】表達(dá)式new BorderLayout(5, 10)創(chuàng)建的布局對(duì)象使組件之間的水平和垂直間距分別為5像素和10像素?!境绦蜻\(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖8-6所示。圖8-6 程序ShowBorderLayout.java運(yùn)行結(jié)果注意:(1)在BorderLayout布局下,南北組件自動(dòng)水平擴(kuò)展,東西組件
45、自動(dòng)豎直拉伸,中央組件可以水平和豎直擴(kuò)展。(2)JFrame的內(nèi)容窗格的默認(rèn)布局是BorderLayout布局。8.3.4 CardLayout布局使用CardLayout布局的容器可以容納多個(gè)組件,但是同一時(shí)刻容器只能從這些組件中選出一個(gè)來(lái)顯示,就像一疊“撲克牌”每次只能顯示最上面的一張,這個(gè)被顯示的組件將占滿容器的所有空間。假設(shè)有一個(gè)容器con,那么使用CardLayout布局對(duì)象的一般步驟如下:(1)創(chuàng)建CardLayout布局對(duì)象card。例如:CardLayout card=new CardLayout();(2)使用容器的setLayout()方法把容器的布局方式設(shè)置為card。例
46、如:con.setLayout(card);(3)調(diào)用容器的con.add(String num,Componnemt b)方法將組件b加入容器con中,并給出該組件的代號(hào)num。組件的代號(hào)與組件的名稱沒(méi)有必然聯(lián)系,不同的組件代號(hào)互不相同。最先加入容器con的組件是第1張,第二次加入的組件是第2張,依次給組件排號(hào)。(4)使用布局對(duì)象card的show()方法顯示容器con中代號(hào)為num的組件。格式如下:card.show(con, num); /顯示容器con中代號(hào)是num的組件。也可以按組件加入容器的順序顯示組件。例如:card.first(con);/顯示con中的第一個(gè)組件card.la
47、st(con);/顯示con中的最后一個(gè)組件card.next(con);/顯示容器中的下一個(gè)組件card.previous(con);/顯示容器中的前一個(gè)組件【例8.9】在窗格中添加按鈕(next)、按鈕(previous)、面板(cardPanel),在面板中添加三個(gè)標(biāo)簽作為卡片。面板(cardPanel)采用CardLayout布局管理器以管理三個(gè)標(biāo)簽。按鈕next顯示下一張卡片,按鈕Previous顯示上一張卡片。程序名:CardLayoutTest.java【程序源代碼】import java.awt.*; import java.awt.event.*;import javax.s
48、wing.*; import javax.swing.border.LineBorder;public class CardLayoutTest private static CardLayout cards= new CardLayout(); /創(chuàng)建卡片布局對(duì)象 private static JPanel cardPanel = new JPanel();/創(chuàng)建面板 public static void main(String args) JFrame frame = new JFrame(); frame.setTitle(Demo of GridLayout); Container c
49、ontent = frame.getContentPane(); /獲取框架的內(nèi)容窗格content.setLayout(new FlowLayout();JButton nextBt = new JButton(Next);JButton previousBt = new JButton(Previoust);/將按鈕加入單元格中content.add(previousBt); content.add(nextBt);cardPanel.setLayout(cards); /將面板的布局管理器設(shè)為cardsDimension dim = new Dimension(100,50);cardP
50、anel.setPreferredSize(dim); /設(shè)置面板的大小cardPanel.setBorder(new LineBorder(Color.black);/向面板添加三個(gè)標(biāo)簽對(duì)象cardPanel.add(new JLabel(Card 1, JLabel.CENTER), card1);cardPanel.add(new JLabel(Card 2, JLabel.CENTER), card2);cardPanel.add(new JLabel(Card 3, JLabel.CENTER), card3 );/向內(nèi)容窗格中添加按鈕nextBt、面板cardPanel、按鈕pre
51、viousBtcontent.add(nextBt); content.add(cardPanel); content.add(previousBt);/添加監(jiān)聽(tīng)器ActionListener listener = new ActionResponse();nextBt.addActionListener(listener); previousBt.addActionListener(listener);frame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit
52、(0); );frame.pack(); frame.setVisible(true);static class ActionResponse implements ActionListener /內(nèi)部類定義開(kāi)始 public void actionPerformed(ActionEvent event) if (event.getActionCommand().equals(Next) /getActionCommand()來(lái)得到按鈕的名稱 cards.next(cardPanel); else cards.previous(cardPanel); /內(nèi)部類定義結(jié)束/外部類定義結(jié)束【程序運(yùn)行
53、結(jié)果】程序運(yùn)行結(jié)果如圖8-7所示。圖8-7 CardLayoutTest.java運(yùn)行結(jié)果8.3.5 null布局可以將一個(gè)容器的布局設(shè)置為null布局(空布局)。組件擁有的一個(gè)方法setBounds(int a,int b,int width,int height),調(diào)用該方法可以設(shè)置組建的大小,并能設(shè)置組建在容器中的位置。例如,p是一個(gè)容器,將其布局管理器設(shè)置為null布局的格式如下:p.setLayout(null);向容器p(布局為null)添加一個(gè)組件c需要兩個(gè)步驟:(1)使用add(c)方法向容器添加組件c;(2)組件c調(diào)用setBounds(int x,int y,int wid
54、th,int height)方法(其中的參數(shù)x、y是組件c在容器中的位置坐標(biāo),即該組件距容器左面x像素,距容器上方y(tǒng)像素;width、height是組件c的寬和高)設(shè)置該組件在容器中的位置和組件大小。8.4 繪圖相關(guān)類可以使用適當(dāng)?shù)念伾妥煮w來(lái)畫(huà)圖。下面將介紹Color類、Font類和FontMetrics類以及Graphics類中的繪圖方法。8.4.1 Color類可以使用java.awt包中的Color類為GUI組件設(shè)置顏色。顏色由紅、綠、藍(lán)三原色構(gòu)成,每種原色的亮度都用一個(gè)byte數(shù)據(jù)表示,即顏色值為0(最暗)到255(最亮)之間。這就是通常所說(shuō)的RGB模式。1創(chuàng)建Color對(duì)象的語(yǔ)句格式Color color = new Color(r, g, b); 其中r、g、b分別用于指定一個(gè)顏色的紅、藍(lán)、綠成分(其值都是數(shù)字)。例如:Color color = new Color(128, 100, 100); 2設(shè)置組件的背景色和前景色可以使用定義在Component類中的方法setBackground(Color c)和setForeground(
溫馨提示
- 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工離職協(xié)議模板
- 配電室維護(hù)協(xié)議書(shū)
- 權(quán)威加工合同范文合輯
- 大學(xué)新生入學(xué)法律協(xié)議范文
- 全面服裝代理合同范本
- 消防工程專業(yè)承包合同
- 廣告位承包協(xié)議范本
- 美術(shù)作品購(gòu)買協(xié)議范本2024年
- 個(gè)人稅收居民證明委托申請(qǐng)
- 準(zhǔn)合同補(bǔ)充協(xié)議范本2024年
- 礦區(qū)鉆探工程施工方案及保障措施
- DB11-T 854-2023 占道作業(yè)交通安全設(shè)施設(shè)置技術(shù)要求
- Scrum敏捷開(kāi)發(fā)模式講解課件
- ??谑袊?guó)土空間總體規(guī)劃(2020-2035)(公眾版)
- 安徽省淮南市2023-2024學(xué)年高一上學(xué)期第二次月考數(shù)學(xué)試題
- 術(shù)后切口感染的護(hù)理
- 2024年榆林科創(chuàng)新城產(chǎn)業(yè)發(fā)展集團(tuán)有限公司招聘筆試沖刺題(帶答案解析)
- 王遠(yuǎn)方故意殺人案庭審筆錄解讀
- 第10課《養(yǎng)成遵紀(jì)守法好習(xí)慣》第2框《履行遵紀(jì)守法義務(wù)》-【中職專用】《職業(yè)道德與法治》同步課堂課件
- 機(jī)械設(shè)計(jì)答辯常見(jiàn)問(wèn)題及對(duì)策
- 新建低空經(jīng)濟(jì)產(chǎn)業(yè)園建設(shè)項(xiàng)目可行性研究報(bào)告
評(píng)論
0/150
提交評(píng)論