版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第9章
圖形用戶界面JAVA語言程序設(shè)計(jì)1目錄9.1Applet概述9.2Applet應(yīng)用程序接口9.3繪圖9.4Swing基礎(chǔ)9.5Swing的特點(diǎn)和概念9.6Swing組件9.7其它Swing特性9.8本章小結(jié)(說明:本章部分例題出自java_tutorial_sun)29.1Applet概述JavaApplet一種嵌入HTML文檔中的Java程序與Application相比,Applet具有明顯的優(yōu)點(diǎn)web瀏覽器提供了運(yùn)行Applet所需要的許多功能Applet是在運(yùn)行時(shí)通過網(wǎng)絡(luò)從服務(wù)器端下載的,因而便于軟件的發(fā)布和及時(shí)更新Applet也有其局限性,不能在客戶機(jī)上讀寫當(dāng)?shù)匚募膊荒苓B接除它所在的服務(wù)器以外的其它機(jī)器3在瀏覽器中加載一個(gè)Applet,功能是顯示一個(gè)字符串“ThisisaJavaApplet!”importjava.awt.Graphics;importjavax.swing.JApplet;publicclassEx9_1extendsJApplet{publicvoidpaint(Graphicsg){//重載JApplet類的paint方法
//參數(shù)是Graphics類的對(duì)象,是由瀏覽器傳遞過來的
super.paint(g);//調(diào)用其超類JApplet類的paint方法
g.drawString("ThisisaJavaApplet!",25,25);}}9.1Applet概述(續(xù))
——例9_1Applet概述4在NetBeansIDE中運(yùn)行9.1Applet概述(續(xù))
——例9_1運(yùn)行結(jié)果Applet概述5編譯ex9_1.java產(chǎn)生字節(jié)碼文件ex9_1.class。接下來就需要編寫一個(gè)HTML文件ex9_1.html來嵌入ex9_1.class<html><appletcode="Ex9_1.class"width="300"height="45"></applet></html>將ex9_1.html文件和Ex9_1.class文件放在同一個(gè)目錄下?,F(xiàn)在,在瀏覽器中打開這個(gè)HTML文件,當(dāng)瀏覽器遇到Applet標(biāo)記時(shí),就會(huì)自動(dòng)載入指定的class文件,就會(huì)實(shí)現(xiàn)在屏幕上繪制一串字符的效果9.1Applet概述(續(xù))
——例9_1運(yùn)行結(jié)果Applet概述69.2Applet應(yīng)用程序接口JApplet類一個(gè)applet程序需要繼承javax.swing包中的JApplet類,也可以繼承老的AWT組件中的Applet類,JApplet類屬于新的Swing組件提供了applet在瀏覽器中運(yùn)行需要具備的特定方法瀏覽器載入時(shí),要依次運(yùn)行init、start、paint方法離開瀏覽器頁面時(shí),執(zhí)行stop退出瀏覽器時(shí),執(zhí)行destroy提供了所有這些方法的默認(rèn)實(shí)現(xiàn),所以我們?cè)诰帉懽约旱腶pplet時(shí),就可以不必寫出全部方法,只要繼承這個(gè)JApplet,然后重寫特定的方法來增加特殊功能79.2Applet應(yīng)用程序接口方法調(diào)用時(shí)機(jī)和用途publicvoidinit()當(dāng)瀏覽器(即Applet容器)載入某個(gè)Applet時(shí),容器會(huì)自動(dòng)創(chuàng)建這個(gè)Applet類的一個(gè)實(shí)例,并調(diào)用它的init方法Applet應(yīng)用程序接口8publicvoidstart()init方法執(zhí)行結(jié)束之后,自動(dòng)調(diào)用這個(gè)方法。另外,當(dāng)瀏覽器用戶在訪問另一個(gè)網(wǎng)址之后重新返回applet所在的HTML頁時(shí),將再次調(diào)用start方法publicvoidpaint(Graphicsg)start方法啟動(dòng)后調(diào)用此方法,另外每次需要重繪applet時(shí)也將調(diào)用該方法。程序通常不直接調(diào)用paintpublicvoidrepaint()在響應(yīng)用戶和Applet的交互時(shí)經(jīng)常要用到。通常只是調(diào)用,而不重寫這個(gè)方法。對(duì)于輕量級(jí)組件,它調(diào)用組件的paint方法,對(duì)重量級(jí)組件它調(diào)用組件的update方法,由update調(diào)用paintpublicvoidstop()用戶離開Applet所在的HTML頁時(shí)調(diào)用該方法,它執(zhí)行掛起Applet所需的所有任務(wù),例如停止動(dòng)畫和線程publicvoiddestroy()用戶關(guān)閉瀏覽器窗口,Applet將從內(nèi)存中移走的時(shí)候調(diào)用該方法9.2Applet應(yīng)用程序接口(續(xù))Applet應(yīng)用程序接口9importjavax.swing.*;.importjava.awt.*;publicclassHelloSwingAppletextendsJApplet{publicvoidinit(){
JLabellabel=newJLabel("YouaresuccessfullyrunningaSwingapplet!");
label.setHorizontalAlignment(JLabel.CENTER);
label.setBorder(BorderFactory.createMatteBorder(1,1,2,2,Color.black));
getContentPane().add(label,BorderLayout.CENTER);}}9.2Applet應(yīng)用程序接口(續(xù)) ——HelloSwingApplet.javaApplet應(yīng)用程序接口109.3繪圖圖形環(huán)境和圖形對(duì)象顏色和字體使用Graphics類繪圖使用Graphics2D類繪圖119.3.1圖形環(huán)境和圖形對(duì)象坐標(biāo)GUI組件的左上角坐標(biāo)默認(rèn)為(0,0)從左上角到右下角,水平坐標(biāo)x和垂直坐標(biāo)y增加。坐標(biāo)的單位是象素Graphics對(duì)象Graphics對(duì)象是專門管理圖形環(huán)境的。Graphics類是一個(gè)抽象類設(shè)計(jì)一個(gè)抽象類Graphics可以給程序員提供一個(gè)與平臺(tái)無關(guān)的繪圖接口,因而程序員就可以以獨(dú)立于平臺(tái)的方式來使用圖形。在各個(gè)平臺(tái)上實(shí)現(xiàn)的Java系統(tǒng)將創(chuàng)建Graphics類的一個(gè)子類,來實(shí)現(xiàn)繪圖功能,但是這個(gè)子類對(duì)程序員是透明的,也就是說我們只能看得到Graphics類,卻不必關(guān)心其實(shí)現(xiàn)在執(zhí)行paint方法時(shí),系統(tǒng)會(huì)傳遞一個(gè)指向特定平臺(tái)的Graphics子類的圖形對(duì)象g繪圖12
9.3.2顏色和字體Java中有關(guān)顏色的類是Color類,它在java.awt包中,這個(gè)類聲明了用于操作Java程序中顏色的方法和常量名稱描述publicfinalstaticColorGREEN常量綠色publicfinalstaticColorRED常量紅色publicColor(int
r,int
g,intb)通過指定紅、藍(lán)、綠顏色分量(0~255),創(chuàng)建一種顏色publicint
getRed()返回某顏色對(duì)象的紅色分量值(0~255)Graphics:publicvoidsetColor(Colorc)Graphics類的方法,用于設(shè)置組件的顏色Graphics:publicColorgetColor()Graphics類的方法,用于獲得組件的顏色繪圖13
9.3.2顏色和字體Font類——有關(guān)字體控制,在java.awt包中名稱描述publicfinalstaticintPLAIN一個(gè)代表普通字體風(fēng)格的常量publicfinalstaticintBOLD一個(gè)代表黑體字體風(fēng)格的常量publicfinalstaticintITALIC一個(gè)代表斜體字體風(fēng)格的常量publicFont(String
name,int
style,intsize)利用指定的字體、風(fēng)格和大小創(chuàng)建一個(gè)Font對(duì)象publicint
getStyle()返回一個(gè)表示當(dāng)前字體風(fēng)格的整數(shù)值publicBooleanisPlain()測試一個(gè)字體是否是普通字體風(fēng)格Graphics:publicFontgetFont()獲得當(dāng)前字體Graphics:publicvoidsetFont(Fontf)設(shè)置當(dāng)前字體為f指定的字體、風(fēng)格和大小繪圖149.3.3使用Graphics類繪圖Graphics類其對(duì)象可以繪制文本、線條、矩形、多邊形、橢圓、弧等多種圖形名稱描述publicvoiddrawString(String
str,intx,inty)繪制字符串,左上角的坐標(biāo)是(x,y)publicvoiddrawLine(intx1,inty1,intx2,inty2)在(x1,y1)與(x2,y2)兩點(diǎn)之間繪制一條線段publicvoiddrawRect(intx,inty,intwidth,intheight)用指定的width和height繪制一個(gè)矩形,該矩形的左上角坐標(biāo)為(x,y)publicvoidfillRect(intx,inty,intwidth,intheight)用指定的width和height繪制一個(gè)實(shí)心矩形,該矩形的左上角坐標(biāo)為(x,y)繪圖15publicvoidclearRect(intx,inty,intwidth,intheight)用指定的width和height,以當(dāng)前背景色繪制一個(gè)實(shí)心矩形。該矩形的左上角坐標(biāo)為(x,y)publicvoiddrawRoundRect(intx,inty,intwidth,intheight,int
arcWidth,int
arcHeight)用指定的width和height繪制一個(gè)圓角矩形,圓角是一個(gè)橢圓的1/4弧,此橢圓由arcWidth、arcHeight確定兩軸長。其外切矩形左上角坐標(biāo)為(x,y)publicvoidfillRoundRect(intx,inty,intwidth,intheight,int
arcWidth,int
arcHeight)用當(dāng)前色繪制實(shí)心圓角矩形,各參數(shù)含義同drawRoundRect。publicvoiddraw3DRect(intx,inty,intwidth,intheight,booleanb)用指定的width和height繪制三維矩形,該矩形左上角坐標(biāo)是(x,y),b為true時(shí),該矩形為突出的,b為false時(shí),該矩形為凹陷的。publicvoidfill3DRect(intx,inty,intwidth,intheight,booleanb)用當(dāng)前色繪制實(shí)心三維矩形,各參數(shù)含義同draw3DRect。16publicvoiddrawPolygon(int[]
xPoints,int[]yPoints,int
nPoints)用xPoints,yPoints數(shù)組指定的點(diǎn)的坐標(biāo)依次相連繪制多邊形,共選用前nPoints個(gè)點(diǎn)。publicvoidfillPolygon(int[]xPoints,int[]yPoints,int
nPoints)繪制實(shí)心多邊形,各參數(shù)含義同drawPolygon。publicvoiddrawOval(intx,inty,intwidth,intheight)用指定的width和height,以當(dāng)前色繪制一個(gè)橢圓,外切矩形的左上角坐標(biāo)是(x,y)。publicvoidfillOval(intx,inty,intwidth,intheight)繪制實(shí)心橢圓,各參數(shù)含義同drawOval。publicvoiddrawArc(intx,int
y,intwidth,intheight,int
startAngle,int
arcAngle)繪制指定width和height的橢圓,外切矩形左上角坐標(biāo)是(x,y),但只截取從startAngle開始,并掃過arcAngle度數(shù)的弧線。publicvoidfillArc(intx,int
y,intwidth,intheight,int
startAngle,int
arcAngle)繪制一條實(shí)心弧線(即扇形),各參數(shù)含義同drawArc17用各種顏色繪制文字及各種圖形importjava.awt.*;importjavax.swing.*;publicclassEx9_2extendsJFrame{publicEx9_2(){super(“演示字體、顏色、繪圖”);//調(diào)用基類構(gòu)造方法
setSize(480,250);//設(shè)置窗口大小
setVisible(true);//顯示窗口}publicvoidpaint(Graphicsg){
super.paint(g);//callsuperclass'spaintmethod
g.setFont(newFont("SansSerif",Font.BOLD,12));
g.setColor(Color.blue);//設(shè)置顏色
g.drawString("字體ScanSerif,粗體,12號(hào),藍(lán)色",20,50);9.3.3使用Graphics類繪圖(續(xù)) ——Ex9_2.java繪圖18
g.setFont(newFont("Serif",Font.ITALIC,14));
g.setColor(newColor(255,0,0));
g.drawString("字體Serif,斜體,14號(hào),紅色",250,50);
g.drawLine(20,60,460,60);//繪制直線
g.setColor(Color.green);g.drawRect(20,70,100,50);//繪制空心矩形
g.fillRect(130,70,100,50);//繪制實(shí)心矩形
g.setColor(Color.yellow);g.drawRoundRect(240,70,100,50,50,50);//繪制空心圓角矩形
g.fillRoundRect(350,70,100,50,50,50);//繪制實(shí)心圓角矩形
g.setColor(Color.cyan);g.draw3DRect(20,130,100,50,true);//繪制突起效果空心矩形
g.fill3DRect(130,130,100,50,false);//繪制凹陷效果實(shí)心矩形9.3.3使用Graphics類繪圖(續(xù)) ——Ex9_2.java繪圖19
g.setColor(Color.pink);g.drawOval(240,130,100,50);//繪制空心橢圓
g.fillOval(350,130,100,50);//繪制實(shí)心橢圓
g.setColor(newColor(0,120,20));g.drawArc(20,190,100,50,0,90);//繪制一段圓弧
g.fillArc(130,190,100,50,0,90);//繪制扇形
g.setColor(Color.black);
int
xValues[]={250,280,290,300,330,310,320,290,260,270};
int
yValues[]={210,210,190,210,210,220,230,220,230,220};g.drawPolygon(xValues,yValues,10);//繪制空心多邊形
intxValues2[]={360,390,400,410,440,420,430,400,370,380};g.fillPolygon(xValues2,yValues,10);//繪制實(shí)心多邊形
}
9.3.3使用Graphics類繪圖(續(xù)) ——Ex9_2.java繪圖20publicstaticvoidmain(Stringargs[]){
JFrame.setDefaultLookAndFeelDecorated(true);//設(shè)置窗口的外觀感覺為Java默認(rèn)
Ex9_2application=newEx9_2();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE
);}}運(yùn)行結(jié)果9.3.3使用Graphics類繪圖(續(xù)) ——Ex9_2.java運(yùn)行結(jié)果繪圖219.3.4使用Graphics2D類繪圖Java2DAPI提供了高級(jí)的二維圖形功能分布在java.awt、java.awt.image、java.awt.color、java.awt.font、java.awt.geom、java.awt.print和java.awt.image.renderable包中它能輕松使你完成以下功能:繪制任何寬度的直線用漸變顏色和紋理來填充圖形平移、旋轉(zhuǎn)、伸縮、切變二維圖形,對(duì)圖像進(jìn)行模糊、銳化等操作構(gòu)建重疊的文本和圖形繪圖22Graphics2D類要想使用Java2DAPI,就必須通過一個(gè)該類的對(duì)象是Graphics類的抽象子類事實(shí)上,所有的paint方法用于繪圖操作的對(duì)象實(shí)際上是Graphics2D的一個(gè)子類實(shí)例,該實(shí)例傳遞給paint方法,并被向上轉(zhuǎn)型為Graphics類的實(shí)例。要訪問Graphics2D功能,必須使用如下語句將傳遞給paint方法的Graphics引用強(qiáng)制轉(zhuǎn)換為Graphics2D引用:Graphics2Dg2d=(Graphics2D)g9.3.4使用Graphics2D類繪圖(續(xù))繪圖23實(shí)現(xiàn)例9_1的功能,使用Java2D使文字出現(xiàn)漸變色效果importjava.awt.*;importjavax.swing.*;publicclassEx9_3extendsJApplet{publicvoidpaint(Graphicsg){
super.paint(g);
Graphics2Dg2d=(Graphics2D)g;g2d.setPaint(newGradientPaint(0,0,Color.red,180,45,Color.yellow));g2d.drawString("ThisisaJavaApplet!",25,25);}}9.3.4使用Graphics2D類繪圖(續(xù))
——Ex9_3.java繪圖249.3.4使用Graphics2D類繪圖(續(xù))
——Ex9_3.java運(yùn)行結(jié)果繪圖259.4Swing基礎(chǔ)前面介紹了如何在屏幕上繪制普通的圖形,但如果需要繪制一個(gè)按鈕,并使其可以對(duì)點(diǎn)擊事件作出響應(yīng),就需要使用javaSwing提供的組件其實(shí)前面我們已經(jīng)用到的JFrame、JApplet都是Swing組件,它們分別代表窗口組件和Applet容器組件269.4.1JFC與SwingJFCJavaFoundationClasses(Java基礎(chǔ)類)的縮寫是關(guān)于GUI組件和服務(wù)的完整集合作為J2SE的一個(gè)有機(jī)部分,主要包含5個(gè)部分AWTJava2DAccessibilityDrag&DropSwingSwingJFC的一部分提供按鈕、窗口、表格等所有的組件純Java組件(完全用Java寫的)Swing基礎(chǔ)279.4.2Swing與AWT早期版本的AWT組件在java.awt包里,包括Button、Checkbox、Scrollbar等,都是Component類的子類大部分含有nativecode,所以隨操作系統(tǒng)平臺(tái)的不同會(huì)顯示出不同的樣子,而不能進(jìn)行更改,是重量級(jí)組件(heavyweightcomponents)沒有彈性、缺乏效率Swing基礎(chǔ)28較新的Swing組件其名稱都是在原來AWT組件名稱前加上J,例如JButton、JCheckBox、JScrollbar等,都是JComponent類的子類Java1.2推出,架構(gòu)在AWT之上,是AWT的擴(kuò)展而不是取代完全是由java語言編寫的,其外觀和功能不依賴于任何由宿主平臺(tái)的窗口系統(tǒng)所提供的代碼,是輕量級(jí)組件(lightweightcomponents)可提供更豐富的視覺感受,被越來越多地使用9.4.2Swing與AWTSwing基礎(chǔ)299.4.3在Applet和Application中應(yīng)用Swing
在Applet中應(yīng)用Swing,就是要將Swing組件加載到Applet容器上(通常是JApplet),這通常在init方法中完成在Application中應(yīng)用Swing,也是要將Swing組件加載到這個(gè)Application的頂層容器(通常是JFrame)中Swing基礎(chǔ)30應(yīng)用Swing組件的Appletimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassEx9_4extendsJApplet{publicvoidinit(){ContainercontentPane=getContentPane();
contentPane.setLayout(newGridLayout(2,1));
JButtonbutton=newJButton("Clickme");
finalJLabellabel=newJLabel();
contentPane.add(button);
contentPane.add(label);
button.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){
Stringinformation=JOptionPane.showInputDialog("請(qǐng)輸入一串字符");
label.setText(information);
}
});//創(chuàng)建監(jiān)聽器語句結(jié)束
}//init方法結(jié)束}9.4.3在Applet和Application中應(yīng)用Swing
(續(xù))
——Ex9_4.javaSwing基礎(chǔ)319.4.3在Applet和Application中應(yīng)用Swing
(續(xù))
——Ex9_4.java運(yùn)行結(jié)果Swing基礎(chǔ)32把JApplet換成JFrame,將例9-4的程序改為Applicationimportjavax.swing.*;importjava.awt.event.*;importjava.awt.*;publicclassEx9_5{publicstaticvoidmain(String[]args){
JFramef=newJFrame(“SimpleSwingApplication”);ContainercontentPane=f.getContentPane();
contentPane.setLayout(newGridLayout(2,1));
JButtonbutton=newJButton("Clickme");finalJLabellabel=newJLabel();
contentPane.add(button);//添加按鈕
contentPane.add(label);//添加標(biāo)簽
button.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){
Stringinformation=JOptionPane.showInputDialog("請(qǐng)輸入一串字符");
label.setText(information);}});f.setSize(200,100);//設(shè)置大小
f.show();//顯示
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}9.4.3在Applet和Application中應(yīng)用Swing
(續(xù))
——Ex9_5.javaSwing基礎(chǔ)339.4.3在Applet和Application中應(yīng)用Swing
(續(xù))
——Ex9_5.java運(yùn)行結(jié)果Swing基礎(chǔ)349.5Swing的特點(diǎn)和概念
SwingGUI組件javax.swing包源于AWT(packagejava.awt)的組件包括外觀和感覺外觀以及用戶如何和程序交互輕量級(jí)組件完全用Java寫成,不是用當(dāng)前平臺(tái)的GUI功能某些Swing組件也是重量級(jí)的,外觀和功能受到本地窗口系統(tǒng)的限制,如java.awt.Windows的子類java.applet.Applet的子類359.5.1Swing的組件和容器層次
絕大多數(shù)Swing組件的繼承層次Swing的特點(diǎn)和概念369.5.1Swing的組件和容器層次(續(xù))JComponent類是除了頂層容器以外所有Swing組件的基類,根據(jù)繼承關(guān)系,我們可以在每個(gè)基類中找到大多數(shù)GUI組件的常見操作Component類包含paint、repaint方法,可以在屏幕上繪制組件大多數(shù)GUI組件直接或間接擴(kuò)展ComponentContainer類容納相關(guān)組件包括add方法,用來添加組件包括setLayout方法,這個(gè)方法可用來設(shè)置布局,以幫助Container對(duì)象對(duì)其中的組件進(jìn)行定位和設(shè)置組件大小JComponent
類——多數(shù)Swing組件的超類可抽換的外觀和感覺,即可根據(jù)需求定制外觀和感覺??旖萱I
(通過鍵盤直接訪問GUI組件)一般的事件處理功能Swing的特點(diǎn)和概念37通常將javax.swing包里的Swing組件歸為三個(gè)層次頂層容器中間層容器原子組件9.5.1Swing的組件和容器層次(續(xù))Swing的特點(diǎn)和概念38頂層容器Swing提供三個(gè)頂層容器的類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)上來看,它們分別是從原來AWT組件的Frame、Dialog和Applet類繼承而來每個(gè)使用Swing組件的Java程序都必須至少有一個(gè)頂層容器,別的組件都必須放在這個(gè)頂層容器上才能顯現(xiàn)出來9.5.1Swing的組件和容器層次(續(xù))
——頂層容器Swing的特點(diǎn)和概念39中間層容器其存在的目的僅僅是為了容納別的組件分為兩類一般用途的JPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar特殊用途的JInternalFrameJRootPane可以直接從頂層容器中獲得一個(gè)JRootPane對(duì)象來直接使用,而別的中間容器使用的時(shí)候需要新建一個(gè)對(duì)象9.5.1Swing的組件和容器層次(續(xù))
——中間層容器Swing的特點(diǎn)和概念40原子組件通常是在圖形用戶界面中和用戶進(jìn)行交互的組件基本功能是和用戶交互信息,而不像前兩種組件那樣是用來容納別的組件的根據(jù)功能的不同,可被分為三類顯示不可編輯信息的JLabel、JProgressBar、JToolTip有控制功能、可以用來輸入信息的JButton、JCheckBox、JRadioButton、JComboBox、JList、JMenu、JSlider、JSpinner、JTexComponent等能提供格式化的信息并允許用戶選擇的JColorChooser、JFileChooser、JTable、JTree9.5.1Swing的組件和容器層次(續(xù))
——原子組件Swing的特點(diǎn)和概念41三層容器結(jié)構(gòu)示例importjavax.swing.*;importjava.awt.*;publicclassEx9_6{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.5.1Swing的組件和容器層次(續(xù))
——例9_6Swing的特點(diǎn)和概念42程序說明首先創(chuàng)建一個(gè)JFrame類頂級(jí)容器然后獲得頂級(jí)容器的內(nèi)容面板contentPane,只有通過它才能加入其他組件。然后創(chuàng)建一個(gè)JPanel類的中間容器panel,并設(shè)置邊框以及布局然后創(chuàng)建原子組件Label,button,并將它們添加到中間容器上然后將中間容器通過內(nèi)容面板添加到頂層容器上,并/對(duì)組件進(jìn)行排列9.5.1Swing的組件和容器層次(續(xù))
——例9_6運(yùn)行結(jié)果Swing的特點(diǎn)和概念439.5.1Swing的組件和容器層次(續(xù))
——Swing組件列表Swing的特點(diǎn)和概念449.5.2布局管理如何將下級(jí)組件有秩序地?cái)[在上一級(jí)容器中在程序中具體指定每個(gè)組件的位置使用布局管理器(InterfaceLayoutManager)布局管理器使用方法是通過調(diào)用容器對(duì)象的setLayout方法,并以某種布局管理器對(duì)象為參數(shù),例如:ContainercontentPane=frame.getContentPane();contentPane.setLayout(new
FlowLayout());使用布局管理器可以更容易地進(jìn)行布局,而且當(dāng)改變窗口大小時(shí),它還會(huì)自動(dòng)更新版面來配合窗口的大小,不需要擔(dān)心版面會(huì)因此混亂Swing的特點(diǎn)和概念459.5.2布局管理(續(xù))在Java中有很多實(shí)現(xiàn)LayoutManager接口的類,經(jīng)常用到的有以下幾個(gè)BorderLayoutFlowLayoutGridLayoutCardLayoutGridBagLayoutBoxLayoutSpringLayout上一節(jié)提到的內(nèi)容面板(contentpane)默認(rèn)使用的就是BorderLayout,它可以將組件放置到五個(gè)區(qū)域:東、西、南、北、中Swing的特點(diǎn)和概念46在該例中,引用了SUN公司提供的幾個(gè)的示例程序,演示了布局管理器的使用方法和效果BorderLayoutDemo.java及其運(yùn)行效果BorderLayout以將組件放置到五個(gè)區(qū)域:東、西、南、北、中9.5.2布局管理(續(xù))
——例9_7Swing的特點(diǎn)和概念47FlowLayoutDemo.javaFlowLayout是JPanel默認(rèn)使用的布局管理器,它只是簡單地把組件放在一行,如果容器不是足夠?qū)拋砣菁{所有組件,就會(huì)自動(dòng)開始新的一行9.5.2布局管理(續(xù))
——例9_7Swing的特點(diǎn)和概念48GridLayoutDemo.javaGridLayout將按照其構(gòu)造方法中程序員提供的行數(shù)和列數(shù)將界面分為等大的若干塊,組件被等大地按加載順序放置其中9.5.2布局管理(續(xù))
——例9_7Swing的特點(diǎn)和概念49CardLayoutDemo.javaCardLayout可以實(shí)現(xiàn)在一個(gè)區(qū)域出現(xiàn)不同的組件布局,就像在一套卡片中選取其中的任意一張一樣。它經(jīng)常由一個(gè)復(fù)選框控制這個(gè)區(qū)域顯示哪一組組件,可通過組合框像選擇卡片一樣選擇某一種布局9.5.2布局管理(續(xù))
——例9_7Swing的特點(diǎn)和概念50GridBagLayoutDemo.javaGridBagLayout把組件放置在網(wǎng)格中,這一點(diǎn)類似于GridLayout,但它的優(yōu)點(diǎn)在于不僅能設(shè)置組件擺放的位置,還能設(shè)置該組件占多少行/列。這是一種非常靈活的布局管理器9.5.2布局管理(續(xù))
——例9_7Swing的特點(diǎn)和概念51BoxLayoutDemo.javaBoxLayout將組件放在單一的行或列中,和FlowLayout不同的是,它可以考慮到組件的對(duì)齊方式,最大、最小、優(yōu)選尺寸9.5.2布局管理(續(xù))
——例9_7Swing的特點(diǎn)和概念52SpringDemo.javaSpringLayout是一種靈活的布局管理器。它能夠精確指定組件之間的間距。組件之間的距離通過Spring類的對(duì)象來表示,每個(gè)spring有四個(gè)屬性,最小值,最大值,優(yōu)選值和實(shí)際值。每個(gè)組件的spring對(duì)象集合在一起就構(gòu)成了SpringLayout.Constraints對(duì)象9.5.2布局管理(續(xù))
——例9_7Swing的特點(diǎn)和概念539.5.3事件處理GUI是由事件驅(qū)動(dòng)的,一些常見的事件包括:移動(dòng)鼠標(biāo)單雙擊鼠標(biāo)各個(gè)按鈕單擊按鈕在文本字段輸入在菜單中選擇菜單項(xiàng)在組合框中選擇、單選和多選拖動(dòng)滾動(dòng)條關(guān)閉窗口……Swing通過事件對(duì)象來包裝事件,程序可以通過事件對(duì)象獲得事件的有關(guān)信息Swing的特點(diǎn)和概念549.5.3事件處理(續(xù))
——Swing組件的事件對(duì)象Swing的特點(diǎn)和概念55編寫事件處理程序時(shí),要注意三個(gè)概念事件源與用戶進(jìn)行交互的GUI組件,表示事件來自于哪個(gè)組件或?qū)ο蟊热缫獙?duì)按鈕被按下這個(gè)事件編寫處理程序,按鈕就是事件源事件監(jiān)聽器負(fù)責(zé)監(jiān)聽事件并做出響應(yīng)一旦它監(jiān)視到事件發(fā)生,就會(huì)自動(dòng)調(diào)用相應(yīng)的事件處理程序作出響應(yīng)事件對(duì)象封裝了有關(guān)已發(fā)生的事件的信息例如按鈕被按下就是一個(gè)要被處理的事件,當(dāng)用戶按下按鈕時(shí),就會(huì)產(chǎn)生一個(gè)事件對(duì)象。事件對(duì)象中包含事件的相關(guān)信息和事件源9.5.3事件處理(續(xù))
——事件處理機(jī)制的三個(gè)部分Swing的特點(diǎn)和概念56程序員應(yīng)完成的兩項(xiàng)任務(wù)為事件源注冊(cè)一個(gè)事件監(jiān)聽器實(shí)現(xiàn)事件處理方法9.5.3事件處理(續(xù))
——程序員應(yīng)完成的兩項(xiàng)任務(wù)Swing的特點(diǎn)和概念57事件源提供注冊(cè)監(jiān)聽器或取消監(jiān)聽器的方法維護(hù)一個(gè)已注冊(cè)的監(jiān)聽器列表,如有事件發(fā)生,就會(huì)通知每個(gè)已注冊(cè)的監(jiān)聽器一個(gè)事件源可以注冊(cè)多個(gè)事件監(jiān)聽器,每個(gè)監(jiān)聽器又可以對(duì)多種事件進(jìn)行相應(yīng),例如一個(gè)JFrame事件源上可以注冊(cè)窗口事件監(jiān)聽器,響應(yīng)窗口關(guān)閉窗口最大化窗口最小化鼠標(biāo)事件監(jiān)聽器,響應(yīng)鼠標(biāo)點(diǎn)擊鼠標(biāo)移動(dòng)9.5.3事件處理(續(xù))
——事件源Swing的特點(diǎn)和概念58事件監(jiān)聽器是一個(gè)對(duì)象,通過事件源的add×××Listener方法被注冊(cè)到某個(gè)事件源上不同的Swing組件可以注冊(cè)不同的事件監(jiān)聽器一個(gè)事件監(jiān)聽器中可以包含有對(duì)多種具體事件的專用處理方法例如用于處理鼠標(biāo)事件的監(jiān)聽器接口MouseListener中就包含有對(duì)應(yīng)于鼠標(biāo)壓下、放開、進(jìn)入、離開、敲擊五種事件的相應(yīng)方法mousePressed、mouseReleased、mouseEntered、mouseExited、mouseClicked,這五種方法都需要一個(gè)事件對(duì)象作為參數(shù)9.5.3事件處理(續(xù))
——事件監(jiān)聽器Swing的特點(diǎn)和概念59通常我們用到的事件對(duì)象有ActionEvent發(fā)生在按下按鈕、選擇了一個(gè)項(xiàng)目、在文本框中按下回車鍵ItemEvent發(fā)生在具有多個(gè)選項(xiàng)的組件上,如JCheckBox、JComboBoxChangeEvent用在可設(shè)定數(shù)值的拖曳桿上,例如JSlider、JProgressBar等WindowEvent用在處理窗口的操作MouseEvent用于鼠標(biāo)的操作9.5.3事件處理(續(xù))
——事件對(duì)象Swing的特點(diǎn)和概念609.5.3事件處理(續(xù))
——Swing事件源可能觸發(fā)的事件及對(duì)應(yīng)的事件監(jiān)聽器事件源事件對(duì)象事件監(jiān)聽器JFrameMouseEventWindowEventMouseEventListenerWindowEventListenerAbstractButton(JButton,JToggleButton,JCheckBox,JRadioButton)ActionEventItemEventActionListenerItemListenerJTextFieldJPasswordFieldActionEventUndoableEventActionListenerUndoableListenerJTextAreaCareEventInputMethodEventCareListenerInputMethodEventListenerJTextPaneJEditorPaneCareEventDocumentEventUndoableEventHyperlinkEventCareListenerDocumentListenerUndoableListenerHyperlinkListenerSwing的特點(diǎn)和概念61JComboBoxActionEventItemEventActionListenerItemListenerJListListSelectionEventListDataEventListSelectionListenerListDataListenerJFileChooserActionEventActionListenerJMenuItemActionEventChangeEventItemEventMenuKeyEventMenuDragMouseEventActionListenerChangeListenerItemListenerMenuKeyListenerMenuDragMouseListenerJMenuMenuEventMenuListenerJPopupMenuPopupMenuEventPopupMenuListener9.5.3事件處理(續(xù))
——Swing事件源可能觸發(fā)的事件及對(duì)應(yīng)的事件監(jiān)聽器Swing的特點(diǎn)和概念629.5.3事件處理(續(xù))
——Swing事件源可能觸發(fā)的事件及對(duì)應(yīng)的事件監(jiān)聽器JProgressBarChangeEventChangeListenerJSliderChangeEventChangeListenerJScrollBarAdjustmentEventAdjustmentListenerJTableListSelectionEventTableModelEventListSelectionListenerTableModelListenerJTabbedPaneChangeEventChangeListenerJTreeTreeSelectionEventTreeExpansionEventTreeSelectionListenerTreeExpansionListenerJTimerActionEventActionListenerSwing的特點(diǎn)和概念63事件監(jiān)聽器接口例如MouseListener是一個(gè)接口,為了在程序中創(chuàng)建一個(gè)鼠標(biāo)事件監(jiān)聽器的對(duì)象,我們需要實(shí)現(xiàn)其所有五個(gè)方法,在方法體中,我們可以通過鼠標(biāo)事件對(duì)象傳遞過來的信息(例如點(diǎn)擊的次數(shù),坐標(biāo)),實(shí)現(xiàn)各種處理功能事件監(jiān)聽器適配器類有時(shí)我們并不需要對(duì)所有事件進(jìn)行處理,為此Swing提供了一些適配器類×××Adapter,這些類含有所有×××Listener中方法的默認(rèn)實(shí)現(xiàn)(就是什么也不做),因此我們就只需編寫那些需要進(jìn)行處理的事件的方法。例如,如果只想對(duì)鼠標(biāo)敲擊事件進(jìn)行處理,如果使用MouseAdapter類,則只需要重寫mouseClicked方法就可以了9.5.3事件處理(續(xù))
——事件監(jiān)聽器接口和事件監(jiān)聽器適配器類Swing的特點(diǎn)和概念64實(shí)現(xiàn)事件監(jiān)聽器接口這種方法需要實(shí)現(xiàn)接口中所有的方法,對(duì)我們不需要進(jìn)行處理的事件方法,也要列出來,其方法體使用一對(duì)空的花括號(hào)繼承事件監(jiān)聽器適配器類只需要重寫我們感興趣的事件使用匿名內(nèi)部類特別適用于已經(jīng)繼承了某個(gè)父類(例如Applet程序,主類必須繼承JApplet類或Applet類),則根據(jù)java語法規(guī)則,就不能再繼承適配器類的情況,而且使用這種方法程序看起來會(huì)比較清楚明了9.5.3事件處理(續(xù))
——三種實(shí)現(xiàn)事件處理的方法Swing的特點(diǎn)和概念65創(chuàng)建一窗口,當(dāng)鼠標(biāo)在窗口中點(diǎn)擊時(shí),在窗口標(biāo)題欄中顯示點(diǎn)擊位置坐標(biāo)。方法一:實(shí)現(xiàn)MouseListener接口importjava.awt.event.*;//載入MouseListener類所在的包importjavax.swing.*;//載入JFrame所在的包publicclassEx9_8_1implementsMouseListener{
JFramef;publicEx9_8_1(){f=newJFrame();//新建一窗口
f.setSize(300,150);
f.show();
f.addMouseListener(this);//為窗口增加鼠標(biāo)事件監(jiān)聽器
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicvoidmousePressed(MouseEvente){}publicvoidmouseReleased(MouseEvente){}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}publicvoidmouseClicked(MouseEvente){
f.setTitle("點(diǎn)擊坐標(biāo)為("+e.getX()+","+e.getY}publicstaticvoidmain(String[]args){newEx9_8_1();}}9.5.3事件處理(續(xù))
——例9_8_1Swing的特點(diǎn)和概念66繼承MouseAdapter類importjava.awt.event.*;//載入MouseAdapter所在的包importjavax.swing.*;publicclassEx9_8_2extendsMouseAdapter{
JFramef;publicEx9_8_2(){f=newJFrame();f.setSize(300,150);
f.show();
f.addMouseListener(this);
f.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);}publicvoidmouseClicked(MouseEvente){
f.setTitle("點(diǎn)擊坐標(biāo)為("+e.getX()+","+e.getY()+")");}publicstaticvoidmain(String[]args){newEx9_8_2();}}9.5.3事件處理(續(xù))
——例9_8_2Swing的特點(diǎn)和概念67方法三:使用匿名內(nèi)部類importjava.awt.event.*;importjavax.swing.*;publicclassEx9_8_3{
JFramef;publicEx9_8_3(){f=newJFrame();f.setSize(300,150);
f.show();
f.addMouseListener(new
MouseAdapter(){publicvoidmouseClicked(MouseEvente){
f.setTitle("點(diǎn)擊坐標(biāo)為("+e.getX()+","+e.getY()+")");}});//為窗口添加鼠標(biāo)事件監(jiān)聽器語句結(jié)束
f.addWindowListener(new
WindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});//為窗口添加窗口事件監(jiān)聽器語句結(jié)束
}publicstaticvoidmain(String[]args){newEx9_8_3();}}9.5.3事件處理(續(xù))
——例9_8_3Swing的特點(diǎn)和概念68采用三種不同方法的程序,其運(yùn)行效果都是一樣的,當(dāng)鼠標(biāo)在窗口中點(diǎn)擊的時(shí)候,窗口標(biāo)題欄將出現(xiàn)所點(diǎn)位置的坐標(biāo)信息9.5.3事件處理(續(xù))
——例9_8運(yùn)行結(jié)果Swing的特點(diǎn)和概念699.6Swing組件組件和容器容器層次結(jié)構(gòu)是一個(gè)以頂層容器為根的樹狀組件集合為了顯示在屏幕上,每個(gè)組件必須是一套容器層次結(jié)構(gòu)的一部分每個(gè)組件只能放置在某個(gè)容器內(nèi)一次如果某個(gè)組件已經(jīng)在一個(gè)容器中,又將它加到另外一個(gè)容器中,這個(gè)組件就會(huì)從第一個(gè)容器中清除709.6.1頂層容器Swing提供了3個(gè)頂層容器類:JFrame
JApplet
JDialog都是重量級(jí)組件,分別繼承了AWT組件Frame、Applet和Dialog每個(gè)頂層容器都有一個(gè)內(nèi)容面板,通常直接或間接的容納別的可視組件可以有選擇地為頂層容器添加菜單,菜單被放置在頂層容器上,但是在內(nèi)容面板之外Swing組件71java.lang.Object└java.awt.Component└java.awt.Container└java.awt.Window└java.awt.Frame└javax.swing.JFrame
每個(gè)包含Swing組件的主窗口都應(yīng)用JFrame來實(shí)現(xiàn)9.6.1頂層容器(續(xù))
——JFrame的繼承結(jié)構(gòu)Swing組件72java.lang.Object└java.awt.Component└java.awt.Container└java.awt.Panel└java.awt.Applet└javax.swing.JApplet
每個(gè)包含Swing組件的Applet都應(yīng)作為JApplet
的子類來實(shí)現(xiàn)Swing組件9.6.1頂層容器(續(xù))
——JApplet的繼承結(jié)構(gòu)73java.lang.Object└java.awt.Component└java.awt.Container└java.awt.Window└java.awt.Dialog└javax.swing.JDialog要實(shí)現(xiàn)對(duì)話框,需要從JDialog派生一個(gè)類Swing組件9.6.1頂層容器(續(xù))
——JDialog的繼承結(jié)構(gòu)749.6.1頂層容器(續(xù))
——如何獲得一個(gè)頂層容器JApplet類的頂層容器由瀏覽器提供,通常我們不需要自己產(chǎn)生一個(gè)JApplet類的對(duì)象。JFrame和JDialog通過構(gòu)造方法進(jìn)行創(chuàng)建名稱描述JFrame()建立一個(gè)新的JFrame,默認(rèn)值是不可見的(Invisible)JFrame(Stringtitle)建立一個(gè)具有標(biāo)題title的JFrame,默認(rèn)值是不可見的(Invisilble)JApplet()建立一個(gè)JAppletJDialog()建立一個(gè)non-moal對(duì)話框,無標(biāo)題JDialog(Dialogowner)建立一個(gè)屬于Dialog組件的對(duì)話框,為non-modal形式,無標(biāo)題JDialog(Dialogowner,booleanmodal)建立一個(gè)屬于Dialog組件的對(duì)話框,可決定modal形式,無標(biāo)題JDialog(Dialogowner,Stringtitle)建立一個(gè)屬于Dialog組件的對(duì)話框,為non-modal形式,有標(biāo)題Swing組件75JDialog(Dialogowner,Stringtitle,booleanmodal)建立一個(gè)屬于Dialog組件的對(duì)話框,可決定modal形式,有標(biāo)題JDialog(Frameowner)建立一個(gè)屬于Frame組件的對(duì)話框,為non-modal形式,無標(biāo)題JDialog(Frameowner,booleanmodal)建立一個(gè)屬于Frame組件的對(duì)話框,可決定modal形式,無標(biāo)題JDialog(Frameowner,Stringtitle)建立一個(gè)屬于Frame組件的對(duì)話框,為non-modal形式,有標(biāo)題JDialog(Frameowner,Stringtitle,booleanmodal)建立一個(gè)屬于Frame組件的對(duì)話框,可決定modal形式,有標(biāo)題9.6.1頂層容器(續(xù))
——如何獲得一個(gè)頂層容器續(xù)Swing組件769.6.1頂層容器(續(xù))
——FrameDemo.javaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassFrameDemo{publicstaticvoidmain(Strings[]){
JFrameframe=newJFrame("FrameDemo");
frame.addWindowListener(new
WindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});
JLabel
emptyLabel
=newJLabel("");
emptyLabel.setPreferredSize(newDimension(175,100));
frame.getContentPane().add(emptyLabel,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);}}Swing組件77importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTopLevelDemo{publicstaticvoidmain(Strings[]){
JFrameframe=newJFrame("TopLevelDemo");
frame.addWindowListener(new
WindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});
JLabel
yellowLabel=newJLabel("");
yellowLabel.setOpaque(true);
yellowLabel.setBackground(Color.yellow);
yellowLabel.setPreferredSize(newDimension(200,180));
JMenuBar
cyanMenuBar=newJMenuBar();
cyanMenuBar.setOpaque(true);
cyanMenuBar.setBackground(Color.cyan);
cyanMenuBar.setPreferredSize(newDimension(200,20));
frame.setJMenuBar(cyanMenuBar);
frame.getContentPane().add(yellowLabel
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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è)園區(qū)混凝土路面鋪設(shè)合同
- 建筑工程升降機(jī)安裝合同
- 跨國建筑企業(yè)人才聘用合同
- 住宅小區(qū)建設(shè)項(xiàng)目合同樣本
- 文化活動(dòng)柴油發(fā)電機(jī)租賃協(xié)議
- 籃球館秩序維護(hù)保安合同
- 家居裝修后二手房銷售合同模板
- 超市銷售勞務(wù)合同范例
- 項(xiàng)目顧問合同三篇
- 【MOOC】例解宏觀經(jīng)濟(jì)統(tǒng)計(jì)學(xué)-江西財(cái)經(jīng)大學(xué) 中國大學(xué)慕課MOOC答案
- 《中國的土地政策》課件
- 【MOOC】電工學(xué)-西北工業(yè)大學(xué) 中國大學(xué)慕課MOOC答案
- 專題12 簡·愛-2024年中考語文復(fù)習(xí)文學(xué)名著必考篇目分層訓(xùn)練(原卷版)
- 【高考語文】2024年全國高考新課標(biāo)I卷-語文試題評(píng)講
- 客戶滿意度論文開題報(bào)告
- 2024-2025學(xué)年八年級(jí)上冊(cè)歷史期末復(fù)習(xí)選擇題(解題指導(dǎo)+專項(xiàng)練習(xí))原卷版
- 課桌椅人體工程學(xué)
- 中石油系統(tǒng)員工安全培訓(xùn)
- 2024年軍隊(duì)文職(管理學(xué))考前通關(guān)知識(shí)點(diǎn)必練題庫(含真題)
- 2024年紹興市特種設(shè)備檢測院招考(6人)高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
評(píng)論
0/150
提交評(píng)論