




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第四章 圖形編程4.1AWT與Swing簡(jiǎn)介一.AWT工具包java的抽象窗口工具包(AWT:Abstract window Interface)包含在java.awt包中,它提供了許多用來(lái)設(shè)計(jì)GUI的組件類和容器類基本AWT庫(kù)處理用戶界面元素的方法是把這些元素的創(chuàng)建和行為委托給每個(gè)目標(biāo)平臺(tái)上的本地GUI工具箱進(jìn)行處理AWT的層次關(guān)系EventComponentGraphicsMenuComponButtonScrollBarContainerCanvasListCheckBoxLabelTextFieldTextAreaWindowFrameDialogFontAppletPanel二. J
2、ava Swing Swing:非基于對(duì)等體的GUI工具箱Swing具有更豐富并且更方便的用戶界面元素集合Swing對(duì)底層平臺(tái)的依賴更少Swing會(huì)帶來(lái)交叉平臺(tái)上的統(tǒng)一視覺體驗(yàn)Swing類被放在javax.Swing包上Swing 組件層次關(guān)系ComponemtContainerWindowFrameDialogJFrameJDialogJComponentJPanelJLabelJScrollerJMenuBarJButtonJtext.三.AWT與Swing的關(guān)系對(duì)于使用過(guò)Java早期版本的人來(lái)說(shuō),大部分AWT組件都有其Swing等價(jià)物后者的名字一般是在前面添加一個(gè)字母“J”,如:JBut
3、ton,JFrame,JPanel等5.2組件和容器一.組件Java把由Component類的子類或間接子類創(chuàng)建的對(duì)象稱為一個(gè)組件例:Button button1=new Button();例:TextField textfield=new TextField();例:Label label=new Label();二.容器Java把由container類的子類或間接子類創(chuàng)建的對(duì)象稱為一個(gè)容器例:Frame fra=new Frame(“這是一個(gè)窗口”);Applet是Panel的子類,是Container的間接子類Applet本身也是一個(gè)容器三.添加組件Component類提供了一個(gè)方法:a
4、dd();例:fra.add(button);例:fra.add(TextField);容器本身也可以看作是一個(gè)組件,因此可以把一個(gè)容器添加到另一個(gè)容器里,實(shí)現(xiàn)容器嵌套例:add(fra);四。布局管理器Java 采用非常優(yōu)秀的概念來(lái)進(jìn)行布局一個(gè)容器內(nèi)的所有組件都由一個(gè)布局管理器來(lái)進(jìn)行管理Java支持以下四種布局管理器 FlowLayout BorderLayout CardLayout GridBagLayout五.常用容器1.框架在Java中,頂層窗口(沒(méi)有包含在另一個(gè)窗口內(nèi)的窗口)稱為框架AWT庫(kù)中有一個(gè)基于對(duì)等體的Frame類對(duì)應(yīng)著頂層該類的Swing版本為JFrame,JFrame是
5、Frame 子類例:框架是容器的例子 SimpleFrameTest.java import javax.swing.*;public class SimpleFrameTest public static void main(String args) SimpleFrame myframe = new SimpleFrame(); myframe.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); myframe.show(); class SimpleFrame extends JFrame public SimpleFrame() setSi
6、ze(WIDTH, HEIGHT); public static final int WIDTH = 300; public static final int HEIGHT = 200;2.定義相對(duì)框架通過(guò)調(diào)用toolkit來(lái)得到系統(tǒng)相關(guān)信息例:CenteredFrameTest.java例:獲得屏幕尺寸Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize();int screenHeight=screenSize.height;int screenWidth = screenSi
7、ze.width;class CenteredFrame extends JFrame public CenteredFrame() / get screen dimensions Toolkit kit = Toolkit.getDefaultToolkit Toolkit kit = Toolkit.getDefaultToolkit();(); Dimension screenSize = kit.getScreenSize(); Dimension screenSize = kit.getScreenSize(); int screenHeight = screenSize.heigh
8、t; int screenHeight = screenSize.height; int screenWidth = screenSize int screenWidth = screenSize.width;.width; / center frame in screen/ center frame in screen setSize(screenWidth / 2, screenHeight / 2); setSize(screenWidth / 2, screenHeight / 2); setLocation(screenWidth / 4, screenHeight setLocat
9、ion(screenWidth / 4, screenHeight / 4) / 4) / set frame icon and title / set frame icon and title Image img = kit.getImage(icon.gif); Image img = kit.getImage(icon.gif); setIconImage(img); setIconImage(img); setTitle(CenteredFrame setTitle(CenteredFrame);); 3.常見類及方法APIjava.awt.Componentboolean isVis
10、ible()檢查組件是否可見void setVisible(boolean b) 設(shè)置組件可見void setBounds(int x,int y,int width,int height)移動(dòng)并縮放組件Dimension getSize()得到組件的大小void setSize(int width,int height)void setSize(Dimension d) 把組件縮放到指定調(diào)度和寬度 java.awt.windowvoid toFrond()放在其它窗口前面void toBack()放在其它窗口后面java.awt.Framevoid setResizable(boolean
11、b)縮放框架void setTitle(String s)設(shè)置標(biāo)題void setIconImage(Image image) 將Image用作圖標(biāo)java.awt.Toolkit Dimension getScreenSize()得到用戶屏幕大小內(nèi)容窗格是用來(lái)添加組件的,獲得內(nèi)容窗格的代碼如下:在AWT中可調(diào)用add()把組件直接添加到AWT Frame中 ,但在Swing中組件只能添加到內(nèi)容窗格里六.顯示信息前面的例子中 ,信息都顯示在控制臺(tái)窗口,現(xiàn)在我們?cè)囍研畔@示到JFrame中 JFrame的結(jié)構(gòu)有點(diǎn)復(fù)雜,它由:根窗格、布局窗格、透明窗格和內(nèi)容窗格 用戶也可以創(chuàng)建一個(gè)畫板,然后在畫
12、板上進(jìn)行繪制,最后將畫板添加到內(nèi)容窗格里,此時(shí)需要重載paintComponent()paintComponent(Graphics g)是定義在JComponent中,每當(dāng)該方法被調(diào)用時(shí),系統(tǒng)就自動(dòng)產(chǎn)生一個(gè)Graphics類型的參數(shù),傳遞給paintComponent方法中的參數(shù)gContainer cp=getContentPane(); Component c=; cp.add(c);Graphics類提供繪制圖像和輸出文本的方法創(chuàng)建一個(gè)畫板class MyPanel extends JPanel public void paintComponent(Graphics g) super.
13、paintComponent(Graphics g) g.drawString(“Hello!world”) . MyPanel擴(kuò)展了擴(kuò)展了JPanel,但面板的背景但面板的背景顏色等工作要由顏色等工作要由Jpanel來(lái)完成,來(lái)完成,super.paintComponent確保父類也參預(yù)繪制確保父類也參預(yù)繪制只要窗口重新繪制,paintComponent()就被自動(dòng)調(diào)用(在AWT中上paint()例.在畫板上輸出信息NotHelloWorld.javaclass NotHelloWorldFrame extends JFrameclass NotHelloWorldFrame extends
14、JFrame public NotHelloWorldFrame public NotHelloWorldFrame()() setTitle(NotHelloWorld setTitle(NotHelloWorld); ); setSize setSize(WIDTH, HEIGHT);(WIDTH, HEIGHT); / add panel to frame / add panel to frame NotHelloWorldPanelNotHelloWorldPanel panel = new panel = new NotHelloWorldPanel NotHelloWorldPan
15、el();(); Container contentPane = getContentPane(); Container contentPane = getContentPane(); contentPane contentPane.add(panel); .add(panel); class NotHelloWorldPanel extends JPanel class NotHelloWorldPanel extends JPanel public void paintComponent public void paintComponent(Graphics g)(Graphics g)
16、super.paintComponent super.paintComponent(g);(g); g.drawString g.drawString(Not a Hello, World program, (Not a Hello, World program, MESSAGE_X, MESSAGE_Y); MESSAGE_X, MESSAGE_Y); public static final int public static final int MESSAGE_X = 75; MESSAGE_X = 75; public public static final intstatic fina
17、l int MESSAGE_Y = 100; MESSAGE_Y = 100;常用APIjavax.swing.JFrameContainer getContentPane() 返回JFrame的內(nèi)容窗格java.awt.Component void repain() 重新繪制組件void repaint(int x, int y,intwidth,int height) 重新繪制組件的一部分javax.swing.Jcomponentvoid paintComponent(Graphics g)需要重載該方法來(lái)說(shuō)明你的組件應(yīng)如何繪制5.3圖形編程一. 2D圖形 1.2D對(duì)象 隨著SDK2.0
18、版的到來(lái),J2SE了包含一個(gè)Java 2D庫(kù),該庫(kù)實(shí)現(xiàn)了一個(gè)非常強(qiáng)大的圖形操作集如何獲得Graphics 2D類對(duì)象該類是Graphics類的子類,通??捎肎raphics對(duì)象轉(zhuǎn)換而來(lái).例:public void paintComponent(Graphics g) graphics2D g2=(graphics 2D)g; . 2.坐標(biāo) JDK 1.0版中使用整數(shù)像素坐標(biāo)系java 2D形體使用浮點(diǎn)數(shù)坐標(biāo)系,這樣可為坐標(biāo)指定單位。存在的問(wèn)題:Retangle2D r=.; float f=r.getWidth();/*Error*/getWidth()返回double值,應(yīng)進(jìn)行轉(zhuǎn)換: flo
19、at f=(float)r.getWidth();例:DrwaTest.java因此,2D庫(kù)的形體類有兩種版本: Retangle2D.Float Retangle2D.Doubleclass DrawPanel extends JPanel public void paintComponent(Graphics g) super.paintComponent(g); Graphics2D g2 = (Graphics2D)g;/ draw a rectangle double leftX = 100; double topY = 100; double width = 200; double
20、 height = 150; Rectangle2D rect = new Rectangle2D.Double(leftX, topY, width, height); g2.draw(rect); / draw the enclosed ellipse Ellipse2D ellipse = new Ellipse2D.Double(); ellipse.setFrame(rect); g2.draw(ellipse);/ draw a diagonal line g2.draw(new Line2D.Double(leftX, topY, leftX + width, topY + he
21、ight); / draw a circle with the same center double centerX = rect.getCenterX(); double centerY = rect.getCenterY(); double radius = 150; Ellipse2D circle = new Ellipse2D.Double(); circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius); g2.draw(circle); 3.常用APIjava.awt.geom.R
22、etangle2D.DoubleRetangle2D.Float(float x,float y,float width, float height) Ellipse2D.Double(double x,double y, double width,double height)java.awt.geom.Ellipse2D.DoubleRetangle2D.Double(double x,double y, double width,double height)java.awt.geom.Retangle2D.Floatjava.awt.geom.Line2D.DoubleLine2D.dou
23、ble(Point2D start,Point2D end)Line2D.double(double startx,double starty, double endx,double endy)java.awt.geom.Point2D.DoublePoint2D.Double(double x,double y)fill(Graphics2D rec) 填充顏色drawGraphics2D rec) 繪制圖形rec二.顏色Graphics2D類的setPaint方法(Graphics類為setColor方法)用來(lái)設(shè)置顏色。例: g2.setPaint(Color.red); g2.drawS
24、tring(“Set Color”,100,100)1.標(biāo)準(zhǔn)顏色black、blue、cyan、darkgray、gray、green、lightgray、magenta、orange、pink、red、white、yellow2.復(fù)合色通過(guò)指定紅綠藍(lán)三色比例,用Color對(duì)象來(lái)復(fù)合成一種新的顏色。Color構(gòu)造器如下:Color(int redness,int greenness,int blueness) 其中參數(shù)取值為0-2553.常用APIjava.awt.Colorvoid Color(int r,int g,int b)例:g.setPaint(new Color(0,128,12
25、8); java.awt.Graphicsvoid setcolor(Color c)java.awt.Graphic2Dvoid setPaint(paint p) java.awt.Cmponentvoid setBackground(Color c)void setForeground(Color c)例:填充顏色的例子FillTest.javaclass FillPanel extends JPanelclass FillPanel extends JPanel public void paintComponent public void paintComponent(Graphics
26、 g)(Graphics g) super.paintComponent super.paintComponent(g);(g); Graphics2D g2 = (Graphics2D)g; Graphics2D g2 = (Graphics2D)g; / draw a rectangle / draw a rectangle double leftX double leftX = 100; = 100; double topY double topY = 100; = 100; double width = 200; double width = 200; double height =
27、150; double height = 150; Rectangle2D rect Rectangle2D rect = new Rectangle2D.Double = new Rectangle2D.Double (leftX, topY (leftX, topY,width, height);,width, height); g2. g2.setPaintsetPaint(Color.red)(Color.red); ; g2. g2.fillfill(rect(rect);); / draw the enclosed ellipse / draw the enclosed ellip
28、se Ellipse2D ellipse = new Ellipse2D.Double(); Ellipse2D ellipse = new Ellipse2D.Double(); ellipse.setFrame(rect ellipse.setFrame(rect);); g2. g2.setPaintsetPaint(new Color(0, 128, 128);(new Color(0, 128, 128); / a dull blue-green / a dull blue-green g2. g2.fillfill(ellipse);(ellipse); 三.文本和字體1.五個(gè)邏輯
29、字體名SanaSerifSerifMonospacedDialogDialogInput2.字體風(fēng)格Font.PLAIN Font.BOLDFond.ITALIC Fond.BOLD+Font.ITALIC 3.設(shè)置字體Font serif=new Font(“Serif”,Font.BOLD,14);g2.setFont(serif);4.編程控制字體字符輸出的效果取決于下面三個(gè)因素: 使用的字體 字符串 繪制字體的設(shè)備幾個(gè)基本術(shù)語(yǔ): 上坡度下坡度空行 基線基線高度 調(diào)用Graphics2D類中的getFontRenderContext方法,可獲得一個(gè)FontRenderContext類的對(duì)
30、象,再調(diào)用Fond類的getStringBounds方法,該方法返回一個(gè)包圍字符串的矩形.代碼如下:String message=“Hello,World!”;Font f=new Foun(“serif”,Font.BOLD,14);FontRenderContext context= g2. getFontRenderContext();Retangle2D bounds= f. getStringBounds(message,context);獲得字符串寬度、高度、上坡度、下坡度的方法如下:double stringwidth= bounds.getWidth();double stri
31、ngheigth= bounds.getHeigth();double ascent= - bounds.getY();double descent= bounds.getHeigth() +bounds.getY();基點(diǎn)將字符串顯示在面板中央的代碼如下:String message=“Hello,World!”;Font f=new Foun(“serif”,Font.BOLD,14);FontRenderContext context= g2. getFontRenderContext();Retangle2D bounds= f. getStringBounds(message,con
32、text);double x=(getWidth()- bounds. getWidth()/2;double y=(getHeigth()- bounds.getWidth()/2;double ascent= - bounds.getY();double basey=y+ascent;g2.drawString(message, (int)x,(int)basey);例:將字符串顯示在畫板中央的例子 FontTest.javaAPI:java.awt.Font Font(String name,int style,int Size)String getFontName()String ge
33、tFamily()String getName()Retangle2D getStringBounds(String s, FountRenderContext context)java.awt.font.LineMetricsfloat getAscent()float getDecent()float getHeight()float getWeight()java.awt.Graphicsvoid setFont(Font font)void DrawString(String str,int x,int y)四.圖象在Java應(yīng)用程序中須通過(guò)使用Toolkit對(duì)象,調(diào)用getDefau
34、ltToolkit(),完成將一個(gè)圖象文件加載到程序中,再調(diào)用Graphics類提供的DrawImage()顯示它。目前只能讀取gif和JPEG格式的文件下面一段代碼用來(lái)在本地機(jī)上加載一個(gè)名為 msn.jpg的文件:Image img=ToolkitgetDefaultToolkit(). getImage(“msn.jpg”)若從網(wǎng)絡(luò)上加載,必須提供URL例:URL u=new URL( “http:/ img=ToolkitgetDefaultToolkit(). getImage(u)顯示代碼: public void paintComponent(Graphics g) . g.drawImage(img,x,y,null); 圖象的跟蹤加載使用MediaTracker類中的方法addImage()可以將一個(gè)圖象的加載過(guò)程放入媒體跟蹤器,從而實(shí)現(xiàn)對(duì)圖象加載過(guò)程的跟蹤MediaTracker tracker=new MediaTracker(); Image img=ToolkitgetDefaultToolkit(). get
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)訂單收購(gòu)合同范本
- 茶葉采購(gòu)與銷售合同樣本
- 無(wú)子女離婚法律合同文本
- 正式勞動(dòng)合同書范本合同
- 家居用品采購(gòu)及安裝合同范本
- 8安全記心上-119的警示(第3課時(shí))(教學(xué)設(shè)計(jì))2023-2024學(xué)年統(tǒng)編版道德與法治三年級(jí)上冊(cè)
- 10古詩(shī)三首《石灰吟》《竹石》教學(xué)設(shè)計(jì)-2023-2024學(xué)年六年級(jí)語(yǔ)文下冊(cè)統(tǒng)編版
- 人事管理合同樣本大全
- 6《景陽(yáng)岡》教學(xué)設(shè)計(jì)-2023-2024學(xué)年語(yǔ)文五年級(jí)下冊(cè)統(tǒng)編版
- 個(gè)人保證貸款合同范本
- 2025年幾內(nèi)亞水泥廠項(xiàng)目投資可行性報(bào)告
- 口腔門診分診流程
- 2025年春新外研版(三起)英語(yǔ)三年級(jí)下冊(cè)課件 Unit2第1課時(shí)Startup
- 2025年上半年天津市寧河區(qū)事業(yè)單位招聘12人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 心肺復(fù)蘇課件
- 2024-2030年“一帶一路”背景下中國(guó)鐵塊礦產(chǎn)業(yè)未來(lái)發(fā)展趨勢(shì)及投資策略分析報(bào)告
- 鋼包熱修工安全技術(shù)操作規(guī)程(3篇)
- 風(fēng)力發(fā)電廠土建工程施工組織設(shè)計(jì)
- 2024年云南省公務(wù)員錄用考試《行測(cè)》真題卷及答案解析
- 成人缺氧缺血性腦病護(hù)理
- 期末提優(yōu)測(cè)試卷(試題)-2024-2025學(xué)年四年級(jí)上冊(cè)數(shù)學(xué)青島版
評(píng)論
0/150
提交評(píng)論