版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章圖形用戶(hù)界面設(shè)計(jì)學(xué)習(xí)目標(biāo):使用抽象工具包AWT和Swing組件開(kāi)發(fā)圖形用戶(hù)界面。事件處理。Applet的程序結(jié)構(gòu)及運(yùn)行過(guò)程。圖形用戶(hù)界面(graphicsuserinterface,GUI)使用圖形方式,借助于窗口中的菜單、按鈕等界面元素和鼠標(biāo)操作,實(shí)現(xiàn)用戶(hù)與計(jì)算機(jī)系統(tǒng)的交互作用。Java語(yǔ)言中,為了便于用戶(hù)開(kāi)發(fā)圖形用戶(hù)界面,專(zhuān)門(mén)提供了用來(lái)生成各種標(biāo)準(zhǔn)圖形界面元素和處理圖形界面事件的類(lèi)庫(kù)。剛引入Java時(shí),和圖形用戶(hù)界面相關(guān)的類(lèi)都放在稱(chēng)為抽象窗口工具包AWT的庫(kù)中,包含了許多類(lèi)來(lái)支持GUI設(shè)計(jì),該包中有許多用來(lái)設(shè)計(jì)GUI的組件類(lèi),如按鈕、菜單、列表、文本框等組件類(lèi),同時(shí)它還包含窗口、面板等容器類(lèi)。隨著Java2的發(fā)行,AWT的用戶(hù)界面組件被更穩(wěn)定、通用和靈活的庫(kù)取代,該庫(kù)稱(chēng)為Swing組件庫(kù)。9.1了解與圖形處理相關(guān)包圖9-1JavaAWT包GUI類(lèi)可以分成三組:容器類(lèi)(containerclass)、輔助類(lèi)(helperclass)和組件類(lèi)(componentclass)。容器類(lèi)用來(lái)包含其他組件,例如JFrame、JPanel和JApplet等。圖形用戶(hù)界面GUI組件類(lèi)都是JComponent類(lèi)的子類(lèi),例如:JButton,JTextField,JTextArea,JCombBox,JList,JRadioButton和JMenu等。輔助類(lèi)是組件和容器用來(lái)繪制和放置對(duì)象的,例如:Graphics,Color,Font,FontMetrics和Dimension等。容器(Container)是Component的抽象類(lèi)的一個(gè)子類(lèi),用于盛裝其他組件。Window,Panel,Applet,Frame,Dialog都是AWT組件的容器類(lèi)。要使用Swing組件作容器,可以使用Component,Container,JFrame,JDialog,JApplet,JPanel。JFrame:是不能包含在另一個(gè)窗口內(nèi)的窗口,是包含其他Swing用戶(hù)界面組件的容器。JApplet是Applet的一個(gè)子類(lèi),創(chuàng)建基于Swing的Javaapplet。組件不能單獨(dú)使用,必須放在容器內(nèi)。使用組件的步驟:1)創(chuàng)建某組件對(duì)象,指定屬性。2)使用某種布局,將該組件對(duì)象加入到某容器中的指定位置。3)將該組件對(duì)象注冊(cè)給它所能產(chǎn)生的事件對(duì)應(yīng)的事件監(jiān)聽(tīng)者,重載事件處理方法,實(shí)現(xiàn)利用該組件對(duì)象與用戶(hù)交互的功能。實(shí)際上,容器也是一種組件,因?yàn)橐粋€(gè)容器也可以被視為組件而包含在其他容器的內(nèi)部。例9-1創(chuàng)建一個(gè)AWT窗體。importjava.awt.*;publicclassexa{publicstaticvoidmain(String[]args){Framef=newFrame("ThisisaWindow!");f.setLocation(100,200);//設(shè)置窗體顯示位置f.setSize(200,400);//設(shè)置窗體尺寸f.setBackground(Color.white);//設(shè)置窗體背景顏色FlowLayoutf1=newFlowLayout();//創(chuàng)建一個(gè)布局管理器f.setLayout(f1);//設(shè)置窗體布局方式Buttonb1=newButton(“OK!”);//創(chuàng)建一個(gè)按鈕組件f.add(b1);//向窗體中添加按鈕Buttonb2=newButton("Cancel!");f.add(b2);f.setVisible(true);}}9.1.2java.swing包
圖9-2Swing包結(jié)構(gòu)圖importjavax.swing.*;importjava.awt.*;publicclassexa{publicstaticvoidmain(Stringargs[]){JFramef=newJFrame("Thisisawindow");f.setLocation(100,200);f.setSize(200,400);FlowLayoutfl=newFlowLayout();f.getContentPane().setLayout(fl);JButton[]jb=newJButton[10];for(inti=0;i<jb.length;i++){jb[i]=newJButton();jb[i].setText(String.valueOf(i));f.getContentPane().add(jb[i]);}f.setVisible(true);}}例9-2創(chuàng)建一個(gè)Swing窗體。Swing組件類(lèi)型很多,按功能分類(lèi)如下:(1)、頂層容器:有JFrame(框架),JWindow(窗體),JDialog(對(duì)話(huà)框)和JApplet(小應(yīng)用程序)。它們屬于swing中的四個(gè)重量級(jí)組件。頂層容器的重要性在于,除了Menubar所有的GUI組件都需要被包含在頂層容器的一個(gè)默認(rèn)容器ContentPane中。(2)、中間容器(又叫簡(jiǎn)單容器):有JPanel(面板),JSplitPane(拆分面板),JToolBar(工具欄),JScrollPane(滾動(dòng)面板)和JTabbedPane(頁(yè)簽式面板)等。中間容器介于頂層容器與一般組件之間,是用來(lái)裝別的組件用的,它是要被添加在頂層容器中的,能夠使被它承載的組件能合適地、有組織地呈現(xiàn)出來(lái)。(3)、特殊容器:有JLayeredPanel、JRootPaneInternalFrame等,它們也是中間容器,但有著特殊的作用。(4)、基本組件:組件是一個(gè)可以以圖形化的方式顯示在屏幕上并能與用戶(hù)進(jìn)行交互的對(duì)象,例如JButton,JLabel,JList等,是最基本圖形用戶(hù)界面的組成部分。窗口容器類(lèi)JFrame使用1.窗口類(lèi)容器Swing提供了四個(gè)在屏幕上顯示窗口的組件:JWindow、JFrame、JApplet和JDialog。這四個(gè)組件統(tǒng)稱(chēng)為頂層組件,它們相互之間的區(qū)別不明顯,因?yàn)槠溆嗟膕wing組件都必須依附在此四組件之一上才能顯示出來(lái),又稱(chēng)之為窗體類(lèi)容器。2.JFrame(窗體)類(lèi)窗體類(lèi)JFrame還叫框架類(lèi),是一種帶有標(biāo)題欄、菜單和邊界的窗口,而且允許調(diào)整大小,是最重要的頂層容器之一,而且是應(yīng)用程序構(gòu)建框架時(shí)必須使用的頂層容器。JFrame類(lèi)是AWT中Frame類(lèi)的子類(lèi),它還加入了一些Swing所獨(dú)有的特性。(1)構(gòu)造方法:JFrame():構(gòu)造一個(gè)新的不可見(jiàn)的窗體對(duì)象JFrame(Stringtitle):構(gòu)造一個(gè)新的、不可見(jiàn)的、具有指定標(biāo)題的窗體對(duì)象。(2)常用方法:publicvoidsetBound(intx,inty,intw,inth):設(shè)置窗口左上角位置和窗口大小publicvoidsetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE):設(shè)定窗口響應(yīng)用戶(hù)的關(guān)閉操作publicvoidsetTitle(Stringtitle):設(shè)置窗口標(biāo)題publicvoidsetResizable(Boolenboolean):設(shè)置窗口是否可調(diào)大小publicvoidsetLocation(intx,inty):設(shè)置窗口左上角位置publicvoidpack():用緊湊方式自動(dòng)設(shè)定窗口大小【例9-4】創(chuàng)建一個(gè)帶組件的窗體實(shí)例。importjavax.swing.*;publicclassexa9_4{publicstaticvoidmain(String[]args){//創(chuàng)建一個(gè)帶標(biāo)題的窗體JFramejf1=newJFrame("這是窗體JFrame");JLabeljb1=newJLabel("歡迎你");f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf1.setLocation(300,200);//設(shè)置窗體的顯示位置jf1.setSize(320,240);//設(shè)置窗體的尺寸jf1.getContentPane().add(jb1);jf1.setVisible(true);//設(shè)置窗體的可見(jiàn)性}}容器的布局Java常用的幾種布局管理器有:FlowLayout——流式布局BorderLayout——邊界布局GridLayout——網(wǎng)格布局CardLayout——卡片布局GridBagLayout——網(wǎng)格包布局Java的GUI組件在容器中放置,它們的位置由容器的布局管理器來(lái)安排。布局管理器是使用布局管理器類(lèi)創(chuàng)建的,每一個(gè)布局管理器類(lèi)都實(shí)現(xiàn)LayoutManager接口。使用setLayout(LayoutManager)方法在容器中設(shè)置布局管理器。三個(gè)基本的布局管理器:FlowLayout,GridLayout,BordeLayout布局管理器FlowLayout是最簡(jiǎn)單的布局管理器。按照添加的順序,由左到右將組件排列在容器中,放滿(mǎn)一行時(shí)就開(kāi)始新的一行??梢允褂萌齻€(gè)常量之一來(lái)指定組件的對(duì)齊方式,這三個(gè)常量是FlowLayout.RIGHT,FlowLayout.CENTER,FlowLayout.LEFT。一般用來(lái)安排面板中的按鈕或復(fù)選框的排列。
構(gòu)造方法:PublicFlowLayout(intalign,inthgap,intvgap);importjavax.swing.*;importjava.awt.*;publicclassMyclassextendsJFrame{ publicstaticvoidmain(String[]args){ JFrameframe=newJFrame("倉(cāng)庫(kù)管理系統(tǒng)"); frame.setSize(600,400); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(newFlowLayout(FlowLayout.CENTER,50,150)); frame.setVisible(true); JButtonmybutton1=newJButton("輸入"); JButtonmybutton2=newJButton("查詢(xún)"); JButtonmybutton3=newJButton("修改"); frame.add(mybutton1); frame.add(mybutton2); frame.add(mybutton3); }}1.FlowLayout流式布局FlowLayout類(lèi)的構(gòu)造函數(shù):FlowLayout():使用居中方式構(gòu)造流式布局,并且組件間默認(rèn)的水平和垂直間隔是5FlowLayout(intalign):使用給定的對(duì)齊方式構(gòu)造流式布局,并且組件間默認(rèn)的水平和垂直間隔是5FlowLayout(intalign,inthgap,intvgap):使用給定的對(duì)齊方式構(gòu)造流式布局,并且指定組件間垂直和水平間隔FlowLayout類(lèi)的常用函數(shù):intgetAlignment():獲得對(duì)齊方式voidsetAlignment(intalign):設(shè)置對(duì)齊方式intgetHgap():獲得組件間的水平間隔voidsetHgap(intvgap):設(shè)置組件間的水平間隔intgetVgap():獲得組件間的垂直間隔voidsetVgap(intvgap):設(shè)置組件間的垂直間隔voidremoveLayout(Componentcomp):從布局中移除指定的組件【例9-5】FlowLayout流式布局管理器舉例。import
javax.swing.*;import
java.awt.*;public
class
exa9_5extendsJFrame
{
public
static
void
main(String
[]
args)
{
JFrame
f=new
JFrame("Hello!");
f.setLocation(10,100);
f.setSize(600,400);
f.getContentPane().setLayout(new
FlowLayout());
JButton
jb1=new
JButton("Click
1");
JButton
jb2=new
JButton("Click
2");
JButton
jb3=new
JButton("Click
3");
f.getContentPane().add(jb1);
f.getContentPane().add(jb2);
f.getContentPane().add(jb3);
f.setVisible(true);
}
}【程序分析】(1)改變窗口的大小,那么組件的排列方式也會(huì)跟著變化。(2)組件的順序和組件的尺寸是確定的,不隨窗口而改變。(3)當(dāng)然,流式布局管理器類(lèi)也可以定義很多布局屬性,從而進(jìn)行必要的一些樣式調(diào)整,如:將上例的A行改成f.getContentPane().setLayout(new
FlowLayout(1,10,100))。BorderLayout邊界布局Window、Frame、Dialog的默認(rèn)布局為邊界布局。這種布局將容器分成5個(gè)區(qū)域:圖9-9BorderLayout邊界布局圖在使用BorderLayout布局的時(shí)候,如果容器的大小發(fā)生變化,其變化規(guī)律為:組件的相對(duì)位置不變,大小發(fā)生變化。例如容器變高了,則North、South區(qū)域不變,West、Center、East區(qū)域變高;如果容器變寬了,West、East區(qū)域不變,North、Center、South區(qū)域變寬。GridLayout網(wǎng)格布局GridLayout的布局管理格式是將版面分割成行數(shù)(rows)×列數(shù)(columns)的網(wǎng)格狀版面。這樣各個(gè)組件就可以按行列放置到每個(gè)網(wǎng)格中,每個(gè)組件的大小一樣。在向GridLayout添加組件時(shí),其順序是從網(wǎng)格的左上角開(kāi)始,從左向右排列,直到排滿(mǎn)一行,再?gòu)南乱恍虚_(kāi)始從左向右依次排列。改變窗口的大小,組件的排列方式保持不變,組件之間的行列間距保持不變。所有組件的寬度和高度相同,組件的大小會(huì)隨窗口的尺寸而相應(yīng)改變
。CardLayout卡片布局CardLayout布局好像是將各個(gè)組件作為卡片排放到一個(gè)“卡片盒”中,一次只能顯示一個(gè)卡片的內(nèi)容,即只有最上面的卡片可見(jiàn)。字體與顏色的使用Font字體類(lèi)的使用Font類(lèi)的構(gòu)造函數(shù)如下:publicFont(Stringname,intstye,intsize);其中:name是字體的名稱(chēng),style是字體的風(fēng)格,size是字體的大小。style的取值為Font.BOLD—粗體,Font.ITALIC—斜體,Font.PLAIN—無(wú)格式,Font.ITALIC+Font.BOLD—粗斜體四者之一。Color顏色類(lèi)的使用要為字體設(shè)置顏色可以使用Color類(lèi)。每個(gè)Color對(duì)象代表一種顏色,使用方法有兩種:(1)直接使用Color類(lèi)中已提供的顏色常量,如Color.black,Color.BLUE,Color.green,Color.yellow等.(2)也可以通過(guò)調(diào)配三原色——紅、綠、藍(lán)三色的比例來(lái)創(chuàng)建自己想要的顏色,如RGB。在RGB中,通過(guò)設(shè)定紅黃藍(lán)三種顏色的取值來(lái)獲得自己想要的顏色,三種顏色的取值范圍都是在0-255之間??梢允褂孟率龇椒▌?chuàng)建color對(duì)象:publicColor(intr,intg,intb);//其中r,g,b指定一個(gè)顏色的紅、綠、藍(lán)成分。Colorcolor=newColor(128,100,100);JButtonmybutton=newJButton();mybutton.setBackground(color);mybutton.setForeground(newColor(100,1,1));按鈕按鈕是圖形界面設(shè)計(jì)中最常見(jiàn)的一個(gè)組件,按鈕常用于執(zhí)行某種動(dòng)作,用戶(hù)可通過(guò)按鈕來(lái)觸發(fā)一個(gè)事件。按鈕JButton類(lèi)是AbstractButton類(lèi)(javax.swing包)的子類(lèi),按鈕是JButton類(lèi)的對(duì)象。
例9-11設(shè)計(jì)按鈕舉例
importjavax.swing.*;importjava.awt.*;publicclassMyclass{publicstaticvoidmain(Stringargs[]){JFramef=newJFrame("HELLO");f.setLocation(10,100);f.setSize(600,400);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.getContentPane().setLayout(newFlowLayout(FlowLayout.CENTER,50,100));JButtonja=newJButton("OK");JButtonjb=newJButton(newImageIcon("logo.gif"));JButtonjc=newJButton("Javalogo",newImageIcon("logo.gif"));f.getContentPane().add(ja);f.getContentPane().add(jb);f.getContentPane().add(jc);f.setVisible(true);}}文本框、文本區(qū)和標(biāo)簽1.文本框(JTextField)文本框是一種接收用戶(hù)鍵盤(pán)輸入和修改文本的組件(JTextField),可以處理單行文本輸入。文本框JTextField的構(gòu)造方法:JTextField():創(chuàng)建空白文本的文本框JTextField(intcolumns):創(chuàng)建指定寬度的空白文本域JTextField(Stringtext):創(chuàng)建指定文本的文本框JTextField(Stringtext,intcolumns):指定寬度并初始化文本例9-12文本框應(yīng)用舉例。
importjavax.swing.*;importjava.awt.*;publicclassMyclassextendsJFrame{publicstaticvoidmain(Stringargs[]){JFramef=newJFrame("JTextField小例子");f.setLocation(10,100);f.setSize(600,400);f.getContentPane().setLayout(newFlowLayout(FlowLayout.CENTER,50,100));JTextFieldtf=newJTextField("請(qǐng)輸入");tf.setColumns(10);//設(shè)置顯示的列數(shù)f.getContentPane().add(tf);JPasswordFieldpf=newJPasswordField("France");pf.setColumns(10);f.getContentPane().add(pf);f.setVisible(true);f.pack();//使窗體自動(dòng)調(diào)整大小,以正好顯示一個(gè)文本框}}2.文本區(qū)(JTextArea)文本區(qū)是可以完成多行輸入的可編輯文本框(JTextArea)。文本區(qū)JTextArea的構(gòu)造方法:JTextArea():創(chuàng)建一個(gè)新的文本區(qū)組件JTextArea(introws,intcolumns):創(chuàng)建指定行數(shù)r列數(shù)cJTextArea(Stringc):創(chuàng)建指定初始化文本JTextArea(Stringc,introws,intcolumns):創(chuàng)建指定初始化文本及文本的行數(shù)和列數(shù)
常用設(shè)置方法:publicvoidsetLineWrap(booleanwrap):設(shè)置是否自動(dòng)換行publicvoidsetRows(introws):設(shè)置行數(shù)publicvoidsetColumns(intcolumns):設(shè)置列數(shù)publicvoidappend(Stringc):將指定文本追加到該組件結(jié)尾publicvoidinsert(Stringc,inti):將指定文本插入文本區(qū)的指定行publicvoidsetWrapStyleWord(Booleanb):設(shè)置換行方式3.標(biāo)簽(JLabel)用來(lái)顯示文字、圖標(biāo),還可以文字與圖標(biāo)同時(shí)顯示。標(biāo)簽JLabel的構(gòu)造方法:JLabel():創(chuàng)建一個(gè)空標(biāo)簽JLabel(Stringc):創(chuàng)建指定文本的標(biāo)簽JLabel(Stringc,Inti):創(chuàng)建指定文本的標(biāo)簽,并且指定對(duì)齊方式(取值為L(zhǎng)EFT、CENTER、RIGHT)JLabel(Stringc,Iconimage,Inti):創(chuàng)建指定文本、圖標(biāo)和對(duì)齊方式的標(biāo)簽標(biāo)簽常用設(shè)置方法:設(shè)置標(biāo)簽顯示文本:publicvoidsetText(Stringc)取得標(biāo)簽顯示文本:publicStringgetText()字體設(shè)置:publicvoidsetFont(Fontf)前景色設(shè)置:publicvoidsetForeground(Colorc)例9-13標(biāo)簽和文本區(qū)應(yīng)用舉例。
importjavax.swing.*;importjava.awt.*;publicclassMyclassextendsJFrame{publicstaticvoidmain(Stringargs[]){JFramef=newJFrame("標(biāo)簽和文本區(qū)");f.setLocation(10,100);f.setSize(600,400);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.getContentPane().setLayout(newFlowLayout());ImageIconii=newImageIcon("logo.gif");JLabelj1=newJLabel("帶圖標(biāo)的標(biāo)簽",ii,JLabel.CENTER);f.getContentPane().add(j1);JTextAreajta=newJTextArea("本學(xué)期課程",5,10);jta.setLineWrap(true);jta.append("\n計(jì)算機(jī)基礎(chǔ)\njava程序設(shè)計(jì)\n數(shù)據(jù)結(jié)構(gòu)");f.getContentPane().add(jta);f.pack();f.setVisible(true);}}事件處理模式和java.awt.event包
設(shè)計(jì)圖形用戶(hù)界面的目的是為了方便用戶(hù)與計(jì)算機(jī)進(jìn)行交流,比如當(dāng)用戶(hù)單擊命令按鈕時(shí),希望系統(tǒng)能完成一個(gè)動(dòng)作,實(shí)現(xiàn)某種功能,這些交互的功能是由后臺(tái)的事件處理接口來(lái)完成的,java.awt.event包就提供處理由AWT組件所激發(fā)的各類(lèi)事件的接口和類(lèi)。
事件處理機(jī)制包含3部分事件源:圖形用戶(hù)界面上可能發(fā)生事件的每個(gè)組件稱(chēng)為事件源。當(dāng)用戶(hù)與GUI組件交互時(shí),這些組件就會(huì)產(chǎn)生事件。例如,單擊按鈕、關(guān)閉窗口、移動(dòng)鼠標(biāo)等,這些都是事件。事件處理機(jī)制包含3部分需要一個(gè)對(duì)象對(duì)事件源進(jìn)行監(jiān)聽(tīng),以便對(duì)發(fā)生的事件做出處理。事件監(jiān)聽(tīng)器:它是某種監(jiān)聽(tīng)器類(lèi)的對(duì)象。當(dāng)事件發(fā)生時(shí),事件監(jiān)聽(tīng)器是被通知的對(duì)象。為此,它必須向事件源注冊(cè),以便接收發(fā)生事件的通知。事件監(jiān)聽(tīng)器還必須實(shí)現(xiàn)一些方法,用來(lái)接收和處理通知的事件。接收和處理事件的方法分別在java.awt.event中的一系列接口中定義。處理事件的接口為了讓監(jiān)聽(tīng)器這個(gè)對(duì)象能對(duì)事件源發(fā)生的事件進(jìn)行處理,創(chuàng)建該監(jiān)聽(tīng)器對(duì)象的類(lèi)必須聲明實(shí)現(xiàn)相應(yīng)的接口,即必須在類(lèi)體中給出該接口中所有方法的方法體,那么當(dāng)事件源發(fā)生事件時(shí),監(jiān)聽(tīng)器自動(dòng)調(diào)用類(lèi)中實(shí)現(xiàn)的接口的方法,去處理事件。事件處理機(jī)制包含3部分importjavax.swing.*;importjava.awt.event.*;importjava.awt.*;publicclassSimpleEventDemoextendsJFrame{publicSimpleEventDemo(){JButtonjbtOK=newJButton("進(jìn)入");setLayout(newFlowLayout(FlowLayout.CENTER,50,100));add(jbtOK);ActionListenerlistener=newOKListener();jbtOK.addActionListener(listener);}publicstaticvoidmain(String[]args){JFrameframe=newSimpleEventDemo();frame.setTitle("主窗口");frame.setLocation(100,100);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(400,300);frame.setVisible(true);}}classSimpleLabelextendsJFrame{publicSimpleLabel(){JFrameframe=newJFrame("測(cè)試觸發(fā)事件");Labellab1=newLabel("輸入姓名");TextFieldtext1=newTextField(10);lab1.setBackground(Color.green);Labellab2=newLabel("輸入年齡");lab2.setBackground(Color.green);TextFieldtext2=newTextField(10);frame.setLayout(newFlowLayout());setLayout(newFlowLayout(FlowLayout.CENTER,50,100));frame.add(lab1);frame.add(text1);frame.add(lab2);frame.add(text2);frame.setLocation(100,100);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(400,300);frame.setVisible(true);}}classOKListenerimplementsActionListener{public
voidactionPerformed(ActionEvente){SimpleLabelsl=newSimpleLabel();}}每個(gè)事件源可以發(fā)出若干種不同類(lèi)型的事件。為了對(duì)每種事件源發(fā)出事件的監(jiān)聽(tīng),對(duì)每個(gè)事件源要指定事件監(jiān)聽(tīng)者。如果發(fā)生了某種事件時(shí),監(jiān)聽(tīng)者將接收到發(fā)生事件的通知,調(diào)用其中相應(yīng)的方法對(duì)發(fā)生的事件進(jìn)行處理。使用授權(quán)處理模式進(jìn)行事件處理主要有如圖9-17所示幾步::事件源(如按鈕)事件監(jiān)聽(tīng)器A事件監(jiān)聽(tīng)器B事件監(jiān)聽(tīng)器X事件處理者1事件處理者2事件處理者N①②③④圖9-17事件處理原理復(fù)選框與單選按鈕復(fù)選框和單選按鈕都是從JToggleButon類(lèi)繼承而來(lái)的,而JToggleButon類(lèi)和按鈕類(lèi)又是AbstractButton的子類(lèi),所以按鈕、單選按鈕和復(fù)選框在使用上有很多相似之處。如它們都有選中和未選中狀態(tài),可以通過(guò)isSelected()方法的返回值獲得,true表示處于選中狀態(tài),false表示未選中狀態(tài)。1.復(fù)選框復(fù)選框(JCheckBox)是用來(lái)做多項(xiàng)選擇的,一般都與文本標(biāo)簽一起出現(xiàn),當(dāng)選中時(shí)包含一個(gè)復(fù)選標(biāo)記,否則沒(méi)有。2、單選按紐(JRadioButton)是在選中的時(shí)候包含一個(gè)點(diǎn)的圓圈,否則是空的。單選按鈕必須成組出現(xiàn),而且一組中只能有一個(gè)被選中,因此需要一個(gè)專(zhuān)門(mén)的類(lèi)ButtonGroup來(lái)管理。添加到ButtonGroup的多個(gè)單選按鈕中,如果有一個(gè)被選中,同組中的其他單選按鈕都會(huì)自動(dòng)改變其狀態(tài)為未選擇狀態(tài)。列表框和組合框1.列表框(JList)列表框(List)在可供選擇的選項(xiàng)很多時(shí),可向用戶(hù)呈現(xiàn)一系列的選項(xiàng)來(lái)供他們選擇,用戶(hù)可以從中選擇一個(gè)或多個(gè)條目,既可顯示字符串,也可顯示圖標(biāo)。2.組合框(JComboBox)組合框與列表框相似,不同的是下拉列表框只能從列表中選擇一個(gè)選項(xiàng),當(dāng)用戶(hù)單擊旁邊下拉箭頭按鈕時(shí),選項(xiàng)列表才打開(kāi),可以較少的占用圖形化用戶(hù)界面的空間。組合框完成了下拉列表的功能之外,還可以輸入?yún)?shù)。當(dāng)JComboBox的setEditable()方法設(shè)置為true的時(shí)候,用戶(hù)可以在文本域中輸入文本。菜單
在GUI界面中,菜單一般位于窗口上方標(biāo)題欄下面的位置,它是一個(gè)圖形用戶(hù)界面不可缺少的組成部分。一個(gè)菜單由三部分組成:JMenuBar——菜單欄,在其中可以加入菜單(JMenu)JMenu——菜單,其中可加入菜單項(xiàng)(JMenuItem)和菜單(JMenu)JMenuItem——菜單項(xiàng),直接指向一個(gè)具體的操作菜單、菜單項(xiàng)和菜單欄的構(gòu)造方法:菜單欄:JMenuBar()菜單:JMenu(Strings)菜單項(xiàng):JMenuItem(Strings)1.菜單欄(JMenuBar)菜單只能添加到Frame中,一個(gè)菜單條由多個(gè)菜單(JMenu)組成,每個(gè)JMenu在JMenubar中都表示為字符串,如:JFramef=newJFrame("JMenuBar");JMenuBarmb=newJMenuBar();f.setJMenuBar(mb);//setJMenuBar()將MenuBar的對(duì)象添加到Frame中。
在一個(gè)時(shí)刻,一個(gè)框架中可以顯示一個(gè)菜單條,菜單條不支持監(jiān)聽(tīng)者。2.菜單(JMenu)提供了一個(gè)基本的下拉式菜單,它可以加入到一個(gè)菜單欄或者另一個(gè)菜單中。它在菜單欄下以文本字符串形式顯示,而在用戶(hù)單擊它時(shí),則以彈出式菜單顯示。JMenuBarmb=newJMenuBar();Jmenum1=newJmenu(“File”);Jmenum2=newJmenu(“Edit”);Jmenum3=newJmenu(“Help”);f.setMenuBar(mb);mb.add(m1);mb.add(m2);mb.setHelpMenu(m3);3.菜單項(xiàng)(JMenuItem)菜單項(xiàng)組件通常被加入到菜單中,以構(gòu)成一個(gè)完整的菜單,以文本字符串形式顯示。JMenuItem的外觀可以修改,如字體、顏色、背景、邊框等。除字符串外,在JMenuItem中還可以添加圖標(biāo)。通常我們將一個(gè)ActionListener加入到一個(gè)菜單項(xiàng)對(duì)象中,以提供菜單的行為。JMenu=m1=newJMenu(“File”);JMenuItemmi1=newJMenuItem(“New”);JMenuItemmi2=newJMenuItem(“Load”);JMenuItemmi3=newJMenuItem(“Save”);mi1.addActionListener(this);m1.add(mi1);mi2.addActionListener(this);m1.add(mi2);mi3.addActionListener(this);m1.add(mi3);菜單創(chuàng)建要分三個(gè)步驟:1)創(chuàng)建一個(gè)MenuBar的實(shí)例,用Frame類(lèi)的setMenuBar()方法添加到Frame中;2)創(chuàng)建Menu實(shí)例,并用add()方法依次添加到MenuBar中;3)創(chuàng)建MenuItem實(shí)例,給菜單項(xiàng)注冊(cè)ActionListener,并用add()方法把菜單項(xiàng)加到相應(yīng)的Menu實(shí)例對(duì)象中。mportjava.awt.*;importjavax.swing.*;importjava.awt.event.*;publicclassExamextendsJFrameimplementsActionListener,ItemListener{TextFieldtext;publicExam(){super("我的菜單窗口");setSize(300,200);super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicvoidinit(){MenuBarmyB=newMenuBar();setMenuBar(myB);Menum1=newMenu("文件");m1.add(newMenuItem("打開(kāi)"));MenuItemm11=newMenuItem("保存");m1.add(m11);m1.add(newMenuItem("打印"));m1.add(newMenuItem("退出"));m1.addActionListener(this);myB.add(m1);}publicstaticvoidmain(String[]args){ExammyMenu=newExam();myMenu.init();myMenu.setVisible(true);}publicvoiditemStateChanged(ItemEvente){text.setText("狀態(tài)改變");}publicvoidactionPerformed(ActionEvente){text.setText(e.getActionCommand());if(e.getActionCommand()=="退出")System.exit(0);}}GUI設(shè)計(jì)步驟1)首先設(shè)計(jì)并創(chuàng)建一個(gè)頂層容器,例如一個(gè)Frame。2)確定容器要采用的布局管理器,并把該類(lèi)型的布局管理器設(shè)置到容器中。3)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高空施工安全責(zé)任書(shū)范本(二零二五年度)3篇
- 2025年度個(gè)人意外傷害保險(xiǎn)合同范本(二零二五版)4篇
- 二零二五版美甲店員工離職交接合同4篇
- 建筑資質(zhì)維護(hù)勞務(wù)協(xié)議書(shū)(2篇)
- 工廠(chǎng)用臨時(shí)工合同范本(2篇)
- 物業(yè)公司2025年度學(xué)校門(mén)衛(wèi)保養(yǎng)維護(hù)合同3篇
- 鋁合金百葉施工方案
- 臨戰(zhàn)水平封堵施工方案
- 二零二五版白灰礦產(chǎn)資源開(kāi)采合同協(xié)議書(shū)3篇
- 2024年浙江省無(wú)人機(jī)應(yīng)用技能競(jìng)賽備考試題庫(kù)(含各題型)
- CT設(shè)備維保服務(wù)售后服務(wù)方案
- 重癥血液凈化血管通路的建立與應(yīng)用中國(guó)專(zhuān)家共識(shí)(2023版)
- 兒科課件:急性細(xì)菌性腦膜炎
- 柜類(lèi)家具結(jié)構(gòu)設(shè)計(jì)課件
- 陶瓷瓷磚企業(yè)(陶瓷廠(chǎng))全套安全生產(chǎn)操作規(guī)程
- 煤炭運(yùn)輸安全保障措施提升運(yùn)輸安全保障措施
- JTGT-3833-2018-公路工程機(jī)械臺(tái)班費(fèi)用定額
- 保安巡邏線(xiàn)路圖
- (完整版)聚乙烯課件
- 建筑垃圾資源化綜合利用項(xiàng)目可行性實(shí)施方案
- 大華基線(xiàn)解碼器解碼上墻的操作
評(píng)論
0/150
提交評(píng)論