版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、173第三篇 圖形程序設(shè)計第8章 圖形程序設(shè)計入門從軟件體系結(jié)構(gòu)上看,通常將軟件分為3層,即客戶層、邏輯層、數(shù)據(jù)層。其中,客戶層軟件的職責(zé)是提供數(shù)據(jù)輸入/輸出的圖形界面。在Java語言中,圖形界面是通過AWT類庫和Swing類庫來實現(xiàn)的。本章將介紹Java圖形類庫的應(yīng)用。8.1 圖形類庫簡介類庫就是由多個類構(gòu)成的庫。實現(xiàn)圖形界面時用到j(luò)ava系統(tǒng)的兩組類庫:l AWT類庫。又稱為重型類庫,保存在java.awt包中。剛引入Java時,使用此類庫實現(xiàn)圖形界面。l Swing類庫。又稱為輕型類庫,保存在javax.swing包中。隨著Java2的發(fā)行,在實現(xiàn)圖形界面時以Swing類庫取代了AWT類
2、庫。AWT類庫和Swing類庫構(gòu)成的類層次結(jié)構(gòu)如圖8-1所示。圖8-1 類層次結(jié)構(gòu)圖注意:(1)非J字母開頭的類都屬于AWT類庫。(2)以J字母開頭的類屬于Swing類庫。(3)在Swing類庫中,只有JApplet、JFrame和Jdialog 3個類創(chuàng)建的對象是重型組件。圖8-1是java類庫的類層次結(jié)構(gòu)圖。根據(jù)類在界面設(shè)計方面的用途,我們把類分成3組,它們是:輔助類、重型組件類和輕型組件類。8.1.1 輔助類輔助類屬于AWT類庫。在界面設(shè)計時,輔助類的作用是繪圖和設(shè)置容器組件的布局方式。常用的輔助類有Graphics、Color、Font、FontMetrics、LayoutManage
3、r。8.1.2 重型類庫重型類庫中的類創(chuàng)建的組件是重型組件。在界面設(shè)計時,重型組件主要用于創(chuàng)建用戶界面元素。早期的圖形用戶界面設(shè)計都采用重型組件。重型組件又稱為AWT組件。由AWT類庫中的類(加上JApplet、JFrame和Jdialog 3個類及其子類)創(chuàng)建的對象稱為重型組件,如Button、Label、Frame、Dialog等都是重型組件。1重型組件的特點重型組件的特點如下:l 重型組件依賴本地GUI資源。l 重型組件只適用于簡單的GUI程序設(shè)計,不適用于復(fù)雜的GUI項目。l 重型組件易發(fā)生平臺故障,不穩(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 輕型類庫輕型類庫中的類創(chuàng)建的組件是輕型組件(除JApplet、JFrame和Jdialog 3個類及其子類以外)。在界面設(shè)計時,輕型組件類主要用于創(chuàng)建用戶界面元素。隨著Java2的發(fā)行,圖形設(shè)計時以輕型組件取代了重型組件。常用到的輕型組件由類JButton、JLabel、J
5、TextField、JTectArea、JConmboBox、JList、JRadioButton和Jmenu創(chuàng)建的。1輕型組件的特點輕型組件的特點如下:l 輕型組件不依賴本地GUI資源。l 輕型組件適用于復(fù)雜的GUI項目。l 輕型組件比重型組件更穩(wěn)定、通用和靈活。2輕型組件分類輕型組件又分為容器組件和非容器組件兩類。由于JComponent的父類是Container,因此所有輕型組件都有容器特征。注意:Swing組件不能取代AWT的全部組件,只能取代AWT的用戶界面組件(Button、TextField、TextArea等)。在界面設(shè)計時,仍需繼續(xù)使用輔助類(Graphics、Color、F
6、ont、FontMetrics、LayoutManager)。此外,Swing組件繼續(xù)采用AWT組件的事件模型。8.2 容器(Container類)容器是一種特殊組件,它能容納其他的組件。Java中有兩種主要容器,即窗口(Window)和面板(Panel),它們都是容器類Container的子類對象。窗口是可以自由移動的、能獨立存在的容器,它又可分為框架(Frame)和對話框(Dialog);面板與窗口類似,但不能獨立存在,必須包含在另外一個容器中,如包含在Frame或Applet類及其子類創(chuàng)建的容器中。在圖形界面設(shè)計中,常使用Frame、Applet及其子類對象作為容器來存放用戶界面組件。應(yīng)
7、用程序使用框架及其子類對象作為容器,即在Frame對象(或子類對象)上放置面板來控制圖形界面的布局;小程序使用Panel類及其子類(Applet或Japplet的子類)創(chuàng)建的對象作為容器(Applet對象是一個能夠嵌入瀏覽器運行的特殊容器)。8.2.1 框架(JFrame)JFrame是Window類的子類,是一種帶標題框并且可以改變大小的窗口??蚣茴惖脑S多方法是從其超類Window或更上層的類Container和Component繼承過來的。下面介紹框架類的構(gòu)造方法和常用方法。1JFrame中的常用方法 JFrame類本身定義了一些方法外,它還從它的父類鏈條中繼承了一些方法。(1)JFram
8、e類本身定義的構(gòu)造方法和實用方法l JFrame():創(chuàng)建一個無標題的窗口。 l JFrame(String title):創(chuàng)建一個標題為title的窗口。其中,參數(shù)title指定窗口的標題。沒有參數(shù)時,則窗口無標題。窗口的默認布局是BorderLayout布局。l public void setTitle(String title):設(shè)置窗口的標題為title。l public String getTitle():獲取窗口的標題。l public void setBackground(Color color):設(shè)置窗口的背景顏色為color。l public void setResizabl
9、e(boolean bol):設(shè)置窗口是否可調(diào)整大小,窗口默認是可調(diào)整大小的。bol的值是true時,表示可以調(diào)整窗口大小。l boolean isResizable():獲取窗口是否可調(diào)整大小的信息,如果可調(diào)整窗口大小,該方法返回true,否則返回false。(2)從Component類中繼承的方法l public void setLocation(int x,int y):設(shè)置窗口位置。調(dià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)用該方法后,將窗口安排在屏幕上的一指定位置,即窗口左上角的坐標位置為(x,y)(也就是距屏幕左面x像素,距屏幕上方y(tǒng)像素);窗口的寬是width,高是height。l public void setSize(int width,int height):設(shè)置窗口的大小。這時窗口左上角坐標是(0,0)。l public void setVisible(boolean vis):設(shè)置窗口是否可見,窗口默認是不可見的。vis的值是true時,窗口是可見的。(3)從Container類中繼承的方法l public Component add(Component comp):
11、在容器中添加一個組件comp。一個窗口中可以放置多個組件。l public void setLayout(LayoutManager mgr):將窗口的布局管理器設(shè)置為mgr。l public void validate():調(diào)用該方法,確保窗口中添加的組件能顯示出來。顯示窗口時,有可能看不到窗口中的組件,當用戶調(diào)整窗口大小時才能看到這些組件。如果窗口調(diào)用了該方法,就不會發(fā)生這種情況。另外,當窗口調(diào)用方法setSize()或setBounds()調(diào)整窗口大小后,都應(yīng)該調(diào)用方法validate()以確保當前窗口中添加的組件能顯示出來。(4)從Window類中繼承的方法l public void
12、dispose():調(diào)用該方法,將撤銷當前窗口,并釋放當前窗口所使用的資源。2創(chuàng)建框架(JFrame)下面的程序是創(chuàng)建一個帶標題的窗口?!纠?.1】創(chuàng)建并顯示一個框架(框架是窗口的一種)。程序名:MyFrame.java【程序源代碼】import javax.swing.*;public class MyFrame public static void main(String args) JFrame frame = new JFrame(我是窗口標題); /創(chuàng)建一個窗口 frame.setSize(300, 300); /設(shè)置窗口大小 frame.setVisible(true); /使窗口
13、可見 / JDK 1.3關(guān)閉窗口的語句格式如下: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /當窗口產(chǎn)生關(guān)閉事件時,關(guān)閉窗口 在默認情況下,框架對象不可見,處于最小化狀態(tài)(即框架的寬和高都是0)。必須通過setSize()方法設(shè)置框架的大小,通過setVisible(true)方法使框架變?yōu)榭梢姟?框架居中默認情況下,框架在屏幕的左上角顯示。要指定框架顯示位置,必須使用JFrame類中的方法setLocation(x,y)將框架的左上角位置安排在(x,y)處。要把框架放在屏幕的中心位置,需要知道框架和屏幕的寬和高,以便計算出將框
14、架居中時框架左上角的坐標??梢酝ㄟ^java.awt.Toolkit類得到屏幕的寬和高。(1)獲取屏幕的寬度和高度Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();int screenWidth = screenSize.width;/獲取屏幕的寬度int screenHeight = screenSize.height;/獲取屏幕的高度(2)框架居中時左上角的坐標(x,y)Dimension frameSize = frame.getSize();int x = (screenWidth - frameSize
15、.width)/2;int y = (screenHeight - frameSize.height)/2;【例8.2】創(chuàng)建一個框架并顯示在屏幕中心。程序名: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); /當窗口產(chǎn)生關(guān)閉事件時,關(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è)置框架的位置,其左上角坐標為(x,y) frame.setVisible(true);/使框架可見 4在框架中添加組件JFrame類創(chuàng)建的窗口中還包含一個內(nèi)容窗格,使用getContentPane()方法獲取窗口(JFrame)的內(nèi)容窗格。要向窗口中添加組件,就是指向窗口的內(nèi)容窗格中添加組件。此時可以把內(nèi)容窗格看作是嵌入到窗口中的一個容器。Fame類創(chuàng)建的窗口不包含內(nèi)容窗格,因此,直接用add(Component comp)方法向窗口(Frame類創(chuàng)建的窗口)中添加組件就可以了?!纠?.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(我是一個按鈕);/向內(nèi)容窗格添加按鈕 frame.setSize(300, 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /
19、當收到關(guān)閉事件時,關(guān)閉窗口 表達式frame.getContentPane()的作用是獲取框架JFrame的內(nèi)容窗格;表達式new JButton(OK)則用于創(chuàng)建JButton類對象。內(nèi)容窗格有自已的默認布局管理器(BorderLayout),默認布局管理器將按鈕放到框架的中央。注意:要創(chuàng)建一個應(yīng)用程序界面,必須使用Frame類或其子類創(chuàng)建一個窗口;要創(chuàng)建一個小程序界面,必須使用Applet類或其子類創(chuàng)建一個窗口。這些獨立的窗口作為容器,用來存放其他界面元素或容器。窗口是不能嵌套的。8.2.2 面板(JPanel)面板類(Jpanel)是Container類的子類,是一種沒有標題的容器。面板
20、不能獨立存在。創(chuàng)建面板后,必須使用Container類的add()方法將它裝入到另一面板或框架中。面板有兩個作用:一是作為容器,把其它組件組織在一起;二是在面板上繪制字符串和圖形。1構(gòu)造方法public JPanel();public JPanel(LayoutManager layout);其中,參數(shù)layout指定面板的布局管理器,沒有參數(shù)時,面板使用默認的布局管理器(FlowLayout)。面板類的主要方法都是從Container和Component類繼承過來的,在此從略。注意:所謂布局管理器(是一個對象)是一種如何在容器中擺放組件的規(guī)則,每個容器都有自已的默認布局管理器。在下一節(jié)將會講
21、到。2用面板作容器【例8.4】使用面板組織組件,創(chuàng)建一個電話撥號鍵盤界面。程序名: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個按鈕的面板 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,用來容納文本域和面板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);/當收到關(guān)閉事件時,關(guān)閉窗口 frame.setSize(400, 300); frame.setVisible(true); 【程序注釋】面板類JPanel是Container類的子類,是一種沒有標題的容器。面板不能獨立存在,創(chuàng)建面板后,必須使用Container類的add()方法將它裝入到另一面板或框架中?!境绦蜻\行結(jié)果】 程序運行結(jié)果如圖8-3所示。圖8-3 TestPhone.java運行結(jié)果8.3 布局管理器每個容器都有一個默認的布局管理器。如何在容器中擺放組件是容器的布局管理器的職責(zé)。布局管理器就是一個布局對象。java.awt包中有5個常見的布局類,分別
25、是FlowLayout、GridLayout、BorderLayout、CardLayout和GridBagLayout。我們使用它們來創(chuàng)建布局對象。假設(shè)container是容器對象,對容器常見的3種操作如下:1.設(shè)置容器的布局管理器container.setLayout(new specificlayout(); /將容器container的布局管理器改為new specificlayout()表達式new specificlayout()表示用布局管理器類創(chuàng)建一個布局管理器(對象),容器使用該布局管理器對容器中的組件進行擺放。2.向容器添加組件container.add(component
26、); /把組件component添加到容器container中3.從容器中刪除組件container.remove(component);/把組件component從容器container中刪除掉8.3.1 FlowLayout布局用FlowLayout類創(chuàng)建的對象稱為FlowLayout布局對象,它是JPanel型容器的默認布局對象。FlowLayout布局規(guī)則:向容器中添加組件時,從容器的第一行開始,按組件添加的順序,由左到右將組件排列在容器中,第一行排滿后,再從第二行開始從左向右排列組件,依次類推,直到所有組件排完。組件之間的對齊方式可以使用FlowLayout.RIGHT、FlowLa
27、yout.CENTER、FlowLayout.LEFT 3個常量之一指定。FlowLayout類常用的方法如下:(1) FlowLayout():利用該構(gòu)造方法可以創(chuàng)建一個布局對象,容器使用該布局對象時,組件之間的水平和垂直間距默認是5像素。例如:FlowLayout flow=new FlowLayout();/創(chuàng)建布局對象flowcon.setLayout(flow);/容器con使用布局對象(flow)擺放容器中的組件當向容器(con)中添加組件時,組件按照加入的先后順序,從左向右排列,一行排滿之后就轉(zhuǎn)到下一行繼續(xù)從左至右排列。每一行中的組件都居中排列,組件之間的默認水平和垂直間距是5像
28、素。(2)FlowLayout(int aligin,int hgap,int vgap):利用該構(gòu)造方法可以創(chuàng)建一個布局對象,則容器中組件的對齊方式aligin可取FlowLayout.LEFT、FlowLayout.CENTER、FlowLayout.RIGHT之一。(3)public void setAlignment(int aligin):FlowLayout布局對象調(diào)用該方法可以設(shè)置布局的對齊方式。(4)public void set Hgap(int hgap):FlowLayout布局對象調(diào)用該方法可以設(shè)置容器中組件的水平間距為hgap象素。(5)public void set
29、Vgap(int hgap):FlowLayout布局對象調(diào)用該方法可以設(shè)置容器中組件的垂直間距為hgap象素。FlowLayout布局非常簡單,每一行中的組件都按著布局指定的對齊方式和水平間距排列;當形成多行組件時,行與行之間的間距就是布局的垂直間距。盡管這種布局非常方便,但是當容器內(nèi)的組件太多時,就顯得高低參差不齊。為了布局的美觀,我們常采用容器嵌套的方法,即把一個容器嵌入到另一個容器中,使整個容器的布局達到應(yīng)用的需求。【例8.5】使用FlowLayout布局放置9個組件。程序名: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è)置容器的布局對象為fLsetBackground(Color.blue);for(int n=1;n=9;n+) add(new Button(This is +n)
31、; /向容器中添加按鈕【程序運行結(jié)果】 程序運行結(jié)果如圖8-4所示。圖8-4 FlowLayoutTest.java 運行結(jié)果【例8.6】在一個框架中以指定的對齊方式和間距排列12個按鈕。程序名:ShowFlowLayout.java【程序源代碼】/使用FlowLayout布局對象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); 表達式new FlowLayout(FlowLayout.CENTER, 10, 20)的作用是創(chuàng)建一個FlowLayout布局對象,布局規(guī)則是組件居中對齊;組件間的水平間距是10像素;垂直間距是20像素。8.3.2 GridLayout布局用GridLayout類創(chuàng)建的對象稱為GridLayout布局對
34、象。GridLayout布局對象將容器劃分為若干行、若干列的網(wǎng)格區(qū)域,組件就安置在這些網(wǎng)格中。GridLayout布局規(guī)則:向容器中添加組件時,從容器的第一行開始,按組件添加的順序,由左到右將組件排列在容器的網(wǎng)格中,第一行排滿后,再從第二行的左邊開始排列組件,依次類推,直到組件排完。GridLayout類的構(gòu)造方法如下:l public GridLayout(int rows, int columns, int hGap, int vGap):該方法用于創(chuàng)建一個布局對象,該布局對象將容器劃分為rows行、columns列。組件在容器中排列時的水平和垂直間距分別為hGap和vGap象素。l pu
35、blic GridLayout(int rows, int columns):該方法用于創(chuàng)建一個布局對象,此布局對象將容器劃分為rows行、columns列。組件在容器中排列時的水平和垂直間距均為0象素。l public GridLayout():每行存放一個組件。【例8.7】將10個按鈕排列成4行3列的網(wǎng)格。程序名:ShowGridLayout.java【程序源代碼】/使用GridLayout布局對象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); 【程序注釋】表達式new GridLayout(4, 3, 35, 5)創(chuàng)建的布局是將容器劃分為4行3列的網(wǎng)格,組件的水平間距為35像素,垂直間距為5像素。【程序運行結(jié)果】程序運行結(jié)果如圖8-5所示。圖8-5 Show
38、GridLayout.java運行結(jié)果采用GridLayout布局,每個網(wǎng)格大小相同,而組件與網(wǎng)格的大小也相同,這樣容器中的每個組件也都是大小相同的。為了克服這個缺點,可以使用容器嵌套。例如,使用GridLayout布局將一個容器分為3行1列的網(wǎng)格,然后將另一個容器添加到某個網(wǎng)格中,而添加的這個容器又可以設(shè)置為GridLayout布局、FlowLayout布局、CardLayout布局或BorderLayout布局之一。利用這種嵌套方法,可以設(shè)計出符合用戶要求的布局。8.3.3 BorderLayout布局用BorderLayout類創(chuàng)建的對象稱為BorderLayout布局對象,它將容器空間
39、劃分為東、西、南、北、中5個區(qū)域,中間的區(qū)域最大。BorderLayout布局對象是JFrame容器的默認布局對象。BorderLayout對象的布局規(guī)則:每向容器中加入一個組件,都應(yīng)該指明這個組件放置在哪個區(qū)域中。區(qū)域由BorderLayout中的靜態(tài)常量CENTER、NORTH、SOUTH、WEST、EAST標識。例如,一個使用BorderLayout布局的容器container,可以使用add()方法將一個組件b添加到中心區(qū)域:container.add(b,BorderLayout.CENTER);上面的語句等價于下面的語句:container.add(BorderLayout.CEN
40、TER, b);注意:語句container.add(b)與container.add(BorderLayout.CENTER, b)是等價的,即若將組件b添加到容器container的中央,則可以省略參數(shù)BorderLayout.CENTER。添加到某個區(qū)域的組件將占據(jù)整個區(qū)域。每個區(qū)域只能放置一個組件,如果向某個已放置了組件的區(qū)域再放置一個組件,那么先前的組件將被后者替換掉。使用BorderLayout布局的容器最多能添加5個組件,如果容器中需要加入超過5個組件,就必須使用容器的嵌套或采用其他的布局策略。BorderLayout類的構(gòu)造方法如下:l public BorderLayout(
41、int hGap, int vGap):該方法用于創(chuàng)建一個布局對象,該布局把容器中組件之間的水平和垂直間距分別設(shè)置為hGa和vGap個像素。l public BorderLayout():該方法用于創(chuàng)建一個布局對象,該布局把容器中組件之間的水平和垂直間距都設(shè)置為0像素。【例8.8】使用BorderLayout管理器在框架中放置5個按鈕。程序名: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個按鈕分別添加到內(nèi)容窗格中的5個區(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)閉事件時,關(guān)閉窗口 frame.setSize(300, 200); frame.setVisible(true); 【程序注釋】表達式new BorderLayout(5, 10)創(chuàng)建的布局對象使組件之間的水平和垂直間距分別為5像素和10像素?!境绦蜻\行結(jié)果】程序運行結(jié)果如圖8-6所示。圖8-6 程序ShowBorderLayout.java運行結(jié)果注意:(1)在BorderLayout布局下,南北組件自動水平擴展,東西組件
45、自動豎直拉伸,中央組件可以水平和豎直擴展。(2)JFrame的內(nèi)容窗格的默認布局是BorderLayout布局。8.3.4 CardLayout布局使用CardLayout布局的容器可以容納多個組件,但是同一時刻容器只能從這些組件中選出一個來顯示,就像一疊“撲克牌”每次只能顯示最上面的一張,這個被顯示的組件將占滿容器的所有空間。假設(shè)有一個容器con,那么使用CardLayout布局對象的一般步驟如下:(1)創(chuàng)建CardLayout布局對象card。例如:CardLayout card=new CardLayout();(2)使用容器的setLayout()方法把容器的布局方式設(shè)置為card。例
46、如:con.setLayout(card);(3)調(diào)用容器的con.add(String num,Componnemt b)方法將組件b加入容器con中,并給出該組件的代號num。組件的代號與組件的名稱沒有必然聯(lián)系,不同的組件代號互不相同。最先加入容器con的組件是第1張,第二次加入的組件是第2張,依次給組件排號。(4)使用布局對象card的show()方法顯示容器con中代號為num的組件。格式如下:card.show(con, num); /顯示容器con中代號是num的組件。也可以按組件加入容器的順序顯示組件。例如:card.first(con);/顯示con中的第一個組件card.la
47、st(con);/顯示con中的最后一個組件card.next(con);/顯示容器中的下一個組件card.previous(con);/顯示容器中的前一個組件【例8.9】在窗格中添加按鈕(next)、按鈕(previous)、面板(cardPanel),在面板中添加三個標簽作為卡片。面板(cardPanel)采用CardLayout布局管理器以管理三個標簽。按鈕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)建卡片布局對象 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);/向面板添加三個標簽對象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)聽器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)部類定義開始 public void actionPerformed(ActionEvent event) if (event.getActionCommand().equals(Next) /getActionCommand()來得到按鈕的名稱 cards.next(cardPanel); else cards.previous(cardPanel); /內(nèi)部類定義結(jié)束/外部類定義結(jié)束【程序運行
53、結(jié)果】程序運行結(jié)果如圖8-7所示。圖8-7 CardLayoutTest.java運行結(jié)果8.3.5 null布局可以將一個容器的布局設(shè)置為null布局(空布局)。組件擁有的一個方法setBounds(int a,int b,int width,int height),調(diào)用該方法可以設(shè)置組建的大小,并能設(shè)置組建在容器中的位置。例如,p是一個容器,將其布局管理器設(shè)置為null布局的格式如下:p.setLayout(null);向容器p(布局為null)添加一個組件c需要兩個步驟:(1)使用add(c)方法向容器添加組件c;(2)組件c調(diào)用setBounds(int x,int y,int wid
54、th,int height)方法(其中的參數(shù)x、y是組件c在容器中的位置坐標,即該組件距容器左面x像素,距容器上方y(tǒng)像素;width、height是組件c的寬和高)設(shè)置該組件在容器中的位置和組件大小。8.4 繪圖相關(guān)類可以使用適當?shù)念伾妥煮w來畫圖。下面將介紹Color類、Font類和FontMetrics類以及Graphics類中的繪圖方法。8.4.1 Color類可以使用java.awt包中的Color類為GUI組件設(shè)置顏色。顏色由紅、綠、藍三原色構(gòu)成,每種原色的亮度都用一個byte數(shù)據(jù)表示,即顏色值為0(最暗)到255(最亮)之間。這就是通常所說的RGB模式。1創(chuàng)建Color對象的語句格式Color color = new Color(r, g, b); 其中r、g、b分別用于指定一個顏色的紅、藍、綠成分(其值都是數(shù)字)。例如:Color color = new Color(128, 100, 100); 2設(shè)置組件的背景色和前景色可以使用定義在Component類中的方法setBackground(Color c)和setForeground(
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 促銷分紅合同范例
- 土地山林流轉(zhuǎn)合同范例
- 制鞋設(shè)備出售合同范例
- 探索圖形世界
- 探索古典音樂
- 2024年環(huán)保型鐵藝門窗安裝勞務(wù)分包合同協(xié)議3篇
- 2024年版房屋建筑工程施工協(xié)議詳細條款版B版
- 2024年煤矸石磚采購與運輸合同
- 秋分美食文化解析
- 2024年土方工程車隊租賃合同及車隊車輛維護保養(yǎng)協(xié)議3篇
- 某大學(xué)中西醫(yī)臨床(專升本)學(xué)士學(xué)位考試復(fù)習(xí)題
- 調(diào)查詢問筆錄授權(quán)委托書
- 2024電大《成本會計》形考任務(wù)6答案
- 福建省三明市三元區(qū)2022-2023學(xué)年八年級上學(xué)期期末物理試卷(滬科版)
- 2024年廣東高校招收中職畢業(yè)生考試數(shù)學(xué)試卷真題(含答案解析)
- 公共外交智慧樹知到期末考試答案章節(jié)答案2024年外交學(xué)院
- 家庭教育教師培訓(xùn)會(3篇模板)
- 2024年焊工(初級)證考試題庫及答案(900題)
- 部編版六年級上冊道德與法治期末測試卷及一套完整答案
- 2024年江西生物科技職業(yè)學(xué)院單招職業(yè)技能測試題庫帶解析答案
- 軍事理論-國家安全環(huán)境強化版智慧樹知到期末考試答案章節(jié)答案2024年國防大學(xué)
評論
0/150
提交評論