java高級組件GUI設(shè)計(jì).ppt_第1頁
java高級組件GUI設(shè)計(jì).ppt_第2頁
java高級組件GUI設(shè)計(jì).ppt_第3頁
java高級組件GUI設(shè)計(jì).ppt_第4頁
java高級組件GUI設(shè)計(jì).ppt_第5頁
已閱讀5頁,還剩158頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第10章 高級組件GUI設(shè)計(jì),10.1 界面布局管理 10.2 鍵盤事件(KeyEvent) 10.3 鼠標(biāo)事件(MouseEvent) 10.4 窗口與面板 10.5 菜單設(shè)計(jì) 10.6 對話框設(shè)計(jì),10.1 界面布局管理,從前面的例子我們可以看出,容器中的基本組件都是被簡單地加入到了容器,那時我們無法設(shè)計(jì)和控制這些組件在容器中的相互位置,從而導(dǎo)致了某些界面不合理。而Java語言中提供的布局編輯類,其目的正是為了將組件排列在容器中合適的位置上。Java.awt包中共定義了五種布局編輯類,分別是FlowLayout,BorderLayout,CardLayout,GridLayout和Grid

2、BagLayout。每個布局編輯類對應(yīng)一種布局策略,這五個類都是java.lang.Object類的直接子類。Javax.swing包中定義了4種布局編輯類,分別是BoxLayout、ScrollPaneLayout、ViewportLayout和OverlayLayout。下面將討論FlowLayout,BorderLayout,CardLayout,GridLayout和BoxLayout幾種常用的布局策略。,10.1.1 BorderLayout java.BorderLayout類是java.lang.Object類的直接子類。BorderLayout布局策略是把容器內(nèi)的空間劃分為東、

3、西、南、北、中五個區(qū)域(如圖10.1所示)。這五個區(qū)域分別用字符串常量East、West、South、North、Center表示。向這個容器內(nèi)每加入一個組件都應(yīng)該指明把它放在容器的哪個區(qū)域中。分布在北部和南部區(qū)域的組件將橫向擴(kuò)展至占據(jù)整個容器的長度;分布在東部和西部的組件將伸展至占據(jù)容器剩余部分的全部寬度;最后剩余的部分將分配給位于中央的組件。如果某個區(qū)域沒有分配組件,則其他組件可以占據(jù)它的空間。例如,如果北部沒有分配組件,則西部和東部的組件將向上擴(kuò)展到容器的最上方;如果西部和東部沒有分配組件,則位于中央的組件將橫向擴(kuò)展到容器的左右邊界。BorderLayout是JApplet的缺省布局策略

4、。,BorderLayout類有兩個構(gòu)造方法,分別是無參數(shù)的BorderLayout( )和帶參數(shù)的BorderLayout(int hgap, int vgap)。前者創(chuàng)建一個各組件間的水平、垂直間隔為0的BorderLayout類的對象;后者創(chuàng)建一個各組件間的水平間隔為hgap、垂直間隔為vgap的BorderLayout類的對象。 BorderLayout僅指定了五個區(qū)域的位置,如果容器中需要加入的組件超過五個,就必須使用容器的嵌套或改用其他的布局策略。讓我們先來看一個例子。,【示例程序c10_1.java】 使用BorderLayout布局策略在五個位置分別加入了四個按鈕和一個標(biāo)簽,當(dāng)

5、點(diǎn)擊按鈕時,標(biāo)簽的文本就是按鈕的標(biāo)簽的文本。 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class c10_1 extends JApplet implements ActionListener JButton bt1=new JButton(北部),bt2=new JButton(西部), bt3=new JButton(東部), bt4=new JButton(南部); JLabel lb1=new JLabel(中部); Container cp=getContentPane( );

