




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1第8章 圖形用戶界面JAVA語(yǔ)言程序設(shè)計(jì)2目錄l 8.1 Applet 概述l 8.2 Applet應(yīng)用程序接口l 8.3 繪圖l 8.4 Swing基礎(chǔ)l 8.5 Swing的特點(diǎn)和概念l 8.6 Swing組件l 8.7 其它Swing特性l 8.8 本章小結(jié)(說明:本章部分例題出自java_tutorial_sun)38.1 Applet 概述l Java Applet一種嵌入HTML文檔中的Java程序與Application相比,Applet具有明顯的優(yōu)點(diǎn)lweb瀏覽器提供了運(yùn)行Applet所需要的許多功能lApplet是在運(yùn)行時(shí)通過網(wǎng)絡(luò)從服務(wù)器端下載的,因而便于軟件的發(fā)布和及時(shí)更
2、新Applet也有其局限性,l不能在客戶機(jī)上讀寫當(dāng)?shù)匚募也不能連接除它所在的服務(wù)器以外的其它機(jī)器4l 在瀏覽器中加載一個(gè)Applet,功能是顯示一個(gè)字符串“This is a Java Applet!”import java.awt.Graphics;import javax.swing.JApplet; public class Ex8_1 extends JApplet public void paint(Graphics g) /重載JApplet類的paint方法 /參數(shù)是Graphics類的對(duì)象,是由瀏覽器傳遞過來(lái)的 super.paint(g); /調(diào)用其超類JApplet類的p
3、aint方法 g.drawString(This is a Java Applet!,25,25); 8.1 Applet概述(續(xù)) 例8_1Applet概述5l在NetBeans IDE中運(yùn)行8.1 Applet概述(續(xù)) 例8_1運(yùn)行結(jié)果Applet概述6l 編譯ex8_1.java產(chǎn)生字節(jié)碼文件ex8_1.class。接下來(lái)就需要編寫一個(gè)HTML文件ex8_1.html來(lái)嵌入ex8_1.classl 將ex8_1.html文件和Ex8_1.class文件放在同一個(gè)目錄下。現(xiàn)在,在瀏覽器中打開這個(gè)HTML文件,當(dāng)瀏覽器遇到Applet標(biāo)記時(shí),就會(huì)自動(dòng)載入指定的class文件,就會(huì)實(shí)現(xiàn)在屏幕
4、上繪制一串字符的效果8.1 Applet概述(續(xù)) 例8_1運(yùn)行結(jié)果Applet概述78.2 Applet應(yīng)用程序接口l JApplet類 一個(gè)applet程序需要繼承javax.swing包中的JApplet類,也可以繼承老的AWT組件中的Applet類, JApplet類屬于新的Swing組件 提供了applet在瀏覽器中運(yùn)行需要具備的特定方法l 瀏覽器載入時(shí),要依次運(yùn)行init、start、paint方法l 離開瀏覽器頁(yè)面時(shí),執(zhí)行stopl 退出瀏覽器時(shí),執(zhí)行destroy 提供了所有這些方法的默認(rèn)實(shí)現(xiàn),所以我們?cè)诰帉懽约旱腶pplet時(shí),就可以不必寫出全部方法,只要繼承這個(gè)JApple
5、t,然后重寫特定的方法來(lái)增加特殊功能88.2 Applet應(yīng)用程序接口Applet應(yīng)用程序接口98.2 Applet應(yīng)用程序接口(續(xù))Applet應(yīng)用程序接口10import javax.swing.*;.import java.awt.*;public class HelloSwingApplet extends JApplet public void init() JLabel label = new JLabel( You are successfully running a Swing applet!); label.setHorizontalAlignment(JLabel.CENT
6、ER); label.setBorder(BorderFactory.createMatteBorder( 1,1,2,2,Color.black); getContentPane().add(label, BorderLayout.CENTER); 8.2 Applet應(yīng)用程序接口(續(xù)) HelloSwingApplet.javaApplet應(yīng)用程序接口118.3 繪圖l圖形環(huán)境和圖形對(duì)象l顏色和字體l使用Graphics類繪圖l使用Graphics2D類繪圖128.3.1 圖形環(huán)境和圖形對(duì)象l 坐標(biāo) GUI組件的左上角坐標(biāo)默認(rèn)為(0,0) 從左上角到右下角,水平坐標(biāo)x和垂直坐標(biāo)y增加。 坐
7、標(biāo)的單位是象素l Graphics對(duì)象 Graphics對(duì)象是專門管理圖形環(huán)境的。Graphics類是一個(gè)抽象類 設(shè)計(jì)一個(gè)抽象類Graphics可以給程序員提供一個(gè)與平臺(tái)無(wú)關(guān)的繪圖接口,因而程序員就可以以獨(dú)立于平臺(tái)的方式來(lái)使用圖形。在各個(gè)平臺(tái)上實(shí)現(xiàn)的Java系統(tǒng)將創(chuàng)建Graphics類的一個(gè)子類,來(lái)實(shí)現(xiàn)繪圖功能,但是這個(gè)子類對(duì)程序員是透明的,也就是說我們只能看得到Graphics類,卻不必關(guān)心其實(shí)現(xiàn) 在執(zhí)行paint方法時(shí),系統(tǒng)會(huì)傳遞一個(gè)指向特定平臺(tái)的Graphics子類的圖形對(duì)象g繪 圖13 8.3.2 顏色和字體l Java中有關(guān)顏色的類是Color類,它在java.awt包中,這個(gè)類聲明
8、了用于操作Java程序中顏色的方法和常量繪 圖14 8.3.2 顏色和字體l Font類有關(guān)字體控制,在java.awt包中繪 圖158.3.3 使用Graphics類繪圖l Graphics類其對(duì)象可以繪制文本、線條、矩形、多邊形、橢圓、弧等多種圖形繪 圖188.3.3 使用Graphics類繪圖(續(xù)) l import java.awt.Color;l import java.awt.Font;l import java.awt.*;l import javax.swing.*;l public class Ex8_21 extends JFrame l public Ex8_21() l
9、 super( show text); l setSize( 480, 250 ); l setVisible( true ); l l 198.3.3 使用Graphics類繪圖(續(xù)) l public void paint(Graphics g) l super.paint( g ); / call superclasss paint methodl g.setFont( new Font(SansSerif, Font.BOLD, 12 ) ); l g.setColor(Color.blue); l g.drawString(ScanSerif,20,50);l l public st
10、atic void main( String args ) l JFrame.setDefaultLookAndFeelDecorated(true);l l Ex8_21 application = new Ex8_21(); l application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );l l 208.3.3 使用Graphics類繪圖(續(xù)) 21l 用各種顏色繪制文字及各種圖形import java.awt.*;import javax.swing.*;public class Ex8_2 extends JFrame pub
11、lic Ex8_2() super( “演示字體、顏色、繪圖” ); /調(diào)用基類構(gòu)造方法 setSize( 480, 250 ); /設(shè)置窗口大小 setVisible( true ); /顯示窗口 public void paint( Graphics g ) super.paint( g ); / call superclasss paint method g.setFont( new Font( SansSerif, Font.BOLD, 12 ) ); g.setColor(Color.blue); /設(shè)置顏色 g.drawString(字體ScanSerif,粗體,12號(hào),藍(lán)色,20
12、,50); 8.3.3 使用Graphics類繪圖(續(xù)) Ex9_2.java繪 圖22 g.setFont( new Font( Serif, Font.ITALIC, 14 ) ); g.setColor(new Color(255,0,0); g.drawString( 字體字體Serif,斜體,斜體,14號(hào),紅色號(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
13、,50); /繪制實(shí)心矩形繪制實(shí)心矩形 g.setColor(Color.yellow); g.drawRoundRect(240,70,100,50,50,50); /繪制空心圓角矩形繪制空心圓角矩形 g.fillRoundRect(350,70,100,50,50,50); /繪制實(shí)心圓角矩形繪制實(shí)心圓角矩形 g.setColor(Color.cyan); g.draw3DRect(20,130,100,50,true); /繪制突起效果空心矩形繪制突起效果空心矩形 g.fill3DRect(130,130,100,50,false); /繪制凹陷效果實(shí)心矩形繪制凹陷效果實(shí)心矩形8.3.3
14、 使用Graphics類繪圖(續(xù)) Ex9_2.java繪 圖23 g.setColor(Color.pink); g.drawOval(240,130,100,50); /繪制空心橢圓繪制空心橢圓 g.fillOval(350,130,100,50); /繪制實(shí)心橢圓繪制實(shí)心橢圓 g.setColor(new Color(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=25
15、0,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); /繪制空心多邊形繪制空心多邊形 int xValues2=360,390,400,410,440,420,430,400,370,380; g.fillPolygon(xValues2,yValues,10); /繪制實(shí)心多邊形繪制實(shí)心多邊形 8.3.3 使用Graphics類繪圖(續(xù)) Ex9_2.java繪 圖24public static
16、 void main( String args ) JFrame.setDefaultLookAndFeelDecorated(true); /設(shè)置窗口的外觀感覺為設(shè)置窗口的外觀感覺為Java默認(rèn)默認(rèn) Ex8_2 application = new Ex8_2(); application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE ); l 運(yùn)行結(jié)果8.3.3 使用Graphics類繪圖(續(xù)) Ex9_2.java運(yùn)行結(jié)果繪 圖258.3.4 使用Graphics2D類繪圖l Java2D API提供了高級(jí)的二維圖形功能分布在java.awt、
17、java.awt.image、java.awt.color、java.awt.font、java.awt.geom、java.awt.print和java.awt.image.renderable包中它能輕松使你完成以下功能:l繪制任何寬度的直線l用漸變顏色和紋理來(lái)填充圖形l平移、旋轉(zhuǎn)、伸縮、切變二維圖形,對(duì)圖像進(jìn)行模糊、銳化等操作l構(gòu)建重疊的文本和圖形繪 圖26l Graphics2D類要想使用Java2D API,就必須通過一個(gè)該類的對(duì)象是Graphics類的抽象子類事實(shí)上,所有的paint方法用于繪圖操作的對(duì)象實(shí)際上是Graphics2D的一個(gè)子類實(shí)例,該實(shí)例傳遞給paint方法,并被向
18、上轉(zhuǎn)型為Graphics類的實(shí)例。要訪問Graphics2D功能,必須使用如下語(yǔ)句將傳遞給paint方法的Graphics引用強(qiáng)制轉(zhuǎn)換為Graphics2D引用:Graphics2D g2d=(Graphics2D)g8.3.4 使用Graphics2D類繪圖(續(xù))繪 圖27l 實(shí)現(xiàn)例8_1的功能,使用Java2D使文字出現(xiàn)漸變色效果import java.awt.*;import javax.swing.*;public class Ex8_3 extends JApplet public void paint(Graphics g) super.paint(g); Graphics2D g
19、2d=(Graphics2D)g; g2d.setPaint(new GradientPaint(0,0,Color.red,180,45,Color.yellow); g2d.drawString(This is a Java Applet!,25,25); 8.3.4 使用Graphics2D類繪圖(續(xù)) Ex8_3.java繪 圖288.3.4 使用Graphics2D類繪圖(續(xù)) Ex8_3.java運(yùn)行結(jié)果繪 圖298.4 Swing基礎(chǔ)l 前面介紹了如何在屏幕上繪制普通的圖形,但如果需要繪制一個(gè)按鈕,并使其可以對(duì)點(diǎn)擊事件作出響應(yīng),就需要使用java Swing提供的組件l 其實(shí)前面
20、我們已經(jīng)用到的JFrame、JApplet都是Swing組件,它們分別代表窗口組件和Applet容器組件 308.4.1 JFC與Swingl JFC Java Foundation Classes(Java基礎(chǔ)類)的縮寫 是關(guān)于GUI 組件和服務(wù)的完整集合 作為J2SE 的一個(gè)有機(jī)部分,主要包含5 個(gè)部分l AWTl Java2Dl Accessibility(定義了用戶界面組件與提供對(duì)這些組件進(jìn)行訪問的輔助技術(shù)之間的協(xié)定 )l Drag & Drop(java.awt.datatransfer.* , javax.awt.dnd.* )l Swingl Swing JFC 的一部分
21、 提供按鈕、窗口、表格等所有的組件 純Java組件(完全用Java寫的)Swing 基礎(chǔ)318.4.2 Swing與AWTl早期版本的AWT組件在java.awt包里,包括Button、Checkbox、Scrollbar等,都是Component類的子類大部分含有native code,所以隨操作系統(tǒng)平臺(tái)的不同會(huì)顯示出不同的樣子,而不能進(jìn)行更改,是重量級(jí)組件(heavyweight components)沒有彈性、缺乏效率Swing 基礎(chǔ)32l 較新的Swing組件 其名稱都是在原來(lái)AWT組件名稱前加上J,例如JButton、JCheckBox、JScrollbar等,都是JComponen
22、t類的子類 Java1.2推出,架構(gòu)在 AWT 之上,是AWT的擴(kuò)展而不是取代 完全是由java語(yǔ)言編寫的,其外觀和功能不依賴于任何由宿主平臺(tái)的窗口系統(tǒng)所提供的代碼,是輕量級(jí)組件(lightweight components) 可提供更豐富的視覺感受,被越來(lái)越多地使用8.4.2 Swing與AWTSwing 基礎(chǔ)338.4.3 在Applet和Application中應(yīng)用Swing l 在Applet中應(yīng)用Swing,就是要將Swing組件加載到Applet容器上(通常是JApplet),這通常在init方法中完成l 在Application中應(yīng)用Swing,也是要將Swing組件加載到這個(gè)A
23、pplication的頂層容器(通常是JFrame)中 Swing 基礎(chǔ)34l 應(yīng)用Swing組件的Appletimport java.awt.*;import java.awt.event.*;import javax.swing.*;public class Ex8_4 extends JApplet public void init() Container contentPane=getContentPane(); contentPane.setLayout(new GridLayout(2,1); JButton button=new JButton(Click me); final
24、JLabel label=new JLabel(); contentPane.add(button); contentPane.add(label); button.addActionListener( new ActionListener() public void actionPerformed(ActionEvent event) String information=JOptionPane.showInputDialog(請(qǐng)輸入一串字符); label.setText(information); );/創(chuàng)建監(jiān)聽器語(yǔ)句結(jié)束 /init方法結(jié)束 8.4.3在Applet和Applicati
25、on中應(yīng)用Swing (續(xù)) Ex8_4.javaSwing 基礎(chǔ)358.4.3在Applet和Application中應(yīng)用Swing (續(xù)) Ex8_4.java運(yùn)行結(jié)果Swing 基礎(chǔ)36l 把JApplet換成JFrame,將例8-4的程序改為Applicationimport javax.swing.*;import java.awt.event.*;import java.awt.*;public class Ex8_5 public static void main(String args) JFrame f=new JFrame(“Simple Swing Application
26、”); Container contentPane=f.getContentPane(); contentPane.setLayout(new GridLayout(2,1); JButton button=new JButton(Click me); final JLabel label=new JLabel(); contentPane.add(button);/添加按鈕 contentPane.add(label);/添加標(biāo)簽 button.addActionListener( new ActionListener() public void actionPerformed(Action
27、Event event) String information=JOptionPane.showInputDialog(請(qǐng)輸入一串字符); label.setText(information); ); f.setSize(200,100);/設(shè)置大小 f.show();/顯示 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 8.4.3在Applet和Application中應(yīng)用Swing (續(xù)) Ex8_5.javaSwing 基礎(chǔ)378.4.3在Applet和Application中應(yīng)用Swing (續(xù)) Ex8_5.java運(yùn)行結(jié)果Swi
28、ng 基礎(chǔ)388.5 Swing的特點(diǎn)和概念 l Swing GUI 組件 javax.swing包 源于AWT(package java.awt)的組件 包括外觀和感覺l 外觀以及用戶如何和程序交互 輕量級(jí)組件l 完全用Java寫成,不是用當(dāng)前平臺(tái)的GUI功能 某些Swing組件也是重量級(jí)的,外觀和功能受到本地窗口系統(tǒng)的限制,如l java.awt.Windows的子類l java.applet.Applet的子類398.5.1 Swing的組件和容器層次 l絕大多數(shù)Swing組件的繼承層次java. lang. Objec tj ava.a wt.Co mpone ntj ava.a wt
29、.Co ntain erjav ax.sw ing.J Compo nentSwing 的特點(diǎn)和概念408.5.1 Swing的組件和容器層次(續(xù))l JComponent類是除了頂層容器以外所有Swing組件的基類,根據(jù)繼承關(guān)系,我們可以在每個(gè)基類中找到大多數(shù)GUI組件的常見操作 Component 類l 包含paint、repaint方法,可以在屏幕上繪制組件l 大多數(shù)GUI組件直接或間接擴(kuò)展Component Container 類l 容納相關(guān)組件l 包括add方法,用來(lái)添加組件l 包括setLayout方法,這個(gè)方法可用來(lái)設(shè)置布局,以幫助Container對(duì)象對(duì)其中的組件進(jìn)行定位和設(shè)置
30、組件大小 JComponent 類多數(shù)Swing組件的超類l 可抽換的外觀和感覺,即可根據(jù)需求定制外觀和感覺。l 快捷鍵 (通過鍵盤直接訪問GUI組件)l 一般的事件處理功能Swing 的特點(diǎn)和概念41l通常將javax.swing包里的Swing組件歸為三個(gè)層次頂層容器中間層容器原子組件8.5.1 Swing的組件和容器層次(續(xù))Swing 的特點(diǎn)和概念42l 頂層容器Swing提供三個(gè)頂層容器的類l JFrame 實(shí)現(xiàn)單個(gè)主窗口l JDialog 實(shí)現(xiàn)一個(gè)二級(jí)窗口(對(duì)話框)l JApplet 在瀏覽器窗口中實(shí)現(xiàn)一個(gè)applet顯示區(qū)域必須和操作系統(tǒng)打交道,所以都是重量級(jí)組件從繼承結(jié)構(gòu)上來(lái)看
31、,它們分別是從原來(lái)AWT組件的Frame、Dialog和Applet類繼承而來(lái)每個(gè)使用Swing組件的Java程序都必須至少有一個(gè)頂層容器,別的組件都必須放在這個(gè)頂層容器上才能顯現(xiàn)出來(lái)8.5.1 Swing的組件和容器層次(續(xù)) 頂層容器Swing 的特點(diǎn)和概念43l 中間層容器中間層容器其存在的目的僅僅是為了容納別的組件分為兩類l一般用途的JPanelJScrollPaneJSplitPaneJTabbedPaneJToolBarl特殊用途的JInternalFrameJRootPane可以直接從頂層容器中獲得一個(gè)JRootPane對(duì)象來(lái)直接使用,而別的中間容器使用的時(shí)候需要新建一個(gè)對(duì)象8.
32、5.1 Swing的組件和容器層次(續(xù)) 中間層容器Swing 的特點(diǎn)和概念448.5.1 Swing的組件和容器層次(續(xù)) JScrollPane458.5.1 Swing的組件和容器層次(續(xù)) JSplitPane468.5.1 Swing的組件和容器層次(續(xù)) JTabbedPane478.5.1 Swing的組件和容器層次(續(xù)) JToolBar48l 原子組件原子組件 通常是在圖形用戶界面中和用戶進(jìn)行交互的組件 基本功能是和用戶交互信息,而不像前兩種組件那樣是用來(lái)容納別的組件的 根據(jù)功能的不同,可被分為三類l 顯示不可編輯信息的JLabel、JProgressBar、JToolTip
33、l 有控制功能、可以用來(lái)輸入信息的JButton、JCheckBox、JRadioButton、JComboBox、JList、JMenu、JSlider、JSpinner、JTexComponent等l 能提供格式化的信息并允許用戶選擇的JColorChooser、JFileChooser、JTable、JTree8.5.1 Swing的組件和容器層次(續(xù)) 原子組件Swing 的特點(diǎn)和概念49Swing的組件和容器層次(續(xù)) JLabell ImageIcon icon = createImageIcon(images/middle.gif); label1 = new JLabel(Im
34、age and Text, icon, JLabel.CENTER); /Set the position of the text, relative to the icon: l label1.setVerticalTextPosition(JLabel.BOTTOM); label1.setHorizontalTextPosition(JLabel.CENTER); l label2 = new JLabel(Text-Only Label); l label3 = new JLabel(icon); 50Swing的組件和容器層次(續(xù)) JProgressBar518.5.1 Swing
35、的組件和容器層次(續(xù)) JToolTip通常使用JComponent setToolTipText method 設(shè)置tooltip.b1.setToolTipText(Click this button to disable the middle button.); b2.setToolTipText(This middle button does not react when you click it.); b3.setToolTipText(Click this button to enable the middle button.); 528.5.1 Swing的組件和容器層次(續(xù))
36、JCheckBoxl chinButton = new JCheckBox(Chin); l chinButton.setSelected(true); l glassesButton = new JCheckBox(Glasses); glassesButton.setSelected(true); l hairButton = new JCheckBox(Hair); l hairButton.setSelected(true); l teethButton = new JCheckBox(Teeth); l teethButton.setSelected(true); l chinBut
37、ton.addItemListener(this); l glassesButton.addItemListener(this); l hairButton.addItemListener(this); l teethButton.addItemListener(this); 538.5.1 Swing的組件和容器層次(續(xù)) JCheckBoxl .l public void itemStateChanged(ItemEvent e) l . l Object source = e.getItemSelectable();l if (source = chinButton) /.make a
38、note of it. l else if (source = glassesButton) /.make a note of it. l else if (source = hairButton) /.make a note of it. l else if (source = teethButton) /.make a note of it. l 548.5.1 Swing的組件和容器層次(續(xù)) JCheckBox558.5.1 Swing的組件和容器層次(續(xù)) JRadioButtonl JRadioButton birdButton = new JRadioButton(birdStr
39、ing); birdButton.setActionCommand(birdString); birdButton.setSelected(true); l JRadioButton catButton = new JRadioButton(catString); catButton.setActionCommand(catString); l JRadioButton dogButton = new JRadioButton(dogString); dogButton.setActionCommand(dogString);l JRadioButton rabbitButton = new
40、JRadioButton(rabbitString); rabbitButton.setActionCommand(rabbitString); l JRadioButton pigButton = new JRadioButton(pigString); pigButton.setActionCommand(pigString); l ButtonGroup group = new ButtonGroup(); l group.add(birdButton); l group.add(catButton); l group.add(dogButton); l group.add(rabbit
41、Button); l group.add(pigButton); 568.5.1 Swing的組件和容器層次(續(xù)) JRadioButtonl birdButton.addActionListener(this); catButton.addActionListener(this); dogButton.addActionListener(this); rabbitButton.addActionListener(this); pigButton.addActionListener(this); . l public void actionPerformed(ActionEvent e) l
42、picture.setIcon(new ImageIcon(images/ + e.getActionCommand() + .gif); 578.5.1 Swing的組件和容器層次(續(xù)) JComboBoxl String petStrings = Bird, Cat, Dog, Rabbit, Pig ; l JComboBox petList = new JComboBox(petStrings); petList.setSelectedIndex(4); petList.addActionListener(this); 588.5.1 Swing的組件和容器層次(續(xù)) JList598
43、.5.1 Swing的組件和容器層次(續(xù)) JSliderl l JSlider framesPerSecond = new JSlider(JSlider.HORIZONTAL, 0, 30, 15); framesPerSecond.addChangeListener(this); l .l public void stateChanged(ChangeEvent e) JSlider source = (JSlider)e.getSource(); l if (!source.getValueIsAdjusting() int fps = (int)source.getValue();
44、l if (fps = 0) if (!frozen) stopAnimation(); l else delay = 1000 / fps;l timer.setDelay(delay); l timer.setInitialDelay(delay * 10); l if (frozen) startAnimation(); l 608.5.1 Swing的組件和容器層次(續(xù)) JSlider618.5.1 Swing的組件和容器層次(續(xù)) JSpinnerl String monthStrings = new java.text.DateFormatSymbols().getMonths(
45、);/get month names l SpinnerListModel monthModel = new SpinnerListModel(monthStrings); l JSpinner spinner = new JSpinner(monthModel); 628.5.1 Swing的組件和容器層次(續(xù)) JFileChooserl import java.io.*;l import java.awt.*;l import java.awt.event.*;l import javax.swing.*;l public class MyFileChooser implements A
46、ctionListener l String dirname=D:/jdk-6u10-docs/docs;l File file=new File(dirname);l JFileChooser jf=new JFileChooser(file);l TextField tf=new TextField();638.5.1 Swing的組件和容器層次(續(xù)) JFileChooserl public MyFileChooser()l JFrame myFrame=new JFrame(FileChooserDemo);l Container contentPane=myFrame.getCont
47、entPane();l contentPane.setLayout(new GridLayout(2,1);l contentPane.add(jf);l contentPane.add(tf);l myFrame.setSize(500,500);l myFrame.setVisible(true); myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);l jf.addActionListener(this);64
48、8.5.1 Swing的組件和容器層次(續(xù)) JFileChooserl public void actionPerformed(ActionEvent e) l File file = jf.getSelectedFile();l if (file.isFile()=true)l tf.setText(file.getName()+ is file!);l if (file.isDirectory()=true) l tf.setText(file.getName()+ is dir!);l l l public static void main(String args) l new MyF
49、ileChooser();l l l 658.5.1 Swing的組件和容器層次(續(xù)) JFileChooser66l 三層容器結(jié)構(gòu)示例import javax.swing.*;import java.awt.*;public class Ex8_6 public static void main(String args) JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame=new JFrame(Swing Frame); Container contentPane=frame.getContentPane(); JPanel p
50、anel=new JPanel(); panel.setBorder(BorderFactory.createLineBorder(Color.black,5); panel.setLayout(new GridLayout(2,1); JLabel label=new JLabel(Label,SwingConstants.CENTER); JButton button=new JButton(Button); panel.add(label); panel.add(button); contentPane.add(panel); frame.pack();/對(duì)組件進(jìn)行排列 frame.sh
51、ow();/顯示 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 8.5.1 Swing的組件和容器層次(續(xù)) 例8_6Swing 的特點(diǎn)和概念67l 程序說明 首先創(chuàng)建一個(gè)JFrame類頂級(jí)容器 然后獲得頂級(jí)容器的內(nèi)容面板contentPane,只有通過它才能加入其他組件。 然后創(chuàng)建一個(gè)JPanel類的中間容器panel,并設(shè)置邊框以及布局 然后創(chuàng)建原子組件Label,button,并將它們添加到中間容器上 然后將中間容器通過內(nèi)容面板添加到頂層容器上,并/對(duì)組件進(jìn)行排列 8.5.1 Swing的組件和容器層次(續(xù)) 例8_6運(yùn)行結(jié)果
52、Swing 的特點(diǎn)和概念688.5.1 Swing的組件和容器層次(續(xù)) Swing組件列表Swing 的特點(diǎn)和概念698.5.2 布局管理l 如何將下級(jí)組件有秩序地?cái)[在上一級(jí)容器中 在程序中具體指定每個(gè)組件的位置 使用布局管理器(Interface LayoutManager) l 布局管理器 使用方法是通過調(diào)用容器對(duì)象的setLayout方法,并以某種布局管理器對(duì)象為參數(shù),例如:Container contentPane = frame.getContentPane();contentPane.setLayout(new FlowLayout(); 使用布局管理器可以更容易地進(jìn)行布局,而且
53、當(dāng)改變窗口大小時(shí),它還會(huì)自動(dòng)更新版面來(lái)配合窗口的大小,不需要擔(dān)心版面會(huì)因此混亂Swing 的特點(diǎn)和概念708.5.2 布局管理(續(xù))l 在Java中有很多實(shí)現(xiàn)LayoutManager接口的類,經(jīng)常用到的有以下幾個(gè) BorderLayout FlowLayout GridLayout CardLayout GridBagLayout BoxLayout SpringLayout 上一節(jié)提到的內(nèi)容面板(content pane)默認(rèn)使用的就是BorderLayout,它可以將組件放置到五個(gè)區(qū)域:東、西、南、北、中Swing 的特點(diǎn)和概念71BorderLayoutDemo.java及其運(yùn)行效果l
54、BorderLayout以將組件放置到五個(gè)區(qū)域:東、西、南、北、中 8.5.2 布局管理(續(xù)) Swing 的特點(diǎn)和概念72FlowLayoutDemo.javalFlowLayout是JPanel默認(rèn)使用的布局管理器,它只是簡(jiǎn)單地把組件放在一行,如果容器不是足夠?qū)拋?lái)容納所有組件,就會(huì)自動(dòng)開始新的一行8.5.2 布局管理(續(xù)) Swing 的特點(diǎn)和概念73GridLayoutDemo.javalGridLayout將按照其構(gòu)造方法中程序員提供的行數(shù)和列數(shù)將界面分為等大的若干塊,組件被等大地按加載順序放置其中8.5.2 布局管理(續(xù)) Swing 的特點(diǎn)和概念74CardLayoutDemo.j
55、avalCardLayout可以實(shí)現(xiàn)在一個(gè)區(qū)域出現(xiàn)不同的組件布局,就像在一套卡片中選取其中的任意一張一樣。它經(jīng)常由一個(gè)復(fù)選框控制這個(gè)區(qū)域顯示哪一組組件,可通過組合框像選擇卡片一樣選擇某一種布局8.5.2 布局管理(續(xù)) Swing 的特點(diǎn)和概念75GridBagLayoutDemo.javalGridBagLayout把組件放置在網(wǎng)格中,這一點(diǎn)類似于GridLayout,但它的優(yōu)點(diǎn)在于不僅能設(shè)置組件擺放的位置,還能設(shè)置該組件占多少行/列。這是一種非常靈活的布局管理器 8.5.2 布局管理(續(xù)) Swing 的特點(diǎn)和概念76BoxLayoutDemo.javalBoxLayout將組件放在單一的
56、行或列中,和FlowLayout不同的是,它可以考慮到組件的對(duì)齊方式,最大、最小、優(yōu)選尺寸 8.5.2 布局管理(續(xù)) Swing 的特點(diǎn)和概念778.5.2 布局管理(續(xù)) SpringDemo.javal SpringLayout是一種靈活的布局管理器。它能夠精確指定組件之間的間距。組件之間的距離通過Spring類的對(duì)象來(lái)表示,每個(gè)spring有四個(gè)屬性,最小值,最大值,優(yōu)選值和實(shí)際值。每個(gè)組件的spring對(duì)象集合在一起就構(gòu)成了SpringLayout.Constraints對(duì)象Swing 的特點(diǎn)和概念788.5.3 事件處理l GUI是由事件驅(qū)動(dòng)的,一些常見的事件包括: 移動(dòng)鼠標(biāo) 單雙
57、擊鼠標(biāo)各個(gè)按鈕 單擊按鈕 在文本字段輸入 在菜單中選擇菜單項(xiàng) 在組合框中選擇、單選和多選 拖動(dòng)滾動(dòng)條 關(guān)閉窗口 l Swing通過事件對(duì)象來(lái)包裝事件,程序可以通過事件對(duì)象獲得事件的有關(guān)信息Swing 的特點(diǎn)和概念79ObjectEventObjectAWTEventActionEventAdjustmentEventItemEventTextEventInvocationEventAncestorEventComponentEventHierarchyEventInputMethodEventInternalFrameEventContainerEventFocusEventInputEven
58、tPaintEventWindowEventKeyEventMouseEventMenuKeyEventMouseWheelEventMenuDragMouseEvent8.5.3 事件處理(續(xù)) Swing組件的事件對(duì)象Swing 的特點(diǎn)和概念80l 編寫事件處理程序時(shí),要注意三個(gè)概念事件源l與用戶進(jìn)行交互的GUI組件,表示事件來(lái)自于哪個(gè)組件或?qū)ο髄比如要對(duì)按鈕被按下這個(gè)事件編寫處理程序,按鈕就是事件源事件監(jiān)聽器l負(fù)責(zé)監(jiān)聽事件并做出響應(yīng)l一旦它監(jiān)視到事件發(fā)生,就會(huì)自動(dòng)調(diào)用相應(yīng)的事件處理程序作出響應(yīng)事件對(duì)象l封裝了有關(guān)已發(fā)生的事件的信息l例如按鈕被按下就是一個(gè)要被處理的事件,當(dāng)用戶按下按鈕時(shí),
59、就會(huì)產(chǎn)生一個(gè)事件對(duì)象。事件對(duì)象中包含事件的相關(guān)信息和事件源8.5.3 事件處理(續(xù)) 事件處理機(jī)制的三個(gè)部分Swing 的特點(diǎn)和概念81l程序員應(yīng)完成的兩項(xiàng)任務(wù)為事件源注冊(cè)一個(gè)事件監(jiān)聽器實(shí)現(xiàn)事件處理方法8.5.3 事件處理(續(xù)) 程序員應(yīng)完成的兩項(xiàng)任務(wù)Swing 的特點(diǎn)和概念82l 事件源 提供注冊(cè)監(jiān)聽器或取消監(jiān)聽器的方法 維護(hù)一個(gè)已注冊(cè)的監(jiān)聽器列表,如有事件發(fā)生,就會(huì)通知每個(gè)已注冊(cè)的監(jiān)聽器l 一個(gè)事件源可以注冊(cè)多個(gè)事件監(jiān)聽器,每個(gè)監(jiān)聽器又可以對(duì)多種事件進(jìn)行相應(yīng),例如一個(gè)JFrame事件源上可以注冊(cè) 窗口事件監(jiān)聽器,響應(yīng)l 窗口關(guān)閉l 窗口最大化l 窗口最小化 鼠標(biāo)事件監(jiān)聽器,響應(yīng)l 鼠標(biāo)點(diǎn)擊
60、l 鼠標(biāo)移動(dòng)8.5.3 事件處理(續(xù)) 事件源Swing 的特點(diǎn)和概念83l 事件監(jiān)聽器 是一個(gè)對(duì)象,通過事件源的addListener方法被注冊(cè)到某個(gè)事件源上 不同的Swing組件可以注冊(cè)不同的事件監(jiān)聽器 一個(gè)事件監(jiān)聽器中可以包含有對(duì)多種具體事件的專用處理方法l 例如用于處理鼠標(biāo)事件的監(jiān)聽器接口MouseListener中就包含有對(duì)應(yīng)于鼠標(biāo)壓下、放開、進(jìn)入、離開、敲擊五種事件的相應(yīng)方法mousePressed、mouseReleased、mouseEntered、mouseExited、mouseClicked,這五種方法都需要一個(gè)事件對(duì)象作為參數(shù)8.5.3 事件處理(續(xù)) 事件監(jiān)聽器Swing
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ù)字智慧方案青島城陽(yáng)看守所項(xiàng)目案例
- 保健按摩師合集復(fù)習(xí)試題有答案(一)
- 匯編2025年工程法規(guī)的典型考題分享試題及答案
- 詩(shī)城保安考試試題及答案
- 醫(yī)生編制e類考試試題及答案
- 2025年工程法規(guī)考試的思考清單試題及答案
- 審計(jì)中級(jí)考試試題及答案
- 電腦物理試題及答案
- 藥理學(xué)實(shí)訓(xùn)考試試題及答案
- 闖關(guān)樂園考試題及答案
- 喬哈里視窗培訓(xùn)課件
- 冷鏈物流故障處理流程
- 心內(nèi)科危重患者的病情觀察及護(hù)理
- 中考數(shù)學(xué)二輪培優(yōu)訓(xùn)練第09講 等腰三角形與正方形中的半角模型(解析版)
- 2025年山東出版集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 2024年武漢市第二中西醫(yī)結(jié)合醫(yī)院武漢六七二醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 水利專業(yè)技術(shù)崗位競(jìng)聘演講稿
- 初中數(shù)學(xué)新課程標(biāo)準(zhǔn)(2024年版)
- UL9540A標(biāo)準(zhǔn)中文版-2019儲(chǔ)能系統(tǒng)UL中文版標(biāo)準(zhǔn)
- 編輯或出版崗位招聘面試題與參考回答(某大型央企)2024年
- 肺真菌病護(hù)理病例討論
評(píng)論
0/150
提交評(píng)論