




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章Swing用戶界面組件西北師范大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院主要內(nèi)容9.1Swing與模型-視圖-控制器設(shè)計(jì)模式9.2布局管理概述9.3文本輸入9.4選擇組件9.5菜單9.6復(fù)雜的布局管理9.7對(duì)話框9.1Swing與模型-視圖-控制器設(shè)計(jì)模式9.1.1設(shè)計(jì)模式9.1.2MVC模式9.1.3Swing按鈕的模型-視圖-控制器分析面向?qū)ο筌浖畲蟮暮锰幹痪褪菑?fù)用,不是解決任何問(wèn)題都要從頭做起。在眾多的軟件開發(fā)過(guò)程中,人們發(fā)現(xiàn)了許多問(wèn)題都可以運(yùn)用以前的設(shè)計(jì)方案解決現(xiàn)在的問(wèn)題。設(shè)計(jì)模式也就應(yīng)運(yùn)而生,簡(jiǎn)單地說(shuō),設(shè)計(jì)模式是對(duì)反復(fù)出現(xiàn)的設(shè)計(jì)問(wèn)題的重復(fù)解決方案。9.1.1設(shè)計(jì)模式AWT和Swing設(shè)計(jì)中常見的設(shè)計(jì)模式模型-視圖-控制器容器和組件是“組合(composite)”模式帶滾動(dòng)條的面板是“裝飾器(decorator)”模式布局管理器是“策略(strategy)”模式模式的一般格式首先描述背景,即引發(fā)設(shè)計(jì)問(wèn)題的情形;接著解釋問(wèn)題,通常這里會(huì)有幾個(gè)沖突的因素;最終,權(quán)衡這些沖突,給出問(wèn)題的解決方案。以模型-視圖-控制器設(shè)計(jì)模式為例:其背景是顯示信息和接收用戶輸入的用戶界面系統(tǒng);沖突:對(duì)一些數(shù)據(jù),可能需要同時(shí)更新多個(gè)可視化表示等等;解決方案:將這些功能分布到三個(gè)獨(dú)立的交互組件:模型、視圖和控制器。9.1.2MVC模式組件(component)三要素:
內(nèi)容,如:按鈕的狀態(tài)(是否按下),或者文本框的文本;
外觀(顏色、大小等);
行為(對(duì)事件的反應(yīng))。為了實(shí)現(xiàn)需求,Swing設(shè)計(jì)者采用了一種很有名的設(shè)計(jì)模式:模型-視圖-控制器(model-view-controller)模式,簡(jiǎn)稱MVC模式。
MVC模式的組成MVC模式是一種通用的框架,它由三部分組成,如圖:控制器controller模型model視圖view模型(Model)--存儲(chǔ)并操作數(shù)據(jù);視圖(View)--顯示模型中的數(shù)據(jù);控制器(Control)--處理用戶輸入,并決定是否改變模型或者視圖(通過(guò)調(diào)用相應(yīng)的方法)。MVC模式實(shí)現(xiàn)的設(shè)計(jì)原則模型、視圖、控制器對(duì)象之間的交互JavaMVC模式的優(yōu)點(diǎn)一個(gè)模型可以有多個(gè)視圖和多個(gè)控制器;當(dāng)模型改變時(shí),模型的視圖能夠自動(dòng)地得到通知;在一個(gè)視圖中改變模型的屬性,可以使模型其他視圖也隨之更新;由于模型獨(dú)立于視圖,所以不需要修改模型來(lái)適應(yīng)新類型的視圖或控制器。為了簡(jiǎn)化組件的設(shè)計(jì)工作,在Swing組件中往往提供“組件包裝器類”,將視圖和模型兩部分合為一體。包裝器類起到了一個(gè)“轉(zhuǎn)發(fā)命令”的作用:1.需要查詢內(nèi)容時(shí):包裝器類向Model查詢并返回結(jié)果。2.需要改變視圖時(shí):包裝器類將此請(qǐng)求轉(zhuǎn)發(fā)給View.注意:包裝器類不是萬(wàn)能的,有時(shí)候直接與Model打交道也是必要的。包裝器類9.1.3Swing按鈕的模型-視圖-控制器分析按鈕是最簡(jiǎn)單的用戶界面元素,所以我們從按鈕開始學(xué)習(xí)模型-視圖-控制器模式會(huì)感覺(jué)容易些。對(duì)于復(fù)雜的Swing組件來(lái)說(shuō),所遇到的類和接口都是類似的。按鈕JButton是一個(gè)包裝器類。對(duì)于大多數(shù)組件,模型類實(shí)現(xiàn)了名字以Model結(jié)尾的接口,然后組件就會(huì)使用Model類對(duì)象。例如:按鈕就實(shí)現(xiàn)了ButtonModel接口。例如:一個(gè)JButton對(duì)象中有一個(gè)存儲(chǔ)其狀態(tài)的分離模型ButtonModel對(duì)象(從其父類AbstractButton中繼承)??梢酝ㄟ^(guò)下面的代碼獲得該ButtonModel對(duì)象:JButtonbutton=newJButton(“Blue”);ButtonModelmodel=button.getModel()注意:1.Model不存儲(chǔ)按鈕標(biāo)簽或者圖標(biāo)。——即無(wú)法通過(guò)模型來(lái)知道外觀2.同一Model可用于不同組件。例如:DefaultButtonModel可用于下壓按鈕、單選按鈕、復(fù)選框甚至菜單項(xiàng)。ButtonModel接口方法作用getActionCommand()與按鈕關(guān)聯(lián)的動(dòng)作命令字符串getMnemonic()按鈕的快捷鍵isArmed()如果按鈕被按下且鼠標(biāo)仍在按鈕上時(shí)返回trueisEnabled()如果按鈕是可選擇的,返回true
isPressed()如果按鈕被按下且鼠標(biāo)按鈕沒(méi)有被釋放,返回trueisRollover()如果鼠標(biāo)在按鈕之上,返回trueisSelected()如果按鈕已被選擇(用于復(fù)選框和單選按鈕),返回trueButtonModel接口提供了一系列的方法來(lái)獲取按鈕模型維護(hù)時(shí)所需的數(shù)據(jù)。DefaultButtonModel(同樣的模型)是一個(gè)實(shí)現(xiàn)了ButtonModel接口的類。即使是采用同一Model的按鈕,可能會(huì)有各自不同的View和Controller。例如:當(dāng)使用Metal觀感時(shí),JButton類會(huì)采用BasicButtonUI類作為其視圖;用ButtonUIListener類作為控制器。注意:一般情況下,不必直接操作View——這是感觀代碼的工作。Java1.4不允許基本組件直接被加入到頂級(jí)容器中,以后的版本,基本組件即使允許被直接加入到頂級(jí)容器中,其中的組件也會(huì)互相覆蓋,影響使用。為了設(shè)計(jì)美觀合理的界面,則需要進(jìn)一步考慮如何設(shè)計(jì)和控制組件在容器中的位置和相互關(guān)系,就需要學(xué)習(xí)布局設(shè)計(jì)的知識(shí)。在Java的GUI應(yīng)用程序界面設(shè)計(jì)中,布局控制是通過(guò)為容器設(shè)置布局管理器來(lái)實(shí)現(xiàn)的。189.2布局管理器概述199.2.1布局管理器Java.awt包中定義了5種布局管理類,每一種布局管理類對(duì)應(yīng)一種布局策略。每個(gè)容器都有缺省的布局管理器。當(dāng)一個(gè)容器選定一種布局策略時(shí),它應(yīng)該創(chuàng)建該策略對(duì)應(yīng)的布局管理器的對(duì)象,并將此對(duì)象設(shè)置為自己的布局管理器。20
Java中的布局類型有五種:(1)FlowLayout:流布局(Applet和Panel的默認(rèn)布局管理器)(2)BorderLayout:邊框布局(Window、Frame和Dialog的默認(rèn)布局管理器)(3)GridLayout:網(wǎng)格布局(4)GridBagLayout:網(wǎng)格組布局(5)CardLayout:卡片布局布局管理器的種類21如何設(shè)置布局每個(gè)容器都有一個(gè)與它相關(guān)的缺省的布局管理器。在沒(méi)有設(shè)置新的布局前,在容器中添加組件都按照該容器的缺省布局排列。可以通過(guò)setLayout()方法為容器設(shè)置新的布局。格式:容器組件名.setLayout(布局類對(duì)象名)229.2.2FlowLayout(流布局管理器)Flow布局管理器用于對(duì)組件逐行地定位,每完成一行,一個(gè)新行便又開始。與其他布局管理器不一樣的是,F(xiàn)low布局管理器不限制它所管理的組件的大小,允許它們有自己的最佳大小。FlowLayout的構(gòu)造函數(shù)有:FlowLayout():生成一個(gè)默認(rèn)的流式布局;FlowLayout(intalign):可以設(shè)定每一行組件的對(duì)齊方式(FlowLayout.LEFT,FlowLayout.CENTER,FlowLayout.RIGHT);FlowLayout(intalign,inthgap,intvgap):可以設(shè)定組件間的水平和垂直距離(缺省時(shí)組件之間沒(méi)有空隙)。239.2.3BorderLayout(邊框布局管理器)邊框布局管理器是每個(gè)JFrame的內(nèi)容窗格的默認(rèn)布局管理器。流布局管理器完全控制每個(gè)組件的放置位置,邊框布局管理器則不然組件可被置于內(nèi)容窗格的中部,北部、南部、東部或西部位置。如果擴(kuò)大窗口,用戶將會(huì)看到中心區(qū)域會(huì)盡可能的擴(kuò)大,而其他區(qū)域只擴(kuò)大到容納組件所需空間的大小。24BorderLayout的使用方法設(shè)置容器的布局管理器為BorderLayout;向容器中加入組件時(shí),用戶必須使用兩個(gè)參數(shù)的add()方法,而且第一個(gè)參數(shù)必須為“North”、“South”、“East”、“West”或“Center”。259.2.4GridLayout(網(wǎng)格布局管理器)網(wǎng)格布局像電子數(shù)據(jù)表一樣,按行列排列所有的組件。在網(wǎng)格布局對(duì)象的構(gòu)造器中,需要指定行數(shù)和列數(shù):panel.setLayout(newGredLayout(5,4));每個(gè)單元具有相同的尺寸。添加組件,從第一行和第一列開始,然后是第一行的第二列。以此類推。panel.add(newJButton("1"));panel.add(newJButton("2"));26GridLayout的使用方法GridLayout的構(gòu)造函數(shù)如下所示:(1)GridLayout():生成一個(gè)單列的網(wǎng)格布局;(2)GridLayout(introws,intcols):生成一個(gè)設(shè)定行數(shù)和列數(shù)的網(wǎng)格布局;(3)GridLayout(introws,intcolumns,inthgap,intvgap):可以設(shè)置組件之間的水平和垂直間隔。27Grid布局管理器總是忽略組件的最佳大小。所有單元的寬度是相同的,是根據(jù)單元數(shù)對(duì)可用寬度進(jìn)行平分而定的。同樣地,所有單元的高度也是相同的,是根據(jù)行數(shù)對(duì)可用高度進(jìn)行平分而定的。將組件添加到網(wǎng)格中的命令決定它們占有的單元。單元的行數(shù)是從左到右填充,就像文本一樣,而頁(yè)是從上到下由行填充。下面是一個(gè)GridLayout應(yīng)用的示例。28importjava.awt.*;publicclassGridLayoutDemo{ publicstaticvoidmain(Stringargs[]) {GridLayoutGrid1=newGridLayout(3,2); Framef=newFrame("Gridexample");f.setSize(200,150);f.setLayout(newGridLayout(3,2)); Buttonb1=newButton("1"); Buttonb2=newButton("2");Buttonb3=newButton("3");Buttonb4=newButton("4");Buttonb5=newButton("5"); Buttonb6=newButton("6");
29f.add(b1);f.add(b2);f.add(b3);f.add(b4);f.add(b5); f.add(b6);f.setVisible(true); }}CardLayout的容器可以容納多個(gè)組件,但是實(shí)際上同一時(shí)刻容器只能從這些組件中選出一個(gè)來(lái)顯示,就象一疊“撲克牌”每次只能顯示最上面的一張。9.2.5GardLayout(卡片布局管理器)為Frame類的實(shí)例f指定了一個(gè)CardLayout類型的布局管理器,然后向其中加入了五張卡片,每張卡片都是Panel類的一個(gè)實(shí)例,并且具有不同的背景色。每當(dāng)在程序窗口單擊鼠標(biāo)時(shí),下一張卡片就會(huì)顯示出來(lái)。9.3文本輸入首先介紹具有用戶輸入和編輯文本功能的組建(分類如右圖)。三者都能用于獲取文本輸入。這三個(gè)類都繼承于JTextComponent類,它是一個(gè)抽象類所以不能構(gòu)造這個(gè)類的對(duì)象。在查看API文檔時(shí),經(jīng)常會(huì)發(fā)現(xiàn)要找尋的方法實(shí)際上來(lái)自于父類JTextComponent,而不是來(lái)自派生類自身。文本輸入組件文本域(JTextField)文本區(qū)(JTextArea)JPassword只能接受單行文本的輸入。接受多行文本的輸入。接收單行文本輸入但不顯示。JTextField是一個(gè)輕量級(jí)組件,所謂的輕量級(jí)組件是用JAVA代碼畫出來(lái)的,這樣的組件具有平臺(tái)移植性;一般建議采用輕量級(jí)組件,這可以提高程序的移植性,在Javax.Swing包里的組件大部分是輕量級(jí)的。API:javax.swing.text.JTextComponent
StringgetText()voidsetText(Stringt)獲取或設(shè)置文本組件中的文本。booleanisEditable()voidsetEditable(booleanb)獲取或設(shè)置editable特性。9.3.1文本域
構(gòu)造方法JTextField()--文本域的長(zhǎng)度為一個(gè)字符JTextField(intcols)--文本域的長(zhǎng)度為X個(gè)字符JTextField(Stringtext)--文本域的初始字符串為textJTextField(Stringtext,intcols)--文本域的初始字符串為text,長(zhǎng)度為cols個(gè)字符添加文本域把一個(gè)文本域添加到一個(gè)窗口的通常辦法是把它添加到一個(gè)面板或其它容器中。
代碼:
JPanelpanel=newJPanel();JTextFieldtextField=newJTextField(“文本域輸入”20);panel.add(textField);改變文本域的大小列不是一個(gè)精確的測(cè)量單位,一列就是一個(gè)字符在當(dāng)前使用的字體下的寬度。可用setColumn(intx)方法改變列的大小textField.setColumn(10);調(diào)用setColumn()方法后需要調(diào)用所在容器的validate方法,重新計(jì)算組件大小panel.validate();安裝文檔監(jiān)聽器
textField.getDocument().
addDocumentListener(listener)文檔接口DocumentListener中含有三個(gè)方法:voidinsertUpdate(DocumentEvente)voidremoveUpdate(DocumentEvente)voidchangeUpdate(DocumentEvente)當(dāng)文本發(fā)生改變后,上面三個(gè)方法中的一個(gè)會(huì)被調(diào)用。標(biāo)簽是容納文本的組件,常用來(lái)標(biāo)識(shí)別的組件。構(gòu)造方法:JLabel(Stringtext)JLabel(Iconicon)JLabel(Stringtext,intalign)JLabel(Stringtext,Iconicon,intalign)9.3.2標(biāo)簽和標(biāo)簽組件
參數(shù)說(shuō)明text:標(biāo)簽中的文本Icon:標(biāo)簽中的圖標(biāo)align:
SwingConstant.LEFTSwingConstant.RIGHTSwingConstant.CENTERvoidsetText(Stringtext)voidsetIcon(Iconicon)密碼域是一種特殊類型的文本域,為了避免有不良企圖的人看見密碼,用戶輸入的字符不顯示出來(lái),每個(gè)輸入的字符都用回顯字符(echocharacter)表示。典型的回顯字符是(*),Swing提供了JPasswordField類來(lái)實(shí)現(xiàn)這樣的文本域。密碼域是另一個(gè)應(yīng)用模型-視圖-控制器體系模式的例子。密碼與采用與常規(guī)的文本域相同的模型來(lái)存儲(chǔ)數(shù)據(jù),但是,它的視圖卻改為顯示回顯字符而不是實(shí)際的字符。9.3.3密碼域方法JPasswordField(Stringtext,intcolumns)——構(gòu)造一個(gè)新的密碼域?qū)ο?。voidsetEchoChar(charecho)——為密碼域設(shè)置回顯字符。0表示重新設(shè)置為默認(rèn)的回顯字符。char[]getPassword()——返回密碼域中的文本。使用之后應(yīng)該覆寫返回的數(shù)組內(nèi)容。
當(dāng)用戶的輸入超過(guò)一行時(shí),就需要用到JTextArea組件來(lái)接受這樣的輸入,當(dāng)在程序中放置一個(gè)文本區(qū)組件時(shí),用戶就可以輸入多行文本,用ENTER鍵換行。每行都有一個(gè)“\n”結(jié)尾。在JTextArea組件的構(gòu)造器中,可以指定文本區(qū)的行數(shù)和列數(shù)。
例如:textArea=newJTextArea(8,40);//8行40列如果文本區(qū)文本超出顯示范圍會(huì)被裁減,可開啟換行避免。而且換行只是視覺(jué)效果,文本沒(méi)有改變。9.3.4文本區(qū)
構(gòu)造方法JTextArea(introws,intcols)JTextArea(Stringtext,introws,intcols)改變文本區(qū)大小setColumn(intcols)setRows(introws)追加文本append(StringnewText)打開或關(guān)閉換行setLineWrap(booleanword)
9.3.4文本區(qū)在Swing中,文本區(qū)沒(méi)有滾動(dòng)條,可以將文本區(qū)插入到滾動(dòng)窗格(scrollpana)中。JTextAreatextArea=newJTextArea(8,40);JScrollPanescrollPane=newJScrollPane(textArea);contentPane.add(scrollPane,“Center”);如果文本超出了文本區(qū)可以顯示的范圍,滾動(dòng)條就會(huì)自動(dòng)的出現(xiàn),并且在刪除部分文本后能夠顯示在文本區(qū)范圍內(nèi)時(shí),滾動(dòng)條會(huì)再次自動(dòng)消失。9.3.5滾動(dòng)窗格滾動(dòng)是由滾動(dòng)窗格內(nèi)部處理的,編寫程序時(shí)無(wú)需處理滾動(dòng)事件。這是一種為任意組件添加滾動(dòng)功能的通用機(jī)制,而不是文本區(qū)特有的。也就是說(shuō),想要為組件添加滾動(dòng)條,只需將它們放入一個(gè)滾動(dòng)窗格中即可。注釋:JTextArea組件只顯示無(wú)格式的文本,沒(méi)有特殊字體或者格式設(shè)置。如果想要顯示格式化文本(如HTML),就需要使用JEditorPane類。程序9-2展示了各種文本組件。這個(gè)程序只是簡(jiǎn)單地顯示了一個(gè)文本域,一個(gè)密碼域和一個(gè)帶滾動(dòng)條的文本區(qū)。文本域和密碼域都使用了標(biāo)簽。點(diǎn)擊“Insert”會(huì)將組件中內(nèi)容插入到文本區(qū)中。P339:程序清單9-29.4選擇組件9.4.1選擇框9.4.2單選按鈕9.4.3邊框9.4.4組合框9.4.5滑動(dòng)條在輸入的情況只是“是”或“否”。使用復(fù)選框;自動(dòng)帶有標(biāo)志標(biāo)簽,獲得焦點(diǎn)時(shí)可通過(guò)空格鍵切換;構(gòu)造器指定標(biāo)簽
bold=newJCheckBox(“Bold”)isSelected返回復(fù)選框當(dāng)前狀態(tài)bold.setSelected(true)方法來(lái)選定或取消選定復(fù)選框9.4.1復(fù)選框添加監(jiān)聽器:ActionListenerlistener=……bold.addactionListener(listener)bold.removeactionListener(listener)監(jiān)聽器的接口方法為:actionPerformed()
程序?qū)嵗鼳PI:Javax.swing.JCheckBox
JCheckBox(Stringlabel)
JCheckBox(Stringlabel,Iconicon)
構(gòu)造一個(gè)復(fù)選框,初始沒(méi)有被選擇
JCheckBox(Stringlabel,booleanstate)
用給定的標(biāo)簽和初始化狀態(tài)構(gòu)造一個(gè)復(fù)選框,
設(shè)定初選狀態(tài)。booleanisSelected()voidsetSelected(booleanstate)
獲取或設(shè)置復(fù)選框選擇狀態(tài)9.4.2單選按鈕復(fù)選框與單選按鈕的區(qū)別按鈕的區(qū)別:復(fù)選框與單選按鈕外觀不一樣,復(fù)選框?yàn)檎叫?,選中出現(xiàn)一個(gè)對(duì)勾符號(hào)。單選按鈕為圓形,選中出現(xiàn)一個(gè)原點(diǎn)。選擇的區(qū)別:對(duì)于復(fù)選框可以選擇一個(gè),兩個(gè)甚至多個(gè)。但是對(duì)于單選按鈕只能選擇一個(gè)。當(dāng)選擇下一個(gè),前一個(gè)自動(dòng)彈起。監(jiān)聽器的區(qū)別:每一個(gè)單選按鈕對(duì)應(yīng)一個(gè)不同的監(jiān)聽器對(duì)象。復(fù)選框共享一個(gè)動(dòng)作監(jiān)聽器。添加監(jiān)聽器:ActionListenerlistener=……bold.addactionListener(listener)bold.removeactionListener(listener)監(jiān)聽器的接口方法為:actionPerformed()單選按鈕實(shí)例APIjava.swing.JRadioButtonJRadioButton(Stringlabel,Iconicon)
構(gòu)造一個(gè)單選按鈕,初始沒(méi)有被選擇JRadioButton(Stringlabel,booleanstate)用給定的標(biāo)簽和初始狀態(tài)構(gòu)造一個(gè)單選按鈕APIjavax.swing.ButtonGroupvoidadd(AbstractButtonb)
將按鈕加到組中ButtonModelgetSelected()
返回被選擇的按鈕的模型APIjavax.swing.ButtonModel
StringgetActionCommand()返回按鈕模型的動(dòng)作命令A(yù)PIjavax.swing.AbstractButtonvoidsetActionCommand(Strings)設(shè)置按鈕其模型的動(dòng)作命令
9.4.3邊框可以用來(lái)指明那些按鈕屬于同一組??梢栽谌魏卫^承了Jcomponent的組件上應(yīng)用邊框調(diào)用BordFactory的靜態(tài)方法創(chuàng)建邊框。風(fēng)格(凹斜面,凸斜面,蝕刻,直線,蒙版,空)給邊框添加標(biāo)題:BorderFactory.createTitledBorder調(diào)用下列方法將幾種邊框組合起來(lái)BorderFactory.createCompoundBorder調(diào)用JComponent類中setBorder將結(jié)果邊框添加到一個(gè)面板中。1.javax.swing.borderAbstractBorder所有邊框類的父類2.BorderFactory使用工廠設(shè)計(jì)模式快速設(shè)計(jì)邊框,隱藏創(chuàng)建細(xì)節(jié)。3.LineBorderLineBorder是圍繞組件周圍用戶義定寬度的單色行邊框。他可以具有方角或是圓角。
LineBorder有三個(gè)構(gòu)造函數(shù),兩個(gè)工廠方法以及兩個(gè)BorderFactory工廠方法。4.MatteBorder如果我們希望修改不同邊的粗細(xì),我們需要使用MatteBorder。5.TitleBorder6.BevelBorderBevelBorder以三維外觀繪制邊框,其可以表現(xiàn)為升起或是降低。當(dāng)邊框升起時(shí),在邊框的底部與右邊會(huì)出現(xiàn)陰影效果。當(dāng)降低時(shí),陰影的位置會(huì)相反。BevelBorder有三個(gè)構(gòu)造函數(shù)以及一個(gè)工廠方法,同時(shí)還有BorderFactory創(chuàng)建BevelBorder對(duì)象的五個(gè)工廠方法。7.SoftBevelBorderSoftBevelBorder是BevelBorder的近親。這個(gè)組件會(huì)包圍四角,所以他們的邊并不尖利。
而他使用下邊與右邊的相應(yīng)外邊顏色只繪制一條線。8.EtchedBorder建立一個(gè)四周有凹痕的邊界,也可以指定突邊與陰影的顏色。9.CompoundBorder建立一個(gè)復(fù)合邊界,并可以指定它的內(nèi)外邊界。9.4.4組合框當(dāng)有多個(gè)選擇項(xiàng)時(shí),采用組合框。單選按鈕占屏幕空間大。調(diào)用setEditable方法可以讓組合框可編輯。編輯只會(huì)影響當(dāng)前項(xiàng),不會(huì)改變列表內(nèi)容。可以調(diào)用getSelectedItem方法獲取當(dāng)前選擇como.getItemAt(como.getSelectedIndex())為所選項(xiàng)提供正確的的類型??赏ㄟ^(guò)addItem方法增加選項(xiàng)的調(diào)用。增加在尾部。其中insertItemAt在任何位置插入。insertItemAt(“X”,position)
當(dāng)如果需要添加大量的選項(xiàng)時(shí),構(gòu)造函數(shù),調(diào)用addElement方法進(jìn)行加載。再調(diào)用JComboBox中setModel方法toString顯示內(nèi)容刪除選項(xiàng)內(nèi)容,可以使用removeItem(content)或者removeItemAt(postion)removeAllItem刪除所有的選項(xiàng)。
若想持久的顯示列表,而不是下拉列表,使用Jlist組件javax.swing.JComboBoxbooleanisEditable()voidsetEditable(booleanb)
獲取或設(shè)置組合框的可編輯性。9.4.5滑動(dòng)條JSildersilder=newJsilder(min,max,initialValue);默認(rèn)為0,100,50垂直滑條JSildersilder=newJsilder(SwingConstants.VERICAL,min,max,initialValue);添加監(jiān)聽器:
ActionListenerlistener=……
listener.addChangeListener(listener)監(jiān)聽器的接口方法為:
StateChanged()javax.swing.JSilderSilder.setMajorTickSpacing(Num)顯示一個(gè)大尺標(biāo)標(biāo)記
Silder.setMinorTickSpacing(Num)顯示一個(gè)小尺標(biāo)標(biāo)記
Silder.setPaintTicks(true)顯示標(biāo)尺標(biāo)記,否則隱藏Silder.setSnapToTicks(true)滑動(dòng)條與標(biāo)尺對(duì)齊Silder.setPaintTrack(false)隱藏滑動(dòng)條Silder.setInverted(true)逆向滑動(dòng)滑動(dòng)條或者標(biāo)簽若不顯示,檢查是否調(diào)用setPaintTicks(True)和setPaintLabels(True)。每個(gè)滑動(dòng)條都安裝了一個(gè)改變事件的監(jiān)聽器。6.5菜單
菜單欄菜單
菜單項(xiàng)菜單欄菜單項(xiàng)菜單框架6.5.1菜單創(chuàng)建過(guò)程創(chuàng)建菜單欄JMenuBarmenuBar=newJMenuBar();
框架中添加菜單欄frame.setJMenuBar(menuBar);創(chuàng)建菜單JMenumenu=newJMenu(“File”);把菜單加入菜單欄中menuBar.addMenu(menu);創(chuàng)建菜單項(xiàng)JMenuItemsaveItem=newJMenuItem(“Save”);向菜單中添加菜單項(xiàng)menu.add(saveItem);6.5.2安裝菜單項(xiàng)監(jiān)聽器當(dāng)用戶選擇一個(gè)菜單項(xiàng)時(shí),一個(gè)動(dòng)作事件就會(huì)被觸發(fā)
ActionListenerlistener=…..;pasteItem.addActionListener(listener);JMenu.add(Strings)是一個(gè)很方便的方法,它可以把一個(gè)菜單項(xiàng)添加到菜單的結(jié)尾
editMenu.add(“paste”);add()返回創(chuàng)建的子菜單項(xiàng),因此可以捕獲它的返回值并添加監(jiān)聽器
JMenuItempItem=editMenu.add(“Paste”);pItem.addActionListener(listener);6.5.3其它常用方法JMenuBar()創(chuàng)建一個(gè)菜單欄JMenu(Stringlabel)創(chuàng)建一個(gè)菜單JMenuItem(Stringlabel)創(chuàng)建一個(gè)菜單項(xiàng)voidaddSeparator()添加一個(gè)分隔行JMenuIteminsert(JMenuItem,intindex)
把一個(gè)菜單項(xiàng)添加到菜單的指定位置voidinsertSeparator(intindex)
把一個(gè)分隔符添加到菜單的指定位置voidremove(JMenuItemitem)刪除指定菜單項(xiàng)6.5.4菜單項(xiàng)中的圖標(biāo)可以通過(guò)JMenuItem(String,Icon)或者M(jìn)enuItem(Icon)來(lái)為菜單指定一個(gè)圖標(biāo)。用JMenuItem類中的setIcon方法來(lái)設(shè)定圖標(biāo)。例如:
JMenuItemcutItem=newJMenuItem(
“cut”,newImageIcon(“cut.gif”)6.5.5復(fù)選框菜單項(xiàng)創(chuàng)建一個(gè)復(fù)選框菜單項(xiàng)
JCheckBoxMenuItemreadonlyItem=newJCheckBoxMenuItem(“read-only”);optionsMenu.add(readonlyItem);
6.5.6單選按鈕菜單項(xiàng)同常規(guī)按鈕一樣,先將其添入按鈕組
ButtonGroupgroup=newButtonGroup();JRadioButtonMenuIteminsertItem=newJRadioButtonMenuItem(“insert”);insertItem.setSelected(true);JRadioButtonMenuItemovertypeItem=newJRadioButtonMenuItem(“overtype”);group.add(insertItem);group.add(OvertypeItem);optionsMenu.add(insertItem);optionsMenu.add(OvertypeItem);6.5.7彈出菜單是一種并非固定在菜單欄中,但是可隨處浮動(dòng)的菜單。創(chuàng)建彈出菜單JPopupMenupopup=newJPopupMenu();添加菜單JMenuItemitem=newJMenuItem(“cut”);item.addActionListener(listener);popup.add(item);彈出式菜單并不總顯示在窗口頂部,必須用show方法顯示。show(Componentc,intx,inty);
例:popup.show(Panel,x,y);通常用戶點(diǎn)擊某個(gè)鼠標(biāo)鍵時(shí),彈出菜單就會(huì)出現(xiàn),這就是彈出觸發(fā)器,通常為鼠標(biāo)右鍵。使用觸發(fā)器步驟如下:安裝鼠標(biāo)監(jiān)聽器在鼠標(biāo)監(jiān)聽器中添加如下代碼:publicvoidmouseReleased(MouseEventevent){if(event.isPopupTrigger())popup.show(event.getComponent(),event.getx(),event.gety());}例:MenuTest.java例子演示例子演示例子演示9.6復(fù)雜的布局管理在windows中,布局管理不是一個(gè)太大問(wèn)題:首先,可以用對(duì)話框編輯器將組件拖放到對(duì)話框的表面上。然后,再使用編輯器工具完成組件對(duì)齊,均衡間隔,中心定位等工作。Java布局管理器是一種用于組件布局的好辦法。應(yīng)用布局管理器,布局就可以使用組件間關(guān)系的指令來(lái)完成布局操作。對(duì)于最初的AWT來(lái)說(shuō),這一點(diǎn)特別重要,這是因?yàn)锳WT使用的是本用戶界面元素。接下來(lái),將進(jìn)述網(wǎng)格組布局。這是因?yàn)檫@種布局在早期的Java版本中,使用的最普遍,且也是產(chǎn)生布局代碼的最簡(jiǎn)單方式。80最復(fù)雜的布局管理器是GridBagLayout。GridBagLayout與GridLayout有點(diǎn)相似,它也是將組件排在格子里,但是GridBagLayout在網(wǎng)格的基礎(chǔ)上提供更復(fù)雜的布局。它允許單個(gè)組件在一個(gè)單元中不填滿整個(gè)單元,而只是占用最佳大小,也允許單個(gè)組件擴(kuò)展成不止一個(gè)單元,并且可以用任意順序加入組件。為了使用GridBagLayout,必須構(gòu)造一個(gè)GridBagConstraints對(duì)象。GridBagConstraints用于指定如何用GridBagLayout放置組件。GridBagConstraints對(duì)象包含一些重要的約束,以指定組件的放置方式,這些約束的含義如下:9.6.1
GridBagLayout
(網(wǎng)格組布局)811.gridx、gridy、gridwidth和gridheight參數(shù)。這四個(gè)參數(shù)用于指定組件在網(wǎng)格中的位置。gridx和gridy值用于指定組件左上角的坐標(biāo);gridwidth和gridheight決定組件將占用多少行和列。2.增量域(weightx和weighty)。GridBagLayout內(nèi)的每個(gè)區(qū)域都必須設(shè)置它的增量域,即weightx和weighty。如果將權(quán)值設(shè)置為0,那么這個(gè)區(qū)域就不會(huì)在那個(gè)方向上擴(kuò)張或收縮,超出它的初始大小。從概念上講,增量參數(shù)屬于行和列的屬性,而不屬于摸個(gè)單獨(dú)的單元格。但卻需要在單元格上指定它們,這是因?yàn)榫W(wǎng)格組布局并不暴露行和列。注意,增量并不實(shí)際給出列的相對(duì)大小。3.fill和anchor參數(shù)。fill參數(shù)用于指定組件在單元格內(nèi)進(jìn)行伸縮時(shí)的填充方式,該參數(shù)可以有四種有效值:GridBagConstraints.NONE(不伸縮)、GridBagConstraints.HORIZONTAL(水平伸縮)、GridBagConstraints.VERTICAL(垂直伸縮)GridBagConstraints.BOTH如果組件沒(méi)有填充整個(gè)區(qū)域,可以通過(guò)設(shè)置anchor域指定其位置。有效值為GridBagConstraints.CENTER,GridBagConstraints.NORTH,GridBagConstraints.NORTHEAST,GridBagConstraints.EAST等834.填充參數(shù)insets,ipadx和ipady。insets參數(shù)用于設(shè)置沿單元格邊界的外部填充空白區(qū)域。ipadx和ipady則用于指定在環(huán)繞組件四周的單元格內(nèi)部填充空白區(qū)域。5.指定gridx、gridy、gridwidth和gridheight參數(shù)的另一種方法(362頁(yè))6.使用幫助類管理(tame)網(wǎng)格組約束(363頁(yè))
849.6.2布局類型的選用
每個(gè)布局管理器都有自己特定的用途。要按行和列顯示幾個(gè)同樣大小的組件,GridLayout(網(wǎng)格布局)會(huì)比較合適。要盡量使用所有的空間來(lái)顯示組件,就要選擇BorderLayout(邊框布局)或GridBagLayout(網(wǎng)格組布局)。要在緊湊的一行中以組件的自然尺寸顯示組件時(shí),使用FlowLayout(流布局)。85有時(shí)候用戶可能不想使用任何布局管理器,而只是想把組件放在一個(gè)固定的位置上。下面是將一個(gè)組件定位到莫個(gè)絕對(duì)定位的步驟:1)將布局管理器設(shè)置為nill。2)將組件添加到容器中。3)指定想要放置的位置和大小。frame.setLayout(null);Jbuttonok=newJbutton("ok");frame.add(ok);ok.setBounds(10,10,30,15);9.6.3不使用布局管理器9.6.4定制布局管理器原則上,可以通過(guò)自己設(shè)計(jì)LayoutManager類來(lái)實(shí)現(xiàn)特殊的布局方式。如果一定需要定制布局管理器,可以采用下面進(jìn)述的定制布局管理器的方法。vouidaddLayoutComponent(Strings,Componentc);voidremoveLayoutComponent(Componentc);DimensionpreferredLayoutSize(Containerparent);DimensionminimumLayoutSize(Containerpanent);voidlayoutContainer(containerparent);9.6.5遍歷順序當(dāng)把很多組件添加到窗口中時(shí),需要考慮遍歷順序(traversalorder)的問(wèn)題。在JavaSE1.4中有兩個(gè)標(biāo)準(zhǔn)的遍歷策略:
1)純的AWT應(yīng)用程序使用
DefaultFocusTraversalPolicy。
2)Swing應(yīng)用程序使用
LayoutFocusTraversalPolicy。對(duì)話框分類:模式對(duì)話框:其特征是在處理完對(duì)話框之前不能同應(yīng)用程序主窗口進(jìn)行交互。如:文件模式對(duì)話框。無(wú)模式對(duì)話框:允許用戶同時(shí)在對(duì)話框和程序剩余部分中輸入信息。如:工具欄。9.7對(duì)話框Swing中的JOptionPane類提供了一些簡(jiǎn)單對(duì)話框用于收集用戶的信息。JOptionPane類有四個(gè)靜態(tài)方法來(lái)顯示這些對(duì)話框:showMessageDialogshowConfirmDialogshowOptionDialogshowInputDialog9.7.1選項(xiàng)對(duì)話框消息類型消息對(duì)象顯示方式按鈕取決于對(duì)話框類型和選項(xiàng)類型,常用選項(xiàng)為:幾個(gè)常用API:showMessageDialog(Componentparent,Objectmessage,Stringtitle,intmessageType,Iconicon);
showConfirmDialog(Componentparent,Objectmessage,Stringtitle,intoptionType,intmessageType,Iconicon);
showOptionDialog(Componentparent,Objectmessage,Stringtitle,intoptionType,intmessageType,Iconicon,Object[]option,Objectdefault);
showInputDialog(Componentparent,Objectmessage,Stringtitle,intmessageType,Iconicon,Object[]option,Objectdefault);例:顯示一條信息并讓用戶確認(rèn)或取消。代碼如下:
intselection=JOptionPane.ShowConfirmDialog(parent,“message”,
“Title”,JOptionPane.OK_CANCEL_OPTION,JOptionPane.WARNING_MESSAGE);if(selection==JOption.OK_OPTION…..例:OptionDialogTest.java例子演示例子演示為了實(shí)現(xiàn)一個(gè)對(duì)話框,需要派生JDialog類的一個(gè)子類,步驟如下:在對(duì)話框的構(gòu)造器中,調(diào)用基類JDialog的構(gòu)造器。添加該對(duì)話框的用戶界面組件。添加事件處理器。設(shè)置對(duì)話框的大小。9.7.2創(chuàng)建對(duì)話框classAboutDialogextendsJDialog{publicAboutDialog(JFrameowner){super(owner,"AboutDialogTest",true);ContainercontentPane=getContentPane();contentPane.add(newJLabel(
“
主只是一個(gè)對(duì)話框的例子"),BorderLayout.CENTER);
//OkbuttonclosesthedialogJButtonok=newJButton("Ok");ok.add
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 全媒體運(yùn)營(yíng)師內(nèi)容創(chuàng)新試題及答案
- 夏季四防培訓(xùn)課件
- Unit 4 Friends Lesson 4 (教學(xué)設(shè)計(jì))-2024-2025學(xué)年人教精通版(2024)英語(yǔ)三年級(jí)上冊(cè)
- 3 做個(gè)“開心果”(教學(xué)設(shè)計(jì))2023-2024學(xué)年統(tǒng)編版道德與法治二年級(jí)下冊(cè)001
- 大學(xué)生創(chuàng)業(yè)賣零食
- 2025管理工作總結(jié)
- 2023七年級(jí)道德與法治上冊(cè) 第一單元 成長(zhǎng)的節(jié)拍第三課 發(fā)現(xiàn)自己第2框 做更好的自己教學(xué)實(shí)錄 新人教版
- 2025年簡(jiǎn)易勞動(dòng)合同模板下載
- Module 9 Unit 2 I bumped my head (教學(xué)設(shè)計(jì))-2024-2025學(xué)年外研版(一起)英語(yǔ)四年級(jí)上冊(cè)
- 黨支部基礎(chǔ)知識(shí)培訓(xùn)
- 2024春期國(guó)開電大專本科《勞動(dòng)與社會(huì)保障法》在線形考(形考任務(wù)一)試題及答案
- 【知識(shí)點(diǎn)梳理】部編版語(yǔ)文六年級(jí)下冊(cè)第一單元學(xué)習(xí)力提升知識(shí)點(diǎn)名師梳理
- python程序設(shè)計(jì)-說(shuō)課
- 【數(shù)學(xué)】分類變量與列聯(lián)表-2023-2024學(xué)年高二數(shù)學(xué) 人教A版2019選擇性必修第三冊(cè)
- 國(guó)家電網(wǎng)智能化規(guī)劃總報(bào)告
- 石油勘探與開采的環(huán)境保護(hù)措施
- 中文學(xué)術(shù)簡(jiǎn)歷模板
- 2024年蘇州職業(yè)大學(xué)高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 王者榮耀主播培訓(xùn)方案
- ERT基礎(chǔ)-ERT概論課件
- 《將軍胡同》閱讀試題及答案
評(píng)論
0/150
提交評(píng)論