6、public void init( ) / 設(shè)置BorderLayout 布局,組件間隔為10 cp.setLayout(new BorderLayout(10,10); cp.add(North,bt1); /將bt1放置于北區(qū) bt1.addActionListener(this);,cp.add(West,bt2); /將bt2放置于西區(qū) bt2.addActionListener(this); cp.add(East,bt3); /將bt3放置于東區(qū) bt3.addActionListener(this); cp.add(South,bt4); /將bt4放置于南區(qū) bt4.addAc

7、tionListener(this); cp.add(Center,lb1); /將bt5放置于中區(qū) ,public void actionPerformed(ActionEvent e) if (e.getSource( )=bt1) lb1.setText(按鈕1); else if (e.getSource( )=bt2) lb1.setText(按鈕2); else if (e.getSource( )=bt3) lb1.setText(按鈕3); else lb1.setText(按鈕4); ,圖10.1 程序c10_1的運(yùn)行結(jié)果,10.1.2 FlowLayout java.Flo

8、wLayout類是java.lang.Object類的直接子類。FlowLayout的布局策略是將遵循這種布局策略的容器中的組件按照加入的先后順序從左向右排列,當(dāng)一行排滿之后就轉(zhuǎn)到下一行繼續(xù)從左至右排列,每一行中的組件都居中排列。 FlowLayout是Applet缺省使用的布局編輯策略。 FlowLayout類有三個構(gòu)造方法,分別是: (1) FlowLayout( ) 用于創(chuàng)建一個版面設(shè)定為居中對齊、各組件的水平及垂直間隔為5個像素點(diǎn)的FlowLayout類的對象。,(2) FlowLayout(int align) 用于創(chuàng)建一個FlowLayout類的對象,版面按給出的align值對齊,

9、各組件的水平及垂直間隔為5個像素。align的值可以是FlowLayout.LEFT(左對齊)、FlowLayout.RIGHT(右對齊)、FlowLayout.CENTER(居中對齊)方式。,(3) FlowLayout(int align,int hgap,int vgap) 用于創(chuàng)建一個既指定對齊方式,又指定組件間間隔的FlowLayout類的對象。參數(shù)align作用及取值同上;參數(shù)hgap指定組件間的水平間隔;參數(shù)vgap指定各組件間的垂直間隔。間隔單位為像素點(diǎn)。 對于一個原本不使用FlowLayout布局編輯器的容器,若需要將其布局策略改為FlowLayout,可以使用setLayo

10、ut(new FlowLayout( )方法,該方法是所有容器的父類Container的方法,用于為容器設(shè)定布局編輯器。,10.1.3 CardLayout CardLayout的版面布局方式是將每個組件看成一張卡片,如同撲克牌一樣將組件堆疊起來,而顯示在屏幕上的每次只能是最上面的一個組件,這個被顯示的組件將占據(jù)所有的容器空間。用戶可通過表10.1所示的方法選擇使用其中的卡片。 CardLayout類有兩個構(gòu)造方法,分別是CardLayout( )和CardLayout(int hgap,int vgap)。前者使用默認(rèn)(間隔為0)方式創(chuàng)建一個CardLayout( )類對象;后者使用hgap

11、指定的水平間隔和vgap指定的垂直間隔創(chuàng)建一個CardLayout( )類對象。,表10.1 CardLayout類的常用成員方法,【示例程序c10_2.java】 使用CardLayout的布局在容器中放入三個按鈕,顯示第二個按鈕。 import java.awt.*; import javax.swing.*; public class c10_2 extends JApplet JButton bt1=new JButton(按鈕A); JButton bt2=new JButton(按鈕B); JButton bt3=new JButton(按鈕C); Container cp=get

12、ContentPane( ); /設(shè)置CardLayout布局,CardLayout card=new CardLayout(20,20); public void init( ) cp.setLayout(card); cp.add(a,bt1); cp.add(b,bt2); cp.add(c,bt3); card.next(cp); /顯示按鈕B ,該程序的運(yùn)行結(jié)果如圖10.2所示。 注意:在程序中調(diào)用容器的add( )方法可將組件加入到容器中。例如語句add(a,bt1);中的字符串“a是為組件分配的字符串名字,分配的目的是為了讓布局編輯器根據(jù)這個名字調(diào)用顯示這個組件。,圖10.2 程

13、序c10_2的運(yùn)行結(jié)果,10.1.4 GridLayout 如果界面上需要放置的組件較多,且這些組件的大小又基本一致時,例如計(jì)算器、遙控器的面板,使用GridLayout布局策略是最佳的選擇。GridLayout的布局策略是把容器的空間劃分為若干行、若干列的網(wǎng)格區(qū)域,而每個組件按添加的順序從左向右、從上向下地占據(jù)這些網(wǎng)格。,GridLayout類的三個構(gòu)造方法如下: (1) GridLayout( ):按默認(rèn)(1行1列)方式創(chuàng)建一個GridLayout布局。 (2) GridLayout(int rows,int cols):創(chuàng)建一個具有rows行、cols列的GridLayout布局。 (3

14、) GridLayout(int rows,int cols,int hgap,int vgap):按指定的行數(shù)rows、列數(shù)cols、水平間隔hgap和垂直間隔vgap創(chuàng)建一個GridLayout布局。,【示例程序c10_3.java】 使用GridLayout的布局,在容器中放入4個按鈕。 import java.awt.*; import javax.swing.*; public class c10_3 extends Japplet Container cp=getContentPane( ); public void init( ) /設(shè)置GridLayout布局 GridLayo

15、ut myLayout=new GridLayout(2,2,20,30);,cp.setLayout(myLayout); cp.add(new JButton(按鈕A); cp.add(new JButton(按鈕B); cp.add(new JButton(按鈕C); cp.add(new JButton(按鈕D); ,圖10.3 程序c10_3的運(yùn)行結(jié)果,10.1.5 BoxLayout BoxLayout是swing所提供的布局管理器,它的繼承關(guān)系如下: java.lang.Object javax.swing.BoxLayout BoxLayout只有兩種排列方式,一種是水平,另一

16、種是垂直。我們可以使用BoxLayout所提供的兩個常量X_AXIS、Y_AXIS來指明組件在容器中是水平還是垂直排列的。BoxLayout類與Box類結(jié)合,可以提供多樣化的布局。通常的做法是使用若干個Box容器,由于Box容器的默認(rèn)布局是BoxLayout,而且只能使用這個布局,因此,每一個Box容器中組件的排列方式也只能按水平或垂直方向排列。,1BoxLayout和Box的構(gòu)造函數(shù) 創(chuàng)建BoxLayout類的對象的構(gòu)造方法是: BoxLayout(Container target,int axis) 其中,target是容器對象;axis指明target中組件的排列方式,其值可為表示水平排

17、列的BoxLayout.X_AXIS,或?yàn)楸硎敬怪迸帕械腂oxLayout.Y_AXIS。,講到BoxLayout,我們不能不提到Box這個容器。Box這個容器默認(rèn)的布局是BoxLayout,而且只能使用這個布局,否則編譯時就會產(chǎn)生錯誤。由于BoxLayout是以水平或垂直方式排列的,因此,當(dāng)我們要創(chuàng)建一個Box容器時,就必須指定Box容器中組件的排列方式是水平還是垂直的。Box的構(gòu)造函數(shù)為: Box(int axis) Box的構(gòu)造函數(shù)中只有一個參數(shù)axis,用以指定Box中的組件是按水平還是按垂直方式排列的。axis的值可以用BoxLayout.X_AXIS或BoxLayout.Y_AXI

18、S指定,也可使用Box類提供的兩個方法creatHorizontalBox( )與creatVerticalBox( )來指定。,2BoxLayout類和Box類的常用成員方法,表10.2 BoxLayout類常用的成員方法,表10.3 Box類常用的成員方法,為方便布局管理,Box類還提供了4種透明組件Glue、Strut、Rigid和Filler,可以將這些透明組件插入其他組件的中間,使這些組件產(chǎn)生分開的效果。這4種透明組件的作用是: Glue:將Glue兩邊的組件擠到容器的兩端。 Strut:將Strut兩端的組件按水平或垂直方向指定的大小分開。 Rigid:可以設(shè)置二維的限制,將組件按

19、水平或垂直方向指定的大小分開。 Filler:不僅可以設(shè)置二維的限制,將組件按水平或垂直方向指定的大小分開,而且還可以設(shè)置最大、較佳、最小的長寬大小。 它們的具體用法請參閱示例程序c10_4.java。,3使用BoxLayout時需要注意的事項(xiàng) (1) 當(dāng)組件按BoxLayout布局排列好后,不管窗口縮小或放大都不會變動。 (2) 當(dāng)使用水平排列方式時,若放進(jìn)去的組件不等高,則系統(tǒng)將會使所有的組件與最高組件等高。 (3) 當(dāng)放在同一行的組件超出容器的寬度時,系統(tǒng)不會自動換行,需要用戶自行處理。,【示例程序c10_4.java】 使用BoxLayout布局,將6個組件按結(jié)果要求排列。 impor

20、t java.awt.*; import java.awt.event.*; import javax.swing.*; public class c10_4 extends JApplet public void init( ) Container cp=getContentPane( ); Box bBox=Box.createHorizontalBox( ); /設(shè)置bBox中的組件按水平方向排列,cp.add(bBox); /將bBox容器添加到cp對象中 /bBox中放入vBox1容器 Box vBox1=Box.createVerticalBox( ); /設(shè)置bBox1中的組件按

21、垂直方向排列 JLabel lb=new JLabel(這是標(biāo)簽); vBox1.add(lb); /添加標(biāo)簽到vBox1中 JButton bt1=new JButton(這是按鈕1); bt1.setMaximumSize(new Dimension(100,200); /設(shè)置按鈕的最大長度 vBox1.add(bt1); /添加按鈕到vBox1中 bBox.add(vBox1); /添加vBox1到bBox中 /bBox中放入vBox2容器,Box vBox2=Box.createVerticalBox( ); bBox.add(vBox2); JTextField tf1=new JT

22、extField(這是文本框,10); /設(shè)置文本框在容器中沿X方向居中對齊 tf1.setAlignmentX(Component.CENTER_ALIGNMENT); tf1.setMaximumSize(new Dimension(150,50); vBox2.add(tf1); /vBox2容器中放入vBox2h容器 Box vBox2h=Box.createHorizontalBox( ); /vBox2h容器上的組件按水平方向排列 vBox2.add(vBox2h); /vBox2h容器中放入vBox2h1,Box vBox2h1=Box.createVerticalBox( );

23、 /vBox2h1容器上的組件按垂直方向排列 /加入垂直透明組件Strut,間隔為20像素 vBox2h1.add(Box.createVerticalStrut(20); vBox2h1.add(new JTextArea(這是文本區(qū)域,15,10); vBox2h1.add(Box.createVerticalStrut(20); vBox2h.add(vBox2h1); / vBox2h容器中放入vBox2h2 Box vBox2h2=Box.createVerticalBox( ); vBox2h2.add(new JButton(這是按鈕2);,vBox2h2.add(Box.cre

24、ateVerticalGlue( ); /加入垂直透明組件Glue,組件擠到兩邊 vBox2h2.add(new JButton(這是按鈕4); vBox2h.add(vBox2h2); ,圖10.4 程序c10_4的運(yùn)行結(jié)果,從圖10.5中可以看出:bBox容器是最底層容器,它上面放入兩個容器vBox1和vBox2。vBox1容器中放入一個標(biāo)簽1組件和一個按鈕1組件。vBox2容器中放入一個文本框組件和一個vbox2h容器。vbox2h容器中放入vBox2h1容器和vBox2h2容器。vBox2h1容器中放入一個文本區(qū)域組件。vBox2h2容器中放入一個按鈕2組件和一個按鈕4組件。,10.2

25、 鍵盤事件(KeyEvent),當(dāng)用戶使用鍵盤進(jìn)行操作時則會產(chǎn)生KeyEvent事件。處理KeyEvent事件的監(jiān)聽者對象是可以實(shí)現(xiàn)KeyListener接口的類,或者是繼承KeyAdapter的子類。在KeyListener這個接口中有如下三個事件: keyPressed(KeyEvent e); 代表鍵盤按鍵被按下的事件。 keyReleased(KeyEvent e); 代表鍵盤按鍵被放開的事件。 keyTyped(KeyEvent e); 代表按鍵被敲擊的事件。,KeyEvent類中的常用方法有: (1) public char getKeyChar( )方法,它返回引發(fā)鍵盤事件的按鍵

26、對應(yīng)的Unicode字符。如果這個按鍵沒有Unicode字符與之對應(yīng),則返回KeyEvent類的一個靜態(tài)常量KeyEvent.CHAR-UNDEFINED。 (2) public String getKeyText( )方法,它返回引發(fā)鍵盤事件的按鍵的文本內(nèi)容。,【示例程序c10_5.java】 鍵盤事件程序。 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class c10_5 extends JApplet String s,s1; JLabel lb1=new JLabel(請按鍵盤);

27、JLabel lb2=new JLabel(復(fù)制結(jié)果); JTextField tf1=new JTextField(10); /用來輸入文字,圖10.5 圖形層次結(jié)構(gòu),JTextArea tf2=new JTextArea(5,10); /用來顯示文字內(nèi)容 Container cp=getContentPane( ); FlowLayout flow=new FlowLayout(FlowLayout.CENTER,5,5); public void init( ) cp.setLayout(flow); cp.add(lb1); cp.add(tf1); cp.add(lb2); cp.a

28、dd(tf2); tf1.addKeyListener(new koLis( ); ,class koLis extends KeyAdapter public void keyTyped(KeyEvent e) s=tf1.getText( )+e.getKeyChar( ); /獲取文本框的內(nèi)容及鍵入的字符 if(e.getKeyChar( )=n) /若按回車鍵,則將文本框的內(nèi)容送入文本域中 s1=tf2.getText( )+s; tf1.setText(); tf2.setText(s1); ,圖10.6 c10_5運(yùn)行結(jié)果,10.3 鼠標(biāo)事件(MouseEvent),在圖形用戶界面

29、中,鼠標(biāo)主要用來進(jìn)行選擇、切換或繪畫。當(dāng)用戶用鼠標(biāo)進(jìn)行交互操作時,會產(chǎn)生鼠標(biāo)事件MouseEvent。處理MouseEvent事件的監(jiān)聽者對象是可以實(shí)現(xiàn)MouseListener接口和MouseMotionListener接口的類,或者是繼承MouseAdapter的子類。與Mouse有關(guān)的事件可分為兩類:一類是MouseListener接口,共提供5種方法,主要針對鼠標(biāo)的按鍵與位置作檢測;另一類是MouseMotionListener接口,共提供2種方法,主要針對鼠標(biāo)的坐標(biāo)與拖動操作做處理。這些方法列于表10.4中。此外,MouseEvent類還提供了獲取發(fā)生鼠標(biāo)事件坐標(biāo)及點(diǎn)擊次數(shù)的成員方法

30、,我們將其列于表10.5中。,表10.4 MouseEvent事件及其監(jiān)聽者,表10.5 MouseEvent類的常用成員方法,【示例程序c10_6.java】 鼠標(biāo)事件程序。 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class c10_6 extends JApplet int x,y; JLabel lb1=new JLabel(X:), lb2=new JLabel(Y:), lb3=new JLabel(); JTextField tf1=new JTextField(5), tf

31、2=new JTextField(5); Container cp=getContentPane( ); FlowLayout flow=new FlowLayout(FlowLayout.CENTER,5,5); public void init( ) ,cp.setLayout(flow); cp.add(lb1); cp.add(tf1); cp.add(lb2); cp.add(tf2); cp.add(lb3); addMouseListener(new mouseListener( ); addMouseMotionListener(new koLis( ); class mous

32、eListener implements MouseListener public void mouseClicked(MouseEvent e) lb3.setText(點(diǎn)擊鼠標(biāo)); ,public void mousePressed(MouseEvent e) lb3.setText(鼠標(biāo)按鈕按下); public void mouseEntered(MouseEvent e) lb3.setText(鼠標(biāo)進(jìn)入窗口); public void mouseExited(MouseEvent e) lb3.setText(鼠標(biāo)不在窗口); public void mouseReleased(M

33、ouseEvent e) lb3.setText(鼠標(biāo)按鈕松開); class koLis implements MouseMotionListener public void mouseMoved(MouseEvent e) x=e.getX( ); y=e.getY( );,tf1.setText(String.valueOf(x); tf2.setText(String.valueOf(y); public void mouseDragged(MouseEvent e) lb3.setText(拖動鼠標(biāo)); ,圖10.7 程序c10_6的運(yùn)行結(jié)果,10.4 窗 口 與 面 板,10.4.

34、1 JFrame容器 JFrame是Java Application程序的圖形用戶界面容器,是一個有邊框的容器。JFrame類包含支持任何通用窗口特性的基本功能,如最小化窗口、移動窗口、重新設(shè)定窗口大小等。JFrame容器作為最底層容器,不能被其他容器所包含,但可以被其他容器創(chuàng)建并彈出成為獨(dú)立的容器。JFrame類的繼承關(guān)系如下:,java.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame javax.swing.JFrame,使用JFrame容器需要注意以下幾點(diǎn): (1) 可以使用

35、JFrame( )方法創(chuàng)建一個無標(biāo)簽的JFrame對象,也可以使用JFrame(String title)方法創(chuàng)建一個標(biāo)簽為title的JFrame對象,還可以使用專門的方法getTitle( )和setTitle(String)來獲取或指定Frame的標(biāo)題。 (2) 使用setSize(int x,int y)方法設(shè)置JFrame容器大小。 (3) 創(chuàng)建的JFrame是不可見的,若要使其可見,則需要使用show( )方法或給出實(shí)際參數(shù)為true的setVisible(boolean)方法。,(4) 向JFrame中添加組件時,必須先取得ContentPane,然后再使用add( )方法把組件

36、加入到此ContentPane中,而不能像AWT中的Frame那樣直接調(diào)用add( )方法。 (5) JFrame類可以引發(fā)WindowEvent類代表的所有七種窗口事件(見表10.8)。 (6) 每個JFrame在其右上角都有三個控制圖標(biāo)(如圖10.8所示),分別代表最小化、最大化和關(guān)閉窗口的操作。其中,JFrame可自動完成窗口的最小化和最大化操作,而關(guān)閉窗口的操作不能通過點(diǎn)擊關(guān)閉圖標(biāo)來實(shí)現(xiàn),但可以使用下述三個辦法之一來關(guān)閉窗口:, 設(shè)置一個按鈕,當(dāng)用戶點(diǎn)擊此按鈕時關(guān)閉窗口; 用WINDOWS_CLOSING事件做出響應(yīng),關(guān)閉窗口; 使用菜單命令。 無論使用哪一種辦法,都需要用到關(guān)閉JFr

37、ame的System.exit(0)方法。,【示例程序c10_7.java】 創(chuàng)建兩個窗口對象,點(diǎn)擊第一個窗口中的按鈕時打開第二個窗口。 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class c10_7 implements ActionListener public c10_7( ) ,JFrame f=new JFrame(這是一個JFrame); /創(chuàng)建JFrame對象 Container cp=f.getContentPane( ); /創(chuàng)建JFrame的容器對象 JButton b

38、t1=new JButton(請點(diǎn)擊); bt1.addActionListener(this); cp.add(bt1); f.pack( ); /調(diào)整窗口 f.show( ); /顯示窗口 f.addWindowListener(new WinLis( ); public void actionPerformed(ActionEvent e) ,JLabel lb=new JLabel(這是第二個窗口); JFrame nf=new JFrame( ); Container cp1=nf.getContentPane( ); nf.setTitle(這是一個新JFrame); nf.set

39、Size(180,100); /設(shè)置窗口大小 nf.show( ); cp1.add(lb); nf.addWindowListener(new WinLis( ); public static void main(String arg) ,new c10_7( ); class WinLis extends WindowAdapter public void windowsClosing(WindowEvent e) System.exit(0); ,圖10.8 程序c10_7的運(yùn)行結(jié)果1,圖10.9 程序c10_7的運(yùn)行結(jié)果2,10.4.2 窗口事件(WindowEvent) 從c10_7

40、.java程序的運(yùn)行結(jié)果可以看出,若刪除窗口事件,則窗口無法關(guān)閉。我們可以利用Java語言提供的窗口事件WindowEvent來對窗口進(jìn)行操作。WindowEvent類包含表10.6所列的幾個具體窗口事件。,表10.6 WindowEvent類包含的窗口事件,WindowEvent類的主要方法有g(shù)etWindow( )和getSource( )。這兩個方法的區(qū)別是:getWindow( )方法返回引發(fā)當(dāng)前WindowEvent事件的具體窗口,返回值是具體的Window對象;getSource( )方法返回的是相同的事件引用,其返回值的類型為Object。,【示例程序c10_8.java】 制作

41、兩個JFrame窗口,實(shí)現(xiàn)兩個窗口的切換、關(guān)閉、最小化等操作。 import java.awt.*; import javax.swing.*; import javax.swing.JFrame; import java.awt.event.*; public class c10_8 JLabel lb1=new JLabel(這是第一個窗口); JLabel lb2=new JLabel(這是第二個窗口); public static void main(String arg) new c10_8( ); ,public c10_8( ) JFrame f1=new JFrame( );

42、/創(chuàng)建JFrame對象 JFrame f2=new JFrame( ); Container cp=f1.getContentPane( ); /創(chuàng)建JFrame的容器對象,獲得ContentPane Container cp1=f2.getContentPane( ); f1.setTitle(JFrame1); f2.setTitle(JFrame2); f1.setSize(150,100); /設(shè)置窗口大小 f2.setSize(150,100); cp.add(lb1);,f1.show( ); /設(shè)置窗口為可見 cp1.add(lb2); f2.show( ); f1.addWin

43、dowListener(new WinLis( ); f2.addWindowListener(new WinLis( ); class WinLis extends WindowAdapter public void windowOpened(WindowEvent e) /打開窗口,public void windowActivated(WindowEvent e) /將窗口設(shè)置成活動窗口 public void windowDeactivated(WindowEvent e) /將窗口設(shè)置成非活動窗口 public void windowClosing(WindowEvent e) Sy

44、stem.exit(0); /窗口關(guān)閉 public void windowIconified(WindowEvent e) /最小化窗口 ,圖10.10 程序c10_8的運(yùn)行結(jié)果,10.4.3 JPanel容器 在設(shè)計(jì)用戶界面時,為了更合理的安排各組件在窗口的位置,可以考慮將所需組件先排列在一個容器中,然后將其作為一個整體嵌入窗口。Panel和JPanel就是這樣一類被稱為面板的容器。它們是一類無邊框的、不能被移動、放大、縮小或關(guān)閉的容器。AWT的Panel與Swing的JPanel的區(qū)別是:JPanel支持雙緩沖(Double Buffering)功能,在處理動畫上較少發(fā)生畫面閃爍的情況。

45、JPanel類的繼承關(guān)系如下:,java.lang.Object java.awt.Component java.awt.Container javax.swing.JComponent javax.swing.JPanel 不能把JPanel作為一個圖形界面程序最底層的容器,也不能指明JPanel的大小。JPanel總是作為一個容器組件被加入到JFrame、JApplet等其他容器中,當(dāng)然,JPanel也可以加入到JPanel容器中。JPanel的大小由包含在它里邊的組件,包容它的那個容器的布局策略,以及該容器中的其他組件所決定。,表10.7 JPanel類構(gòu)造方法,【示例程序c10_9.j

46、ava】 設(shè)置兩個面板容器p1和p2,點(diǎn)擊p1容器中的按鈕使p2容器的標(biāo)簽產(chǎn)生結(jié)果。 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class c10_9 public c10_9( ) ,JFrame f=new JFrame(JPanelDemo); Container cp=f.getContentPane( ); cp.setLayout(new GridLayout(2,1); JLabel lb=new JLabel3; /創(chuàng)建標(biāo)簽數(shù)組 for(int i=0; ilb.length

47、 ; i+) /設(shè)置每個標(biāo)簽的屬性 lbi=new JLabel(標(biāo)簽 +(i+1),JLabel.CENTER); lbi.setBackground(Color.yellow); /設(shè)置標(biāo)簽顏色 lbi.setBorder(BorderFactory.createEtchedBorder( ); /設(shè)置標(biāo)簽邊框 lbi.setOpaque(true); /讓組件變?yōu)椴煌该?,使?biāo)簽顏色顯示出來 ,JPanel pal1=new JPanel(new GridLayout(1,1); /創(chuàng)建面板對象 pal1.add(lb0); /加載第0個標(biāo)簽在面板上 JPanel pal2=new JPa

48、nel(new GridLayout(1,2); JPanel pal3=new JPanel(new BorderLayout( ); pal3.add(lb1,BorderLayout.NORTH); pal3.add(lb2,BorderLayout.SOUTH); pal3.add(new JButton(中部),BorderLayout.CENTER); JPanel pal4=new JPanel(new FlowLayout( ); pal4.add(new JTextArea(JTextArea,5,10); pal2.add(pal3); pal2.add(pal4); cp

49、.add(pal1); cp.add(pal2); f.pack( ); f.show( ); f.addWindowListener(new WinLis( );, class WinLis extends WindowAdapter public void windowClosing(WindowEvent e) System.exit(0); public static void main(String arg) new c10_9( ); ,圖10.11 程序c10_9的運(yùn)行結(jié)果,程序說明: 該程序的最底層容器是cp容器,它上面放入了pal1容器和pal2容器。pal1容器中放入了一個

50、標(biāo)簽1組件。pal2容器中放入pal3容器和pal4容器。pal3容器中放入一個標(biāo)簽2組件、一個按鈕組件和一個標(biāo)簽3組件。pal4容器中放入一個文本域組件。,10.4.4 JScrollPane容器 當(dāng)窗口里的內(nèi)容大于窗口時,我們可以在窗口的右邊和下邊設(shè)置滾動條,借助于滾動條我們就可以看到整個窗口的內(nèi)容。JScrollPane就是具有這種功能的組件,我們將它稱為滾動面板,用于滾動窗口。JScrollPane類的繼承關(guān)系如下: java.lang.Object java.awt.Component java.awt.Container javax.swing.JComponent javax.s

51、wing. JScrollPane 創(chuàng)建JScrollPane類的對象的構(gòu)造方法列于表10.8中。,表10.8 JScrollPane類的構(gòu)造方法,還可以利用下面的參數(shù)來設(shè)置JScrollPane中滾動條的出現(xiàn)時機(jī): HORIZONTAl_SCROLLBAR_ALWAYS:顯示水平滾動條。 VERTICAl_SCROLLBAR_ALWAYS:顯示垂直滾動條。 HORIZONTAl_SCROLLBAR_NEVER:不顯示水平滾動條。 VERTICAL_SCROLLBAR_NEVER:不顯示垂直滾動條。 HORIZONTAl_SCROLLBAR_AS_NEEDED:需要時顯示水平滾動條,即當(dāng)組件的

52、內(nèi)容在水平方向上大于顯示區(qū)域時出現(xiàn)水平滾動條。 VERTICAl_SCROLLBAR_AS_NEEDED:需要時顯示垂直滾動條,即當(dāng)組件的內(nèi)容在垂直方向上大于顯示區(qū)域時出現(xiàn)垂直滾動條。 這些參數(shù)是在ScrollPaneConstants接口中定義的,而JScrollPane類實(shí)現(xiàn)了此接口,因此也就能使用這些參數(shù)。,10.4.5 JScrollbar組件 事實(shí)上,JScrollPane是由JViewPort和JScrollBar組件組成的。JViewPort組件主要負(fù)責(zé)顯示內(nèi)容的區(qū)域大?。籎ScrollBar組件則產(chǎn)生窗口滾動條,讓用戶看到整個內(nèi)容。用戶使用JScrollPane組件時不會直接與

53、JViewPort和JScrollBar組件打交道,使用比較方便。但是,當(dāng)我們想對滾動條做更細(xì)的設(shè)置時,例如在拖動時一次滾動多少區(qū)域等,就必須了解JScrollBar所提供的功能。,圖10.12 滾動條各部分的名稱,1JScrollbar組件的構(gòu)造方法,表10.9 JScrollbar類構(gòu)造方法,在JScrollbar的構(gòu)造方法中,參數(shù)orientation的值可為JScrollbar.VERTICAL或JScrollbar.HORIZONTAL,用于指定滾動條的方向;value值用于指定滾動塊的初始值,默認(rèn)為0,表示開始時滾動塊就設(shè)置在這個位置上;extent值用于指定滾動塊的位移區(qū)域,當(dāng)用

54、戶在滾動塊與滾動箭頭之間點(diǎn)擊時,將由這個值來確定滾動塊應(yīng)移動的位置;minimum值用于指定滾動槽的最小值(默認(rèn)值為0);maximum值用于指定滾動槽的最大值(默認(rèn)值為100)。在實(shí)際使用中,如果value值小于minimum值,那么value值被設(shè)置成等于minimum值。如果value值大于maximum值,那么value值就設(shè)置成等于maximum值。若設(shè)extent=20,minimum=0,maximum=100,則滾動塊的位移范圍為080。,2JScrollbar類的常用成員方法,表10.10 JScrollbar類的成員方法,表10.10 JScrollbar類的成員方法,3調(diào)

55、整事件(AdjustmentEvent) JScrollbar能夠接受調(diào)整事件(AdjustmentEvent)。AdjustmentEvent類只包含一個事件,即代表GUI組件狀態(tài)發(fā)生連續(xù)變化的事件ADJUSTMENT_VALUE_CHANGED。當(dāng)用戶通過各種方式改變滾動塊位置從而改變其代表的數(shù)值時,都會引發(fā)調(diào)整事件。 為了對JScrollbar上發(fā)生的調(diào)整事件進(jìn)行處理,在程序中必須注冊調(diào)整事件的監(jiān)聽者對象,并通過相應(yīng)的方法來實(shí)現(xiàn)其功能。例如,在c10_10.java中注冊了滾動條的AdjustmentListener接口的調(diào)整事件的監(jiān)聽者對象sbr.addAdjustmentListen

56、er(this),并在實(shí)現(xiàn)了監(jiān)聽者的類中定義了響應(yīng)事件的adjustmentValueChanged(AdjustmentEvent e)方法,當(dāng)改變滾動塊位置時,系統(tǒng)就會自動調(diào)用該方法進(jìn)行處理。,【示例程序c10_10.java】 設(shè)計(jì)一個標(biāo)簽、三個滾動條,三個滾動條分別代表紅、綠、藍(lán)三種顏色,改變滑塊的值從而改變標(biāo)簽背景的顏色。 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class c10_10 implements AdjustmentListener int r=0,g=0,b=0;

57、 String s,s1= ,s2= ,s3= ; JScrollBar sbr,sbg,sbb; /聲明建立滾動條對象 JPanel pa1,pa2,pa3;,JLabel lb1= new JLabel(刻度:), lb2=new JLabel( 標(biāo)簽 ), lb3=new JLabel( 調(diào)色版 ), lbr=new JLabel(紅色), lbg=new JLabel(綠色), lbb=new JLabel(藍(lán)色); public c10_10( ) JFrame f = new JFrame(JScrollBar); Container cp=f.getContentPane( ); Box baseBox=Box.createVerticalBox( ); cp.add(baseBox); Box box1=Box.createHorizontalBox( );,box1.add(lb1); box1.add(lb2); baseBox.add(box1); Box box3=Box.createVerticalBox( ); baseBox.add(box3); lb3.setBackground(new Color(0,0,0); /設(shè)置標(biāo)簽顏色 lb3.setBorder(BorderFactory.createEtchedBorder( );/設(shè)置標(biāo)簽邊框

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論