版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第九章Swing圖形用戶界面9.1概述9.2容器組件9.3基本組件9.4布局管理器9.5事件處理模型9.6本章小結(jié)9.1概述圖形用戶界面(GUI)CommandLineGraphicsUserInterface數(shù)據(jù)的圖形顯示形式友好的交互方式簡化計算機(jī)軟件的學(xué)習(xí)過程GUI示例jdk1.7\demo\jfc\SwingSet2GUI組件:Labels,Textfields,Buttons等等9.1概述在Java語言中,有兩個包(java.awt和javax.swing)囊括了實現(xiàn)圖形用戶界面的所有基本元素,這些基本元素主要包括容器、組件、繪圖工具和布局管理器等。java.awt是java1.1用來建立GUI的圖形包,awt是抽象窗口工具包(AbstractWindowToolkit)的縮寫,其中的組件常被稱為AWT組件。javax.swing是Java2提出的AWT的改進(jìn)包,主要改善了組件的顯示外觀,增強(qiáng)了組件的控制能力。9.1概述早期版本的AWT組件在java.awt包里,包括Button、Checkbox、Scrollbar等,都是Component類的子類大部分含有nativecode,所以隨操作系統(tǒng)平臺的不同會顯示出不同的樣子,而不能進(jìn)行更改,是重量級組件(heavyweightcomponents)沒有彈性、缺乏效率59.1概述AWT與Swingjava.awt包中的類及相互關(guān)系可以用下圖來描述:事件類字體類GraphicsComponent顏色類布局管理類java.lang.ObjectCheckboxContainerButton…WindowPanelAppletDialogFrameList圖像類菜單類Scrollpane9.1概述較新的Swing組件其名稱都是在原來AWT組件名稱前加上J,例如JButton、JCheckBox、JScrollbar等,都是JComponent類的子類Java1.2推出,架構(gòu)在AWT之上,是AWT的擴(kuò)展而不是取代,AWT仍然是Swing的一個必備補(bǔ)充。完全是由java語言編寫的,其外觀和功能不依賴于任何由宿主平臺的窗口系統(tǒng)所提供的代碼,是輕量級組件(lightweightcomponents)可提供更豐富的視覺感受,被越來越多地使用9.1概述Swing組件在javax.swing包中,源于AWT(packagejava.awt)的組件定義了兩種類型的組件:頂層容器(JFrame,JApplet,JDialog和JWindow)輕量級組件(JComponent)Swing組件都是AWT的Container類的直接子類和間接子類。Swing組件以"J"開頭,除了有與AWT類似的按鈕(JButton)、標(biāo)簽(JLabel)、復(fù)選框(JCheckBox)、菜單(JMenu)等基本組件外,還增加了一個豐富的高層組件集合,如表格(JTable)、樹(JTree)。9.1概述AWT與Swing頂層窗口類之間的關(guān)系9.1概述Swing組件9.1概述Swing的組件和容器層次JComponent類是除了頂層容器以外所有Swing組件的基類,根據(jù)繼承關(guān)系,我們可以在每個基類中找到大多數(shù)GUI組件的常見操作Component類包含paint、repaint方法,可以在屏幕上繪制組件大多數(shù)GUI組件直接或間接擴(kuò)展ComponentContainer類容納相關(guān)組件包括add方法,用來添加組件包括setLayout方法,這個方法可用來設(shè)置布局,以幫助Container對象對其中的組件進(jìn)行定位和設(shè)置組件大小JComponent類——多數(shù)Swing組件的超類可抽換的外觀和感覺,即可根據(jù)需求定制外觀和感覺??旖萱I(通過鍵盤直接訪問GUI組件)一般的事件處理功能9.1概述--Swing的組件和容器層次通常將javax.swing包里的Swing組件歸為三個層次頂層容器中間層容器基本組件容器層次結(jié)構(gòu)是一個以頂層容器為根的樹狀組件集合為了顯示在屏幕上,每個組件必須是一套容器層次結(jié)構(gòu)的一部分每個組件只能放置在某個容器內(nèi)一次如果某個組件已經(jīng)在一個容器中,又將它加到另外一個容器中,這個組件就會從第一個容器中清除容器本身也是一種組件9.1概述--Swing的組件和容器層次頂層容器Swing提供三個頂層容器的類JFrame實現(xiàn)單個主窗口JDialog
實現(xiàn)一個二級窗口(對話框)JApplet在瀏覽器窗口中實現(xiàn)一個applet顯示區(qū)域必須和操作系統(tǒng)打交道,所以都是重量級組件從繼承結(jié)構(gòu)上來看,它們分別是從原來AWT組件的Frame、Dialog和Applet類繼承而來。每個使用Swing組件的Java程序都必須至少有一個頂層容器,別的組件都必須放在這個頂層容器上才能顯現(xiàn)出來。9.1概述--Swing的組件和容器層次中間層容器其存在的目的僅僅是為了容納別的組件,使界面有條理,美觀,易于控制。分為兩類一般用途的JPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar特殊用途的JInternalFrameJRootPane可以直接從頂層容器中獲得一個JRootPane對象來直接使用,而別的中間容器使用的時候需要新建一個對象。9.1概述--Swing的組件和容器層次基本組件通常是在圖形用戶界面中和用戶進(jìn)行交互的組件基本功能是和用戶交互信息,而不像前兩種組件那樣是用來容納別的組件的根據(jù)功能的不同,可被分為三類顯示不可編輯信息的JLabel、JProgressBar、JToolTip有控制功能、可以用來輸入信息的JButton、JCheckBox、JRadioButton、JComboBox、JList、JMenu、JSlider、JSpinner、JTexComponent等能提供格式化的信息并允許用戶選擇的JColorChooser、JFileChooser、JTable、JTree9.1概述--Swing的組件和容器層次三層容器結(jié)構(gòu)示例importjavax.swing.*;importjava.awt.*;publicclassEx10_1{publicstaticvoidmain(String[]args){
JFrame.setDefaultLookAndFeelDecorated(true);JFrameframe=newJFrame("SwingFrame");ContainercontentPane=frame.getContentPane();
JPanelpanel=newJPanel();panel.setBorder(BorderFactory.createLineBorder(Color.black,5));panel.setLayout(newGridLayout(2,1));JLabellabel=newJLabel("Label",SwingConstants.CENTER);JButtonbutton=newJButton("Button");panel.add(label);panel.add(button);contentPane.add(panel);frame.pack();//對組件進(jìn)行排列
frame.show();//顯示
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}9.1概述--Swing的組件和容器層次運行結(jié)果程序說明首先創(chuàng)建一個JFrame類頂級容器frame然后獲得頂級容器的內(nèi)容面板contentPane,只有通過它才能加入其他組件。然后創(chuàng)建一個JPanel類的中間容器panel,并設(shè)置邊框以及布局然后創(chuàng)建基本控制組件Label,button,并將它們添加到中間容器上然后將中間容器通過內(nèi)容面板添加到頂層容器上,并對組件進(jìn)行排列基于Swing的JavaGUI設(shè)計思路基本的java程序的GUI設(shè)計工具。主要包括下述幾個概念:組件—Component容器—Container布局管理器—LayoutManager事件處理在Java中,開發(fā)一個GUI程序,通常需要以下幾步:構(gòu)建一個頂層容器;通常是JFrame或JApplet構(gòu)建若干個組件,組件可以是其它容器;設(shè)定容器的布局管理器;用容器的add方法將這些組件加入到這個容器中;設(shè)置組件事件;并將組件事件與代碼關(guān)聯(lián)。第九章Swing圖形用戶界面9.1概述9.2容器組件9.3基本組件9.4布局管理器9.5事件處理模型9.6本章小結(jié)9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件Swing提供了3個頂層容器類:JFrame、JApplet、JDialog都是重量級組件,分別繼承了AWT組件Frame、Applet和Dialog每個頂層容器都有一個內(nèi)容面板,通常直接或間接的容納別的可視組件可以有選擇地為頂層容器添加菜單,菜單被放置在頂層容器上9.2容器組件——JFrame框體(JFrame)JFrame是一種具有邊框的容器,它是JavaApplication程序的圖形用戶界面的最外層容器。特點:(1)有邊框(2)能被移動、縮放和關(guān)閉(3)作為最外層容器,不能被其它容器所包含(4)默認(rèn)布局:邊界布局(BorderLayout)9.2容器組件——JFrame類JFrame
是java.awt.Frame的子類在Swing的組件中,JFrame
并不全是由Java編寫的是一種與平臺關(guān)系比較密切的組件(Heavyweightcomponent)java.lang.Object
|+--java.awt.Component
|+--java.awt.Container
|+--java.awt.Window|+--java.awt.Frame
|+--javax.swing.Jframe每個包含Swing組件的主窗口都應(yīng)用JFrame來實現(xiàn)9.2容器組件——JFrame構(gòu)造函數(shù)JFrame();建立一個無標(biāo)題的FrameJFrame(Stringtitle);建立一個標(biāo)題為title的Frame。常用方法StringgetTitle();獲取窗口標(biāo)題voidsetTitle(Strings);設(shè)置窗口標(biāo)題voidsetVisible(booleanb);設(shè)置窗口可見性voidsetBounds(inta,intb,intwidth,intheight);設(shè)置窗口位置和大小voidsetBackground(Colorc);設(shè)置窗口背景顏色voidpack();
用緊湊方式顯示窗口voidsetSize(intwidth,intheight);設(shè)置窗口大小voidsetLocation(intx,inty);設(shè)置初始位置。其中x,y是窗口左上角在屏幕上的坐標(biāo)值。9.2容器組件——JFrame常用方法通過setDefaultCloseOperation(intoperation)方法設(shè)置關(guān)閉行為。其中operation的取值可以是以下幾種:DO_NOTHING_ON_CLOSE:當(dāng)窗口關(guān)閉時,不做任何處理;HIDE_ON_CLOSE:當(dāng)窗口關(guān)閉時,隱藏這個窗口;DISPOSE_ON_CLOSE:當(dāng)窗口關(guān)閉時,隱藏并處理這個窗口;EXIT_ON_CLOSE:當(dāng)窗口關(guān)閉時,退出程序。默認(rèn)是HIDE_ON_CLOSE。9.2容器組件——JFrame創(chuàng)建窗體有兩種方式:直接創(chuàng)建JFrame的對象,適合于簡單框體;繼承JFrame類,在繼承類中編寫代碼對框體進(jìn)行詳細(xì)的刻畫,適合框體比較復(fù)雜的情況。大多數(shù)情況下開發(fā)人員都用第二種方法。注意:框體創(chuàng)建以后是不可見的,必須調(diào)用Window類的show()方法或Component類的setVisible()方法顯示該框體見以下兩個例子:9.2容器組件——JFrame直接創(chuàng)建JFrame的對象importjavax.swing.*;publicclassSample10_2{ publicstaticvoidmain(String[]args){ //創(chuàng)建一個框體對象
JFramemyWindow=newJFrame(); //向框體中添加一個標(biāo)簽
myWindow.add(newJLabel(“這是一個框體,演示了JFrame類的基本功能")); //設(shè)置框體的標(biāo)題
myWindow.setTitle(“自定義的框體"); //設(shè)置框體的大小
myWindow.setBounds(80,80,480,180); //根據(jù)接收的boolean設(shè)置框體是否可以調(diào)整大小
myWindow.setResizable(false); //設(shè)置框體的可見性
myWindow.setVisible(true); }}9.2容器組件——JFrame繼承JFrame類importjavax.swing.*;classMyWindowextendsJFrame{ //定義無參構(gòu)造函數(shù)
publicMyWindow(){} publicMyWindow(booleanb){ //向框體中添加一個標(biāo)簽
this.add(newJLabel(“這是一個框體,演示了JFrame類的基本功能")); //設(shè)置框體的標(biāo)題
this.setTitle(“自定義的框體"); //設(shè)置框體的大小
this.setBounds(80,80,480,180); //根據(jù)接收的boolean設(shè)置框體是否可以調(diào)整大小
this.setResizable(b); //設(shè)置框體的可見性
this.setVisible(true); }}publicclassSample10_2{ publicstaticvoidmain(String[]args){ //創(chuàng)建MyWindow類的對象,并傳遞False值使得框體不能調(diào)整大小
newMyWindow(false);
}}9.2容器組件——JFrame繼承JFrame類importjavax.swing.*;publicclassMyWindowextendsJFrame{ //定義無參構(gòu)造函數(shù)
publicMyWindow(){} publicMyWindow(booleanb){ //向窗體中添加一個標(biāo)簽
this.add(newJLabel("這是一個窗體,演示了JFrame類的基本功能")); //設(shè)置窗體的標(biāo)題
this.setTitle("自定義的窗體"); //設(shè)置窗體的大小
this.setBounds(80,80,480,180); //根據(jù)接收的boolean設(shè)置窗體是否可以調(diào)整大小
this.setResizable(b); //設(shè)置窗體的可見性
this.setVisible(true); } publicstaticvoidmain(String[]args){
newMyWindow(false);
}}9.2容器組件——JFrame在JFrame中加入組件的方法用getContentPane()方法獲得JFrame的內(nèi)容面板,再對其加入組件:
Containerc=frame.getContentPane()c.add(childComponent)建立一個JPanel或JDesktopPane之類的中間容器,把組件添加到容器中,用setContentPane()方法把該容器置為JFrame的內(nèi)容面板:
JPanelcontentPane=newJPanel();
……//把其它組件添加到Jpanel中;
frame.setContentPane(contentPane);
//把contentPane對象設(shè)置成為frame的內(nèi)容面板9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JDialog對話框(JDialog)對話框(JDialog)與JFrame一樣,都是有邊框和標(biāo)題的獨立使用的容器,不能被其它容器所包容。與JFrame的不同之處:不能作為程序的最外層容器,它必須屬于某個JFrame,由該JFrame彈出。對話框可以接受用戶的輸入,實現(xiàn)與用戶的交互作用。9.2容器組件——JDialogJDialog的繼承結(jié)構(gòu)java.lang.Object
|+--java.awt.Component
|+--java.awt.Container
|+--java.awt.Window|+--java.awt.Dialog
|+--javax.swing.JDialog要實現(xiàn)對話框,需要從JDialog派生一個類9.2容器組件——JDialog構(gòu)造函數(shù)JDialog(Frameowner)功能:建立無標(biāo)題的通用對話框,它屬于窗口owner,可以響應(yīng)其它窗口。JDialog(Frameowner,booleand)功能:建立無標(biāo)題的通用對話框,它屬于窗口owner,若d為true則不能響應(yīng)其它窗口。JDialog(Frameowner,Stringtxt)功能:建立標(biāo)題為txt的通用對話框,它屬于窗口owner,可以響應(yīng)其它窗口。JDialog(Frameowner,Stringtxt,booleand)功能:建立標(biāo)題為txt的通用對話框,它屬于窗口owner,若d為true則不能響應(yīng)其它窗口。9.2容器組件——JDialog常用方法
表列出了通用對話框JDialog類的幾個常用的方法。方法說明ContainergetContentPane()返回該通用對話框的contentPanelvoidsetLayout(LayoutManager
manager)設(shè)置布局管理器Componentadd(Component
comp)在對話框中添加組件voidsetBackground(Colorc)設(shè)置對話框的背景色voidsetLocation(intx,inty)設(shè)置對話框的顯示位置voidsetSize(intwidth,intheight)設(shè)置對話框的大小voidsetVisible(booleanb)設(shè)置對話框是否可見9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JAppletJApplet的繼承結(jié)構(gòu)java.lang.Object
|+--java.awt.Component
|+--java.awt.Container
|+--java.awt.Panel|+--java.awt.Applet
|+--javax.swing.JApplet每個包含Swing組件的Applet都應(yīng)作為JApplet的子類來實現(xiàn)JApplet類的頂層容器由瀏覽器提供,通常不需要自己產(chǎn)生一個JApplet類的對象。JFrame和JDialog通過構(gòu)造方法進(jìn)行創(chuàng)建。9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JPanel面板JPanelSwing的JPanel,它替代了AWT的畫布(Canvas)和面板(Panel),兼有二者的功能。是一種經(jīng)常使用的輕量級中間容器在默認(rèn)狀態(tài)下,除了背景色外它并不繪制任何東西很容易地設(shè)置邊框和繪制特性,可以把它設(shè)置為頂層容器contentPane。有效地利用JPanel可以使版面管理更為容易JPanel不能象JFrame那樣能夠在桌面上浮動。9.2容器組件——JPanel可以通過setLayout方法來改變其布局也可以在創(chuàng)建一個JPanel對象時就為它確定某種布局方式。在默認(rèn)狀態(tài)下panel使用FlowLayout布局,將各組件布局在一行對于復(fù)雜GUI,可以添加各種組件(包括面板組件)面板(JPanel)的大小由它所包含的組件決定當(dāng)組件個數(shù)增加,面板(JPanel)也會隨之而增大9.2容器組件——JPanel常用方法名稱說明JPanel()創(chuàng)建一個JPanel,默認(rèn)布局是FlowLayoutJPanel(LayoutManagerlayout)創(chuàng)建一個指定布局的JPanelvoidadd(Componentcomp)添加組件voidadd(Componentcomp,intindex)把組件添加到特定位置上intgetComponentCount()獲得這個panel里所有組件的數(shù)量ComponentgetComponent(intindex)獲得指定序號的某個組件ComponentgetComponentAt(intx,inty)獲得指定位置的某個組件voidremove(Component)移除某個組件voidremoveAll()移除所有組件voidsetLayout(LayoutManagerlayout)設(shè)置布局LayoutManagergetLayout()得到現(xiàn)有布局voidsetBorder(Borderborder)設(shè)置邊框9.2容器組件——JPanel利用JPanel創(chuàng)建界面importjava.awt.*;importjavax.swing.*;publicclassJPanelDemoextendsJFrame{publicJPanelgetGUI(){ JPanelp=newJPanel(); p.add(newJButton("Pressme")); returnp;}publicstaticvoidmain(Stringargs[]){ JPanelDemojp=newJPanelDemo(); jp.setTitle("JPanelDemo"); jp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jp.setContentPane(jp.getGUI()); jp.setSize(200,200); jp.setVisible(true); }}9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JScrollPaneJScrollPane(滾動窗口面板)當(dāng)容器內(nèi)要容納的內(nèi)容大于容器大小的時候,我們希望容器能夠有一個滾動條,通過拖動滑塊,就可以看到更多的內(nèi)容。JScrollPane就是能夠?qū)崿F(xiàn)這種功能的特殊容器由九個部分組成,包括一個中心顯示地帶、四個角和四條邊。JScrollPane主要是通過移動JViewport(視角)來實現(xiàn)的。JViewport是一種特殊的對象,用于查看基層組件,滾動條實際就是沿著組件移動視口,同時描繪出它在下面"看到"的內(nèi)容。9.2容器組件——JScrollPaneJScrollPane常用API名稱說明staticintHORIZONTAL_SCROLLBAR_ALWAYS水平滾動條策略常數(shù):總是顯示staticintHORIZONTAL_SCROLLBAR_AS_NEEDED水平滾動條策略常數(shù):當(dāng)顯示內(nèi)容水平區(qū)域大于顯示區(qū)域時才出現(xiàn)staticintHORIZONTAL_SCROLLBAR_NEVER水平滾動條策略常數(shù):總是不顯示staticintVERTICAL_SCROLLBAR_ALWAYS垂直滾動條策略常數(shù):總是顯示staticintVERTICAL_SCROLLBAR_AS_NEEDED垂直滾動條策略常數(shù):當(dāng)顯示內(nèi)容垂直區(qū)域大于顯示區(qū)域時才出現(xiàn)staticintVERTICAL_SCROLLBAR_NEVER垂直滾動條策略常數(shù):總是不顯示JScrollPane()建立一個空的JScrollPane對象JScrollPane(Componentview)建立一個顯示組件的JScrollPane對象,當(dāng)組件內(nèi)容大于顯示區(qū)域時,自動產(chǎn)生滾動條9.2容器組件——JScrollPaneJScrollPane常用API名稱說明voidsetViewportView(Component)設(shè)置JscroollPane要中心地帶要顯示的組件voidsetVerticalScrollBarPolicy(int)intgetVerticalScrollBarPolicy()設(shè)置或者讀取垂直滾動條策略常數(shù)voidsetHorizontalScrollBarPolicy(int)intgetHorizontalScrollBarPolicy()設(shè)置或者讀取水平滾動條策略常數(shù)voidsetViewportBorder(Border)BordergetViewportBorder()設(shè)置或者讀取中心顯示地帶的邊框voidsetWheelScrollingEnabled(Boolean)BooleanisWheelScrollingEnabled()設(shè)置或者讀取是否隨著鼠標(biāo)滾輪滾動出現(xiàn)或隱藏滾動條,默認(rèn)狀態(tài)下為真voidsetColumnHeaderView(Component)voidsetRowHeaderView(Component)設(shè)置顯示在上面的邊上的組件設(shè)置顯示在左面的邊上的組件voidsetCorner(Stringkey,Componentcorner)設(shè)置要顯示在指定角上的組件ComponentgetCorner(Stringkey)獲得指定角上的組件9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JSplitPaneJSplitPane可以把兩個組件顯示在兩個顯示區(qū)域內(nèi),且隨著區(qū)域間分隔線的拖動,區(qū)域內(nèi)組件的大小也隨之發(fā)生變動它允許設(shè)置水平分割或者垂直分割;也允許設(shè)置動態(tài)拖曳功能(拖動分界線時兩邊組件是否會隨著拖曳動態(tài)改變大小還是在拖曳結(jié)束后才改動)通常先把組件放到ScrollPane中,再把ScrollPane放到SplitPane中。這樣在每部分窗口中,都可以拖動滾動條看到組件的全部內(nèi)容9.2容器組件——JSplitPaneJSplitPane常用API名稱說明staticintHORIZONTAL_SPLIT水平分割常數(shù)staticintVERTICAL_SPLIT垂直分割常數(shù)JSplitPane()創(chuàng)建一個JSplitPane,以水平方向排列,兩邊各是一個button,沒有動態(tài)拖曳功能JSplitPane(intnewOrientation)建立一個指定分割方向的JSplitPane,沒有動態(tài)拖曳功能,參數(shù)為兩個分割常數(shù)之一JSplitPane(intnewOrientation,BooleannewContinuousLayout)指定分割方向,并可指定是否有動態(tài)拖曳功能JSplitPane(intnewOrientation,BooleannewContinuousLayout,ComponentnewLeftComponent,ComponentnewRightComponent)指定分割方向、是否具有動態(tài)拖曳功能,和兩側(cè)組件9.2容器組件——JSplitPaneJSplitPane常用API名稱說明JSplitPane(intnewOrientation,ComponentnewLeftComponent,ComponentnewRightComponent)指定分割方向和兩側(cè)組件,無自動拖曳功能voidsetOrientation(intnewOrientation)intgetOrientation()設(shè)置或獲得分割方向voidsetDividerSize(int)intgetDividerSize()設(shè)置或讀取分隔線條的粗細(xì)voidsetContinuousLayout(booleannCL)booleanisContinuousLayout()設(shè)置或讀取是否使用動態(tài)拖曳功能voidsetOneTouchExpandable(BooleanoTE)booleanisOneTouchExpandable()設(shè)置或讀取是否在分隔線上顯示一個控鍵來完全擴(kuò)展和完全壓縮單側(cè)內(nèi)容。voidremove(Componentcomp)voidadd(Componentcomp)刪除或添加組件。只可以添加兩個組件9.2容器組件——JSplitPaneJSplitPaneDemo.javaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.event.*;importjava.util.*;publicclassSplitPaneDemoimplementsListSelectionListener{privateVectorimageNames;privateJLabelpicture;privateJListlist;privateJSplitPanesplitPane;publicSplitPaneDemo(){ResourceBundleimageResource;try{//ReadimagenamesfromapropertiesfileimageResource=ResourceBundle.getBundle("imagenames");StringimageNamesString=imageResource.getString("images");imageNames=parseList(imageNamesString);}catch(MissingResourceExceptione){System.exit(1);}9.2容器組件——JSplitPaneDemo.javalist=newJList(imageNames);list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);list.setSelectedIndex(0);list.addListSelectionListener(this);
JScrollPanelistScrollPane=newJScrollPane(list);ImageIconfirstImage=newImageIcon("./build/classes/"+(String)imageNames.firstElement());picture=newJLabel(firstImage);picture.setPreferredSize(newDimension(firstImage.getIconWidth(),firstImage.getIconHeight()));JScrollPanepictureScrollPane=newJScrollPane(picture);
splitPane=newJSplitPane(JSplitPane.HORIZONTAL_SPLIT,listScrollPane,pictureScrollPane);splitPane.setOneTouchExpandable(true);splitPane.setDividerLocation(150);DimensionminimumSize=newDimension(100,50);listScrollPane.setMinimumSize(minimumSize);pictureScrollPane.setMinimumSize(minimumSize);splitPane.setPreferredSize(newDimension(400,200));}9.2容器組件——JSplitPaneDemo.javapublicvoidvalueChanged(ListSelectionEvente){if(e.getValueIsAdjusting())return;JListtheList=(JList)e.getSource();if(theList.isSelectionEmpty()){picture.setIcon(null);}else{intindex=theList.getSelectedIndex();ImageIconnewImage=newImageIcon("./build/classes/"+(String)imageNames.elementAt(index));picture.setIcon(newImage);picture.setPreferredSize(newDimension(newImage.getIconWidth(),newImage.getIconHeight()));picture.revalidate();}}9.2容器組件——JSplitPaneDemo.javaprotectedstaticVectorparseList(StringtheStringList){Vectorv=newVector(10);StringTokenizertokenizer=newStringTokenizer(theStringList,"");while(tokenizer.hasMoreTokens()){Stringimage=tokenizer.nextToken();v.addElement(image);}returnv;}publicstaticvoidmain(Strings[]){JFrameframe=newJFrame("SplitPaneDemo");frame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});SplitPaneDemosplitPaneDemo=newSplitPaneDemo();frame.getContentPane().add(splitPaneDemo.getSplitPane());frame.pack();frame.setVisible(true);}}9.2容器組件——JSplitPaneDemo.javaJSplitPaneDemo運行結(jié)果程序說明將一個JList組件放在一個JScrollPane容器中將一個繪有圖片的JLabel放在另一個JScrollPane容器中將兩個JScrollPane容器放到一個JSplitPane容器中該類實現(xiàn)了ListSelectionListener接口,對列表選擇事件可以做出反應(yīng),使JLable顯示出不同的圖片9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JTabbedPaneJTabbedPane如果一個窗口的功能有幾項,可以給每項設(shè)置一個標(biāo)簽,每個標(biāo)簽下面包含為完成此功能專用的若干組件。用戶要使用哪項功能,只要單擊相應(yīng)的標(biāo)簽,就可以進(jìn)入相應(yīng)的頁面。這種選項卡功能的實現(xiàn)就需要使用JTabbedPane這個中間層容器。9.2容器組件——JTabbedPaneTabbedPaneDemo.javaimportjavax.swing.JTabbedPane;importjavax.swing.ImageIcon;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JFrame;importjava.awt.*;importjava.awt.event.*;publicclassTabbedPaneDemoextendsJPanel{publicTabbedPaneDemo(){ImageIconicon=newImageIcon("images/middle.gif");JTabbedPanetabbedPane=newJTabbedPane();
Componentpanel1=makeTextPanel("Blah");tabbedPane.addTab("One",icon,panel1,"Doesnothing");tabbedPane.setSelectedIndex(0);Componentpanel2=makeTextPanel("Blahblah");tabbedPane.addTab("Two",icon,panel2,"Doestwiceasmuchnothing");9.2容器組件——JTabbedPane
Componentpanel3=makeTextPanel("Blahblahblah");tabbedPane.addTab("Three",icon,panel3,"Stilldoesnothing");
Componentpanel4=makeTextPanel("Blahblahblahblah");tabbedPane.addTab("Four",icon,panel4,"Doesnothingatall");//Addthetabbedpanetothispanel.setLayout(newGridLayout(1,1));add(tabbedPane);}protectedComponentmakeTextPanel(Stringtext){JPanelpanel=newJPanel(false);JLabelfiller=newJLabel(text);filler.setHorizontalAlignment(JLabel.CENTER);panel.setLayout(newGridLayout(1,1));panel.add(filler);returnpanel;}9.2容器組件——JTabbedPanepublicstaticvoidmain(String[]args){JFrameframe=newJFrame("TabbedPaneDemo");frame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});frame.getContentPane().add(newTabbedPaneDemo(),BorderLayout.CENTER);frame.setSize(400,125);frame.setVisible(true);}}9.2容器組件——JTabbedPaneTabbedPaneDemo.java運行結(jié)果說明在構(gòu)造函數(shù)中創(chuàng)建四個JPanel類型的對象并將其依次添加到一個JTabbedPane類的對象容器中最后再將該JTabbedPane類的對象容器放在一個JFrame對象的內(nèi)容面板中9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JToolBarJToolBar一般在設(shè)計界面時,會將所有功能分類放置在菜單中(JMenu),但當(dāng)功能相當(dāng)多時,可能會使成用戶為一個簡單的操作反復(fù)地尋找菜單中相關(guān)的功能可以把一些常用的功能以工具欄的方式呈現(xiàn)在菜單下,這就是JToolBar容器類的好處可以將JToolBar設(shè)計為水平或垂直方向的,也可以以鼠標(biāo)拉動的方式來改變9.2容器組件——JToolBarJToolBar常用API名稱說明JToolBar()JToolBar(intorientation)JToolBar(Stringname)JToolBar(Stringname,intorientation)創(chuàng)建一個工具欄,可以指定其朝向orientation,為SwingConstants中的HORIZONTAL或VERTICLE,也可以指定游離工具欄顯示的名稱name。voidadd(Component)為工具欄添加一個組件voidaddSeparator()在末尾增加一個分隔線voidsetFloatabled(Booleanfloatabled)BooleanisFloatable()設(shè)置或讀取工具欄是否可以游離,成為一個獨立的窗口9.2容器組件——ToolBarDemo.javaimportjavax.swing.JToolBar;importjavax.swing.JButton;importjavax.swing.ImageIcon;importjavax.swing.JFrame;importjavax.swing.JTextArea;importjavax.swing.JScrollPane;importjavax.swing.JPanel;importjava.awt.*;importjava.awt.event.*;publicclassToolBarDemoextendsJFrame{protectedJTextAreatextArea;protectedStringnewline="\n";publicToolBarDemo(){//Doframestuff.super("ToolBarDemo");addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});9.2容器組件——ToolBarDemo.java
JToolBartoolBar=newJToolBar();//Createthetoolbar.addButtons(toolBar);//Createthetextareausedforoutput.textArea=newJTextArea(5,30);JScrollPanescrollPane=newJScrollPane(textArea);//Layoutthecontentpane.JPanelcontentPane=newJPanel();contentPane.setLayout(newBorderLayout());contentPane.setPreferredSize(newDimension(400,100));contentPane.add(toolBar,BorderLayout.NORTH);contentPane.add(scrollPane,BorderLayout.CENTER);setContentPane(contentPane);}9.2容器組件——ToolBarDemo.javaprotectedvoidaddButtons(JToolBartoolBar){JButtonbutton=null;//firstbuttonbutton=newJButton(newImageIcon("./build/classes/left.gif"));button.setToolTipText("Thisistheleftbutton");button.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){displayResult("Actionforfirstbutton");}});toolBar.add(button);//secondbuttonbutton=newJButton(newImageIcon("./build/classes/middle.gif"));button.setToolTipText("Thisisthemiddlebutton");button.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){displayResult("Actionforsecondbutton");}});toolBar.add(button);9.2容器組件——ToolBarDemo.java
//thirdbuttonbutton=newJButton(newImageIcon("./build/classes/right.gif"));button.setToolTipText("Thisistherightbutton");button.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){displayResult("Actionforthirdbutton");}});toolBar.add(button);}protectedvoiddisplayResult(StringactionDescription){textArea.append(actionDescription+newline);}publicstaticvoidmain(String[]args){ToolBarDemoframe=newToolBarDemo();frame.pack();frame.setVisible(true);}}9.2容器組件——ToolBarDemo.javaToolBarDemo運行結(jié)果說明創(chuàng)建了三個按鈕,并為每個按鈕添加了事件監(jiān)聽器將三個按鈕放在一個JToolBar容器中將JToolBar容器放在頂層容器的內(nèi)容面板中將一個包含JtextArea組件的JScrollPane容器也放在頂層容器的內(nèi)容面板中9.2容器組件——JInternalFramJInternalFrame如果要實現(xiàn)在一個主窗口中打開很多個文檔,每個文檔各自占用一個新的窗口,就需要使用JInternalFrame容器類JInternalFrame的使用跟JFrame幾乎一樣,可以最大化、最小化、關(guān)閉窗口、加入菜單唯一不同的是JInternalFrame是輕量級組件,因此它只能是中間容器,必須依附于頂層容器上通常我們會將internalframe加入JDesktopPane類的對象來方便管理,JDesktopPane繼承自JLayeredPane,用來建立虛擬桌面。它可以顯示并管理眾多internalframe之間的層次關(guān)系9.2容器組件——JInternalFram基于Swing的JavaGUI設(shè)計思路基本的java程序的GUI設(shè)計工具。主要包括下述幾個概念:組件—Component容器—Container布局管理器—LayoutManager事件處理在Java中,開發(fā)一個GUI程序,通常需要以下幾步:構(gòu)建一個頂層容器;通常是JFrame或JApplet構(gòu)建若干個組件,組件可以是其它容器;設(shè)定容器的布局管理器;用容器的add方法將這些組件加入到這個容器中;設(shè)置組件事件;并將組件事件與代碼關(guān)聯(lián)。第九章Swing圖形用戶界面9.1概述9.2容器組件9.3基本組件9.4布局管理器9.5事件處理模型9.6本章小結(jié)容器與組件組件和容器容器層次結(jié)構(gòu)是一個以頂層容器為根的樹狀組件集合為了顯示在屏幕上,每個組件必須是一套容器層次結(jié)構(gòu)的一部分每個組件只能放置在某個容器內(nèi)一次如果某個組件已經(jīng)在一個容器中,又將它加到另外一個容器中,這個組件就會從第一個容器中清除9.3基本組件Swing基本組件有很多種,與頂層容器和中間容器相比,基本組件用法都比較簡單可將其分為三類顯示不可編輯信息JLabel、JProgressBar、JToolTip有控制功能、可以用來輸入信息JButton、JCheckBox、JRadioButton、JComboBox、JList、JMenu、JSlider、JSpinner、JTextComponent能提供格式化的信息并允許用戶選擇JColorChooser、JFileChooser、JTable、JTree9.3基本組件——JLabel標(biāo)簽(JLabel)為GUI提供文本(主要)或圖像(也可以)信息對應(yīng)類(JLabel)(JComponent的子類)可以顯示:單行的只讀的文本信息圖像同時顯示文本與圖像信息程序一般不修改標(biāo)簽的內(nèi)容9.3基本組件——JLabelJLabel的構(gòu)造方法JLabel():該方法用來創(chuàng)建一個沒有顯示內(nèi)容的對象。JLabel(Stringlabel):該方法用來創(chuàng)建一個顯示內(nèi)容為label的對象。JLabel(Stringlabel,intalignment):
該方法除了用來創(chuàng)建一個顯示內(nèi)容為label的對象外,還設(shè)置了Label的對齊方式。Label的對齊方式:分別用JLabel類的三個常量LEFT、CENTER和RIGHT來表示左對齊、居中對齊和右對齊。JLabel(Iconico):建立一個JLabel對象,其初始圖標(biāo)為ico,沒有標(biāo)題。JLabel(Stringtxt,Iconico,inthalign):功能,建立一個JLabel對象,其初始標(biāo)題為txt,初始圖標(biāo)為ico,水平對齊方式為halign。9.3基本組件——JLabelJlabel的常用方法publicintgetAlignment():返回當(dāng)前的對齊方式。publicStringgetText():返回當(dāng)前顯示的字符串。publicvoidsetAlignment(intalignment):
設(shè)置對齊方式。publicvoidsetText(Stringlabel):
設(shè)置顯示的字符串。9.3基本組件——JLabelJlabel例子importjava.awt.Container;importjava.awt.FlowLayout;importjavax.swing.ImageIcon;importjavax.swing.JFrame;importjavax.swing.JLabel;publicclassJLabelDemoextendsJFrame{publicJLabelDemo(){super("框架和標(biāo)簽例程");String[]s={"文本標(biāo)簽","文字在圖標(biāo)的左側(cè)","文字在圖標(biāo)的下方"};ImageIcon[]ic={null,newImageIcon("img1.gif"),newImageIcon("img2.gif")};int[]ih={0,JLabel.LEFT,JLabel.CENTER};int[]iv={0,JLabel.CENTER,JLabel.BOTTOM};Containerc=getContentPane();c.setLayout(newFlowLayout(FlowLayout.LEFT));9.3基本組件——JLabelfor(inti=0;i<3;i++){JLabelaLabel=newJLabel(s[i],ic[i],JLabel.LEFT);if(i>0){aLabel.setHorizontalTextPosition(ih[i]);aLabel.setVerticalTextPosition(iv[i]);}aLabel.setToolTipText("第"+(i+1)+"個標(biāo)簽");c.add(aLabel);}}publicstaticvoidmain(Stringargs[]){JLabelDemoapp=newJLabelDemo();app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(360,150);app.setVisible(true);}}9.3基本組件——JProgressBarJProgressBar在一些軟件運行時,會出現(xiàn)一個進(jìn)度條告知目前進(jìn)度如何。
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)軟件管理系統(tǒng)采購協(xié)議樣本一
- 2025年度拆墻工程安全施工與質(zhì)量驗收合同4篇
- 二零二五版智能法律咨詢APP下載服務(wù)條款3篇
- 二零二五年度消防培訓(xùn)與應(yīng)急演練服務(wù)合同3篇 - 副本
- 人教版九年級化學(xué)上冊第3章物質(zhì)構(gòu)成的奧秘《第2節(jié) 組成物質(zhì)的化學(xué)元素》第一課時公開課教學(xué)課件
- 2025年度拆除廣告牌與城市公共安全施工合同范本4篇
- 二零二五年度建筑鋼材材料代購與配送服務(wù)合同3篇
- 2025年度建筑拆除與環(huán)保處理一體化施工合同4篇
- 2025年度工業(yè)用地場地代租賃合同參考范本4篇
- 2024院同樂分院中草藥保健品生產(chǎn)加工合同3篇
- 新員工入職培訓(xùn)測試題附有答案
- 勞動合同續(xù)簽意見單
- 大學(xué)生國家安全教育意義
- 2024年保育員(初級)培訓(xùn)計劃和教學(xué)大綱-(目錄版)
- 河北省石家莊市2023-2024學(xué)年高二上學(xué)期期末考試 語文 Word版含答案
- 企業(yè)正確認(rèn)識和運用矩陣式管理
- 分布式光伏高處作業(yè)專項施工方案
- 陳閱增普通生物學(xué)全部課件
- 檢驗科主任就職演講稿范文
- 人防工程主體監(jiān)理質(zhì)量評估報告
- 20225GRedCap通信技術(shù)白皮書
評論
0/150
提交評論