版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第九章Swing圖形用戶界面9.1概述9.2容器組件9.3基本組件9.4布局管理器9.5事件處理模型9.6本章小結(jié)9.1概述圖形用戶界面(GUI)CommandLineGraphicsUserInterface數(shù)據(jù)的圖形顯示形式友好的交互方式簡(jiǎn)化計(jì)算機(jī)軟件的學(xué)習(xí)過(guò)程GUI示例jdk1.7\demo\jfc\SwingSet2GUI組件:Labels,Textfields,Buttons等等9.1概述在Java語(yǔ)言中,有兩個(gè)包(java.awt和javax.swing)囊括了實(shí)現(xiàn)圖形用戶界面的所有基本元素,這些基本元素主要包括容器、組件、繪圖工具和布局管理器等。java.awt是java1.1用來(lái)建立GUI的圖形包,awt是抽象窗口工具包(AbstractWindowToolkit)的縮寫(xiě),其中的組件常被稱(chēng)為AWT組件。javax.swing是Java2提出的AWT的改進(jìn)包,主要改善了組件的顯示外觀,增強(qiáng)了組件的控制能力。9.1概述早期版本的AWT組件在java.awt包里,包括Button、Checkbox、Scrollbar等,都是Component類(lèi)的子類(lèi)大部分含有nativecode,所以隨操作系統(tǒng)平臺(tái)的不同會(huì)顯示出不同的樣子,而不能進(jìn)行更改,是重量級(jí)組件(heavyweightcomponents)沒(méi)有彈性、缺乏效率59.1概述AWT與Swingjava.awt包中的類(lèi)及相互關(guān)系可以用下圖來(lái)描述:事件類(lèi)字體類(lèi)GraphicsComponent顏色類(lèi)布局管理類(lèi)java.lang.ObjectCheckboxContainerButton…WindowPanelAppletDialogFrameList圖像類(lèi)菜單類(lèi)Scrollpane9.1概述較新的Swing組件其名稱(chēng)都是在原來(lái)AWT組件名稱(chēng)前加上J,例如JButton、JCheckBox、JScrollbar等,都是JComponent類(lèi)的子類(lèi)Java1.2推出,架構(gòu)在AWT之上,是AWT的擴(kuò)展而不是取代,AWT仍然是Swing的一個(gè)必備補(bǔ)充。完全是由java語(yǔ)言編寫(xiě)的,其外觀和功能不依賴(lài)于任何由宿主平臺(tái)的窗口系統(tǒng)所提供的代碼,是輕量級(jí)組件(lightweightcomponents)可提供更豐富的視覺(jué)感受,被越來(lái)越多地使用9.1概述Swing組件在javax.swing包中,源于AWT(packagejava.awt)的組件定義了兩種類(lèi)型的組件:頂層容器(JFrame,JApplet,JDialog和JWindow)輕量級(jí)組件(JComponent)Swing組件都是AWT的Container類(lèi)的直接子類(lèi)和間接子類(lèi)。Swing組件以"J"開(kāi)頭,除了有與AWT類(lèi)似的按鈕(JButton)、標(biāo)簽(JLabel)、復(fù)選框(JCheckBox)、菜單(JMenu)等基本組件外,還增加了一個(gè)豐富的高層組件集合,如表格(JTable)、樹(shù)(JTree)。9.1概述AWT與Swing頂層窗口類(lèi)之間的關(guān)系9.1概述Swing組件9.1概述Swing的組件和容器層次JComponent類(lèi)是除了頂層容器以外所有Swing組件的基類(lèi),根據(jù)繼承關(guān)系,我們可以在每個(gè)基類(lèi)中找到大多數(shù)GUI組件的常見(jiàn)操作Component類(lèi)包含paint、repaint方法,可以在屏幕上繪制組件大多數(shù)GUI組件直接或間接擴(kuò)展ComponentContainer類(lèi)容納相關(guān)組件包括add方法,用來(lái)添加組件包括setLayout方法,這個(gè)方法可用來(lái)設(shè)置布局,以幫助Container對(duì)象對(duì)其中的組件進(jìn)行定位和設(shè)置組件大小JComponent類(lèi)——多數(shù)Swing組件的超類(lèi)可抽換的外觀和感覺(jué),即可根據(jù)需求定制外觀和感覺(jué)??旖萱I(通過(guò)鍵盤(pán)直接訪問(wèn)GUI組件)一般的事件處理功能9.1概述--Swing的組件和容器層次通常將javax.swing包里的Swing組件歸為三個(gè)層次頂層容器中間層容器基本組件容器層次結(jié)構(gòu)是一個(gè)以頂層容器為根的樹(shù)狀組件集合為了顯示在屏幕上,每個(gè)組件必須是一套容器層次結(jié)構(gòu)的一部分每個(gè)組件只能放置在某個(gè)容器內(nèi)一次如果某個(gè)組件已經(jīng)在一個(gè)容器中,又將它加到另外一個(gè)容器中,這個(gè)組件就會(huì)從第一個(gè)容器中清除容器本身也是一種組件9.1概述--Swing的組件和容器層次頂層容器Swing提供三個(gè)頂層容器的類(lèi)JFrame實(shí)現(xiàn)單個(gè)主窗口JDialog
實(shí)現(xiàn)一個(gè)二級(jí)窗口(對(duì)話框)JApplet在瀏覽器窗口中實(shí)現(xiàn)一個(gè)applet顯示區(qū)域必須和操作系統(tǒng)打交道,所以都是重量級(jí)組件從繼承結(jié)構(gòu)上來(lái)看,它們分別是從原來(lái)AWT組件的Frame、Dialog和Applet類(lèi)繼承而來(lái)。每個(gè)使用Swing組件的Java程序都必須至少有一個(gè)頂層容器,別的組件都必須放在這個(gè)頂層容器上才能顯現(xiàn)出來(lái)。9.1概述--Swing的組件和容器層次中間層容器其存在的目的僅僅是為了容納別的組件,使界面有條理,美觀,易于控制。分為兩類(lèi)一般用途的JPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar特殊用途的JInternalFrameJRootPane可以直接從頂層容器中獲得一個(gè)JRootPane對(duì)象來(lái)直接使用,而別的中間容器使用的時(shí)候需要新建一個(gè)對(duì)象。9.1概述--Swing的組件和容器層次基本組件通常是在圖形用戶界面中和用戶進(jìn)行交互的組件基本功能是和用戶交互信息,而不像前兩種組件那樣是用來(lái)容納別的組件的根據(jù)功能的不同,可被分為三類(lèi)顯示不可編輯信息的JLabel、JProgressBar、JToolTip有控制功能、可以用來(lái)輸入信息的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();//對(duì)組件進(jìn)行排列
frame.show();//顯示
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}9.1概述--Swing的組件和容器層次運(yùn)行結(jié)果程序說(shuō)明首先創(chuàng)建一個(gè)JFrame類(lèi)頂級(jí)容器frame然后獲得頂級(jí)容器的內(nèi)容面板contentPane,只有通過(guò)它才能加入其他組件。然后創(chuàng)建一個(gè)JPanel類(lèi)的中間容器panel,并設(shè)置邊框以及布局然后創(chuàng)建基本控制組件Label,button,并將它們添加到中間容器上然后將中間容器通過(guò)內(nèi)容面板添加到頂層容器上,并對(duì)組件進(jìn)行排列基于Swing的JavaGUI設(shè)計(jì)思路基本的java程序的GUI設(shè)計(jì)工具。主要包括下述幾個(gè)概念:組件—Component容器—Container布局管理器—LayoutManager事件處理在Java中,開(kāi)發(fā)一個(gè)GUI程序,通常需要以下幾步:構(gòu)建一個(gè)頂層容器;通常是JFrame或JApplet構(gòu)建若干個(gè)組件,組件可以是其它容器;設(shè)定容器的布局管理器;用容器的add方法將這些組件加入到這個(gè)容器中;設(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個(gè)頂層容器類(lèi):JFrame、JApplet、JDialog都是重量級(jí)組件,分別繼承了AWT組件Frame、Applet和Dialog每個(gè)頂層容器都有一個(gè)內(nèi)容面板,通常直接或間接的容納別的可視組件可以有選擇地為頂層容器添加菜單,菜單被放置在頂層容器上9.2容器組件——JFrame框體(JFrame)JFrame是一種具有邊框的容器,它是JavaApplication程序的圖形用戶界面的最外層容器。特點(diǎn):(1)有邊框(2)能被移動(dòng)、縮放和關(guān)閉(3)作為最外層容器,不能被其它容器所包含(4)默認(rèn)布局:邊界布局(BorderLayout)9.2容器組件——JFrame類(lèi)JFrame
是java.awt.Frame的子類(lèi)在Swing的組件中,JFrame
并不全是由Java編寫(xiě)的是一種與平臺(tái)關(guān)系比較密切的組件(Heavyweightcomponent)java.lang.Object
|+--java.awt.Component
|+--java.awt.Container
|+--java.awt.Window|+--java.awt.Frame
|+--javax.swing.Jframe每個(gè)包含Swing組件的主窗口都應(yīng)用JFrame來(lái)實(shí)現(xiàn)9.2容器組件——JFrame構(gòu)造函數(shù)JFrame();建立一個(gè)無(wú)標(biāo)題的FrameJFrame(Stringtitle);建立一個(gè)標(biāo)題為title的Frame。常用方法StringgetTitle();獲取窗口標(biāo)題voidsetTitle(Strings);設(shè)置窗口標(biāo)題voidsetVisible(booleanb);設(shè)置窗口可見(jiàn)性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常用方法通過(guò)setDefaultCloseOperation(intoperation)方法設(shè)置關(guān)閉行為。其中operation的取值可以是以下幾種:DO_NOTHING_ON_CLOSE:當(dāng)窗口關(guān)閉時(shí),不做任何處理;HIDE_ON_CLOSE:當(dāng)窗口關(guān)閉時(shí),隱藏這個(gè)窗口;DISPOSE_ON_CLOSE:當(dāng)窗口關(guān)閉時(shí),隱藏并處理這個(gè)窗口;EXIT_ON_CLOSE:當(dāng)窗口關(guān)閉時(shí),退出程序。默認(rèn)是HIDE_ON_CLOSE。9.2容器組件——JFrame創(chuàng)建窗體有兩種方式:直接創(chuàng)建JFrame的對(duì)象,適合于簡(jiǎn)單框體;繼承JFrame類(lèi),在繼承類(lèi)中編寫(xiě)代碼對(duì)框體進(jìn)行詳細(xì)的刻畫(huà),適合框體比較復(fù)雜的情況。大多數(shù)情況下開(kāi)發(fā)人員都用第二種方法。注意:框體創(chuàng)建以后是不可見(jiàn)的,必須調(diào)用Window類(lèi)的show()方法或Component類(lèi)的setVisible()方法顯示該框體見(jiàn)以下兩個(gè)例子:9.2容器組件——JFrame直接創(chuàng)建JFrame的對(duì)象importjavax.swing.*;publicclassSample10_2{ publicstaticvoidmain(String[]args){ //創(chuàng)建一個(gè)框體對(duì)象
JFramemyWindow=newJFrame(); //向框體中添加一個(gè)標(biāo)簽
myWindow.add(newJLabel(“這是一個(gè)框體,演示了JFrame類(lèi)的基本功能")); //設(shè)置框體的標(biāo)題
myWindow.setTitle(“自定義的框體"); //設(shè)置框體的大小
myWindow.setBounds(80,80,480,180); //根據(jù)接收的boolean設(shè)置框體是否可以調(diào)整大小
myWindow.setResizable(false); //設(shè)置框體的可見(jiàn)性
myWindow.setVisible(true); }}9.2容器組件——JFrame繼承JFrame類(lèi)importjavax.swing.*;classMyWindowextendsJFrame{ //定義無(wú)參構(gòu)造函數(shù)
publicMyWindow(){} publicMyWindow(booleanb){ //向框體中添加一個(gè)標(biāo)簽
this.add(newJLabel(“這是一個(gè)框體,演示了JFrame類(lèi)的基本功能")); //設(shè)置框體的標(biāo)題
this.setTitle(“自定義的框體"); //設(shè)置框體的大小
this.setBounds(80,80,480,180); //根據(jù)接收的boolean設(shè)置框體是否可以調(diào)整大小
this.setResizable(b); //設(shè)置框體的可見(jiàn)性
this.setVisible(true); }}publicclassSample10_2{ publicstaticvoidmain(String[]args){ //創(chuàng)建MyWindow類(lèi)的對(duì)象,并傳遞False值使得框體不能調(diào)整大小
newMyWindow(false);
}}9.2容器組件——JFrame繼承JFrame類(lèi)importjavax.swing.*;publicclassMyWindowextendsJFrame{ //定義無(wú)參構(gòu)造函數(shù)
publicMyWindow(){} publicMyWindow(booleanb){ //向窗體中添加一個(gè)標(biāo)簽
this.add(newJLabel("這是一個(gè)窗體,演示了JFrame類(lèi)的基本功能")); //設(shè)置窗體的標(biāo)題
this.setTitle("自定義的窗體"); //設(shè)置窗體的大小
this.setBounds(80,80,480,180); //根據(jù)接收的boolean設(shè)置窗體是否可以調(diào)整大小
this.setResizable(b); //設(shè)置窗體的可見(jiàn)性
this.setVisible(true); } publicstaticvoidmain(String[]args){
newMyWindow(false);
}}9.2容器組件——JFrame在JFrame中加入組件的方法用getContentPane()方法獲得JFrame的內(nèi)容面板,再對(duì)其加入組件:
Containerc=frame.getContentPane()c.add(childComponent)建立一個(gè)JPanel或JDesktopPane之類(lèi)的中間容器,把組件添加到容器中,用setContentPane()方法把該容器置為JFrame的內(nèi)容面板:
JPanelcontentPane=newJPanel();
……//把其它組件添加到Jpanel中;
frame.setContentPane(contentPane);
//把contentPane對(duì)象設(shè)置成為frame的內(nèi)容面板9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JDialog對(duì)話框(JDialog)對(duì)話框(JDialog)與JFrame一樣,都是有邊框和標(biāo)題的獨(dú)立使用的容器,不能被其它容器所包容。與JFrame的不同之處:不能作為程序的最外層容器,它必須屬于某個(gè)JFrame,由該JFrame彈出。對(duì)話框可以接受用戶的輸入,實(shí)現(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要實(shí)現(xiàn)對(duì)話框,需要從JDialog派生一個(gè)類(lèi)9.2容器組件——JDialog構(gòu)造函數(shù)JDialog(Frameowner)功能:建立無(wú)標(biāo)題的通用對(duì)話框,它屬于窗口owner,可以響應(yīng)其它窗口。JDialog(Frameowner,booleand)功能:建立無(wú)標(biāo)題的通用對(duì)話框,它屬于窗口owner,若d為true則不能響應(yīng)其它窗口。JDialog(Frameowner,Stringtxt)功能:建立標(biāo)題為txt的通用對(duì)話框,它屬于窗口owner,可以響應(yīng)其它窗口。JDialog(Frameowner,Stringtxt,booleand)功能:建立標(biāo)題為txt的通用對(duì)話框,它屬于窗口owner,若d為true則不能響應(yīng)其它窗口。9.2容器組件——JDialog常用方法
表列出了通用對(duì)話框JDialog類(lèi)的幾個(gè)常用的方法。方法說(shuō)明ContainergetContentPane()返回該通用對(duì)話框的contentPanelvoidsetLayout(LayoutManager
manager)設(shè)置布局管理器Componentadd(Component
comp)在對(duì)話框中添加組件voidsetBackground(Colorc)設(shè)置對(duì)話框的背景色voidsetLocation(intx,inty)設(shè)置對(duì)話框的顯示位置voidsetSize(intwidth,intheight)設(shè)置對(duì)話框的大小voidsetVisible(booleanb)設(shè)置對(duì)話框是否可見(jiàn)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每個(gè)包含Swing組件的Applet都應(yīng)作為JApplet的子類(lèi)來(lái)實(shí)現(xiàn)JApplet類(lèi)的頂層容器由瀏覽器提供,通常不需要自己產(chǎn)生一個(gè)JApplet類(lèi)的對(duì)象。JFrame和JDialog通過(guò)構(gòu)造方法進(jìn)行創(chuàng)建。9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JPanel面板JPanelSwing的JPanel,它替代了AWT的畫(huà)布(Canvas)和面板(Panel),兼有二者的功能。是一種經(jīng)常使用的輕量級(jí)中間容器在默認(rèn)狀態(tài)下,除了背景色外它并不繪制任何東西很容易地設(shè)置邊框和繪制特性,可以把它設(shè)置為頂層容器contentPane。有效地利用JPanel可以使版面管理更為容易JPanel不能象JFrame那樣能夠在桌面上浮動(dòng)。9.2容器組件——JPanel可以通過(guò)setLayout方法來(lái)改變其布局也可以在創(chuàng)建一個(gè)JPanel對(duì)象時(shí)就為它確定某種布局方式。在默認(rèn)狀態(tài)下panel使用FlowLayout布局,將各組件布局在一行對(duì)于復(fù)雜GUI,可以添加各種組件(包括面板組件)面板(JPanel)的大小由它所包含的組件決定當(dāng)組件個(gè)數(shù)增加,面板(JPanel)也會(huì)隨之而增大9.2容器組件——JPanel常用方法名稱(chēng)說(shuō)明JPanel()創(chuàng)建一個(gè)JPanel,默認(rèn)布局是FlowLayoutJPanel(LayoutManagerlayout)創(chuàng)建一個(gè)指定布局的JPanelvoidadd(Componentcomp)添加組件voidadd(Componentcomp,intindex)把組件添加到特定位置上intgetComponentCount()獲得這個(gè)panel里所有組件的數(shù)量ComponentgetComponent(intindex)獲得指定序號(hào)的某個(gè)組件ComponentgetComponentAt(intx,inty)獲得指定位置的某個(gè)組件voidremove(Component)移除某個(gè)組件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)窗口面板)當(dāng)容器內(nèi)要容納的內(nèi)容大于容器大小的時(shí)候,我們希望容器能夠有一個(gè)滾動(dòng)條,通過(guò)拖動(dòng)滑塊,就可以看到更多的內(nèi)容。JScrollPane就是能夠?qū)崿F(xiàn)這種功能的特殊容器由九個(gè)部分組成,包括一個(gè)中心顯示地帶、四個(gè)角和四條邊。JScrollPane主要是通過(guò)移動(dòng)JViewport(視角)來(lái)實(shí)現(xiàn)的。JViewport是一種特殊的對(duì)象,用于查看基層組件,滾動(dòng)條實(shí)際就是沿著組件移動(dòng)視口,同時(shí)描繪出它在下面"看到"的內(nèi)容。9.2容器組件——JScrollPaneJScrollPane常用API名稱(chēng)說(shuō)明staticintHORIZONTAL_SCROLLBAR_ALWAYS水平滾動(dòng)條策略常數(shù):總是顯示staticintHORIZONTAL_SCROLLBAR_AS_NEEDED水平滾動(dòng)條策略常數(shù):當(dāng)顯示內(nèi)容水平區(qū)域大于顯示區(qū)域時(shí)才出現(xiàn)staticintHORIZONTAL_SCROLLBAR_NEVER水平滾動(dòng)條策略常數(shù):總是不顯示staticintVERTICAL_SCROLLBAR_ALWAYS垂直滾動(dòng)條策略常數(shù):總是顯示staticintVERTICAL_SCROLLBAR_AS_NEEDED垂直滾動(dòng)條策略常數(shù):當(dāng)顯示內(nèi)容垂直區(qū)域大于顯示區(qū)域時(shí)才出現(xiàn)staticintVERTICAL_SCROLLBAR_NEVER垂直滾動(dòng)條策略常數(shù):總是不顯示JScrollPane()建立一個(gè)空的JScrollPane對(duì)象JScrollPane(Componentview)建立一個(gè)顯示組件的JScrollPane對(duì)象,當(dāng)組件內(nèi)容大于顯示區(qū)域時(shí),自動(dòng)產(chǎn)生滾動(dòng)條9.2容器組件——JScrollPaneJScrollPane常用API名稱(chēng)說(shuō)明voidsetViewportView(Component)設(shè)置JscroollPane要中心地帶要顯示的組件voidsetVerticalScrollBarPolicy(int)intgetVerticalScrollBarPolicy()設(shè)置或者讀取垂直滾動(dòng)條策略常數(shù)voidsetHorizontalScrollBarPolicy(int)intgetHorizontalScrollBarPolicy()設(shè)置或者讀取水平滾動(dòng)條策略常數(shù)voidsetViewportBorder(Border)BordergetViewportBorder()設(shè)置或者讀取中心顯示地帶的邊框voidsetWheelScrollingEnabled(Boolean)BooleanisWheelScrollingEnabled()設(shè)置或者讀取是否隨著鼠標(biāo)滾輪滾動(dòng)出現(xiàn)或隱藏滾動(dòng)條,默認(rèn)狀態(tài)下為真voidsetColumnHeaderView(Component)voidsetRowHeaderView(Component)設(shè)置顯示在上面的邊上的組件設(shè)置顯示在左面的邊上的組件voidsetCorner(Stringkey,Componentcorner)設(shè)置要顯示在指定角上的組件ComponentgetCorner(Stringkey)獲得指定角上的組件9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JSplitPaneJSplitPane可以把兩個(gè)組件顯示在兩個(gè)顯示區(qū)域內(nèi),且隨著區(qū)域間分隔線的拖動(dòng),區(qū)域內(nèi)組件的大小也隨之發(fā)生變動(dòng)它允許設(shè)置水平分割或者垂直分割;也允許設(shè)置動(dòng)態(tài)拖曳功能(拖動(dòng)分界線時(shí)兩邊組件是否會(huì)隨著拖曳動(dòng)態(tài)改變大小還是在拖曳結(jié)束后才改動(dòng))通常先把組件放到ScrollPane中,再把ScrollPane放到SplitPane中。這樣在每部分窗口中,都可以拖動(dòng)滾動(dòng)條看到組件的全部?jī)?nèi)容9.2容器組件——JSplitPaneJSplitPane常用API名稱(chēng)說(shuō)明staticintHORIZONTAL_SPLIT水平分割常數(shù)staticintVERTICAL_SPLIT垂直分割常數(shù)JSplitPane()創(chuàng)建一個(gè)JSplitPane,以水平方向排列,兩邊各是一個(gè)button,沒(méi)有動(dòng)態(tài)拖曳功能JSplitPane(intnewOrientation)建立一個(gè)指定分割方向的JSplitPane,沒(méi)有動(dòng)態(tài)拖曳功能,參數(shù)為兩個(gè)分割常數(shù)之一JSplitPane(intnewOrientation,BooleannewContinuousLayout)指定分割方向,并可指定是否有動(dòng)態(tài)拖曳功能JSplitPane(intnewOrientation,BooleannewContinuousLayout,ComponentnewLeftComponent,ComponentnewRightComponent)指定分割方向、是否具有動(dòng)態(tài)拖曳功能,和兩側(cè)組件9.2容器組件——JSplitPaneJSplitPane常用API名稱(chēng)說(shuō)明JSplitPane(intnewOrientation,ComponentnewLeftComponent,ComponentnewRightComponent)指定分割方向和兩側(cè)組件,無(wú)自動(dòng)拖曳功能voidsetOrientation(intnewOrientation)intgetOrientation()設(shè)置或獲得分割方向voidsetDividerSize(int)intgetDividerSize()設(shè)置或讀取分隔線條的粗細(xì)voidsetContinuousLayout(booleannCL)booleanisContinuousLayout()設(shè)置或讀取是否使用動(dòng)態(tài)拖曳功能voidsetOneTouchExpandable(BooleanoTE)booleanisOneTouchExpandable()設(shè)置或讀取是否在分隔線上顯示一個(gè)控鍵來(lái)完全擴(kuò)展和完全壓縮單側(cè)內(nèi)容。voidremove(Componentcomp)voidadd(Componentcomp)刪除或添加組件。只可以添加兩個(gè)組件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運(yùn)行結(jié)果程序說(shuō)明將一個(gè)JList組件放在一個(gè)JScrollPane容器中將一個(gè)繪有圖片的JLabel放在另一個(gè)JScrollPane容器中將兩個(gè)JScrollPane容器放到一個(gè)JSplitPane容器中該類(lèi)實(shí)現(xiàn)了ListSelectionListener接口,對(duì)列表選擇事件可以做出反應(yīng),使JLable顯示出不同的圖片9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JTabbedPaneJTabbedPane如果一個(gè)窗口的功能有幾項(xiàng),可以給每項(xiàng)設(shè)置一個(gè)標(biāo)簽,每個(gè)標(biāo)簽下面包含為完成此功能專(zhuān)用的若干組件。用戶要使用哪項(xiàng)功能,只要單擊相應(yīng)的標(biāo)簽,就可以進(jìn)入相應(yīng)的頁(yè)面。這種選項(xiàng)卡功能的實(shí)現(xiàn)就需要使用JTabbedPane這個(gè)中間層容器。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運(yùn)行結(jié)果說(shuō)明在構(gòu)造函數(shù)中創(chuàng)建四個(gè)JPanel類(lèi)型的對(duì)象并將其依次添加到一個(gè)JTabbedPane類(lèi)的對(duì)象容器中最后再將該JTabbedPane類(lèi)的對(duì)象容器放在一個(gè)JFrame對(duì)象的內(nèi)容面板中9.2容器組件JFrameJDialogJAppletJPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar9.2容器組件——JToolBarJToolBar一般在設(shè)計(jì)界面時(shí),會(huì)將所有功能分類(lèi)放置在菜單中(JMenu),但當(dāng)功能相當(dāng)多時(shí),可能會(huì)使成用戶為一個(gè)簡(jiǎn)單的操作反復(fù)地尋找菜單中相關(guān)的功能可以把一些常用的功能以工具欄的方式呈現(xiàn)在菜單下,這就是JToolBar容器類(lèi)的好處可以將JToolBar設(shè)計(jì)為水平或垂直方向的,也可以以鼠標(biāo)拉動(dòng)的方式來(lái)改變9.2容器組件——JToolBarJToolBar常用API名稱(chēng)說(shuō)明JToolBar()JToolBar(intorientation)JToolBar(Stringname)JToolBar(Stringname,intorientation)創(chuàng)建一個(gè)工具欄,可以指定其朝向orientation,為SwingConstants中的HORIZONTAL或VERTICLE,也可以指定游離工具欄顯示的名稱(chēng)name。voidadd(Component)為工具欄添加一個(gè)組件voidaddSeparator()在末尾增加一個(gè)分隔線voidsetFloatabled(Booleanfloatabled)BooleanisFloatable()設(shè)置或讀取工具欄是否可以游離,成為一個(gè)獨(dú)立的窗口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運(yùn)行結(jié)果說(shuō)明創(chuàng)建了三個(gè)按鈕,并為每個(gè)按鈕添加了事件監(jiān)聽(tīng)器將三個(gè)按鈕放在一個(gè)JToolBar容器中將JToolBar容器放在頂層容器的內(nèi)容面板中將一個(gè)包含JtextArea組件的JScrollPane容器也放在頂層容器的內(nèi)容面板中9.2容器組件——JInternalFramJInternalFrame如果要實(shí)現(xiàn)在一個(gè)主窗口中打開(kāi)很多個(gè)文檔,每個(gè)文檔各自占用一個(gè)新的窗口,就需要使用JInternalFrame容器類(lèi)JInternalFrame的使用跟JFrame幾乎一樣,可以最大化、最小化、關(guān)閉窗口、加入菜單唯一不同的是JInternalFrame是輕量級(jí)組件,因此它只能是中間容器,必須依附于頂層容器上通常我們會(huì)將internalframe加入JDesktopPane類(lèi)的對(duì)象來(lái)方便管理,JDesktopPane繼承自JLayeredPane,用來(lái)建立虛擬桌面。它可以顯示并管理眾多internalframe之間的層次關(guān)系9.2容器組件——JInternalFram基于Swing的JavaGUI設(shè)計(jì)思路基本的java程序的GUI設(shè)計(jì)工具。主要包括下述幾個(gè)概念:組件—Component容器—Container布局管理器—LayoutManager事件處理在Java中,開(kāi)發(fā)一個(gè)GUI程序,通常需要以下幾步:構(gòu)建一個(gè)頂層容器;通常是JFrame或JApplet構(gòu)建若干個(gè)組件,組件可以是其它容器;設(shè)定容器的布局管理器;用容器的add方法將這些組件加入到這個(gè)容器中;設(shè)置組件事件;并將組件事件與代碼關(guān)聯(lián)。第九章Swing圖形用戶界面9.1概述9.2容器組件9.3基本組件9.4布局管理器9.5事件處理模型9.6本章小結(jié)容器與組件組件和容器容器層次結(jié)構(gòu)是一個(gè)以頂層容器為根的樹(shù)狀組件集合為了顯示在屏幕上,每個(gè)組件必須是一套容器層次結(jié)構(gòu)的一部分每個(gè)組件只能放置在某個(gè)容器內(nèi)一次如果某個(gè)組件已經(jīng)在一個(gè)容器中,又將它加到另外一個(gè)容器中,這個(gè)組件就會(huì)從第一個(gè)容器中清除9.3基本組件Swing基本組件有很多種,與頂層容器和中間容器相比,基本組件用法都比較簡(jiǎn)單可將其分為三類(lèi)顯示不可編輯信息JLabel、JProgressBar、JToolTip有控制功能、可以用來(lái)輸入信息JButton、JCheckBox、JRadioButton、JComboBox、JList、JMenu、JSlider、JSpinner、JTextComponent能提供格式化的信息并允許用戶選擇JColorChooser、JFileChooser、JTable、JTree9.3基本組件——JLabel標(biāo)簽(JLabel)為GUI提供文本(主要)或圖像(也可以)信息對(duì)應(yīng)類(lèi)(JLabel)(JComponent的子類(lèi))可以顯示:單行的只讀的文本信息圖像同時(shí)顯示文本與圖像信息程序一般不修改標(biāo)簽的內(nèi)容9.3基本組件——JLabelJLabel的構(gòu)造方法JLabel():該方法用來(lái)創(chuàng)建一個(gè)沒(méi)有顯示內(nèi)容的對(duì)象。JLabel(Stringlabel):該方法用來(lái)創(chuàng)建一個(gè)顯示內(nèi)容為label的對(duì)象。JLabel(Stringlabel,intalignment):
該方法除了用來(lái)創(chuàng)建一個(gè)顯示內(nèi)容為label的對(duì)象外,還設(shè)置了Label的對(duì)齊方式。Label的對(duì)齊方式:分別用JLabel類(lèi)的三個(gè)常量LEFT、CENTER和RIGHT來(lái)表示左對(duì)齊、居中對(duì)齊和右對(duì)齊。JLabel(Iconico):建立一個(gè)JLabel對(duì)象,其初始圖標(biāo)為ico,沒(méi)有標(biāo)題。JLabel(Stringtxt,Iconico,inthalign):功能,建立一個(gè)JLabel對(duì)象,其初始標(biāo)題為txt,初始圖標(biāo)為ico,水平對(duì)齊方式為halign。9.3基本組件——JLabelJlabel的常用方法publicintgetAlignment():返回當(dāng)前的對(duì)齊方式。publicStringgetText():返回當(dāng)前顯示的字符串。publicvoidsetAlignment(intalignment):
設(shè)置對(duì)齊方式。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)+"個(gè)標(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在一些軟件運(yùn)行時(shí),會(huì)出現(xiàn)一個(gè)進(jìn)度條告知目前進(jìn)度如何。
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版人工智能技術(shù)研發(fā)與應(yīng)用合同15篇
- 常州2025版二手房過(guò)戶稅費(fèi)處理與過(guò)戶手續(xù)辦理合同2篇
- 二零二五版智慧城市建設(shè)合作合同范本2篇
- 二零二五版在線教育管理系統(tǒng)定制開(kāi)發(fā)合同3篇
- 二零二五版ISO9001質(zhì)量管理體系認(rèn)證與質(zhì)量管理體系審核與監(jiān)督合同3篇
- 水電工程2025年度施工安全評(píng)估合同2篇
- 二零二五版LED顯示屏戶外廣告位租賃合同協(xié)議3篇
- 二零二五年海鮮餐飲業(yè)特色菜品開(kāi)發(fā)與銷(xiāo)售合同3篇
- 二零二五年度虛擬現(xiàn)實(shí)游戲開(kāi)發(fā)電子合同承諾3篇
- 二零二五版智能零售企業(yè)兼職銷(xiāo)售員勞動(dòng)合同3篇
- DLT 5285-2018 輸變電工程架空導(dǎo)線(800mm以下)及地線液壓壓接工藝規(guī)程
- 新員工入職培訓(xùn)測(cè)試題附有答案
- 勞動(dòng)合同續(xù)簽意見(jiàn)單
- 大學(xué)生國(guó)家安全教育意義
- 2024年保育員(初級(jí))培訓(xùn)計(jì)劃和教學(xué)大綱-(目錄版)
- 河北省石家莊市2023-2024學(xué)年高二上學(xué)期期末考試 語(yǔ)文 Word版含答案
- 企業(yè)正確認(rèn)識(shí)和運(yùn)用矩陣式管理
- 分布式光伏高處作業(yè)專(zhuān)項(xiàng)施工方案
- 陳閱增普通生物學(xué)全部課件
- 檢驗(yàn)科主任就職演講稿范文
- 人防工程主體監(jiān)理質(zhì)量評(píng)估報(bào)告
評(píng)論
0/150
提交評(píng)論