第7章 图形编程(1).ppt

上传人:s****8 文档编号:66866349 上传时间:2022-12-21 格式:PPT 页数:44 大小:326KB
返回 下载 相关 举报
第7章 图形编程(1).ppt_第1页
第1页 / 共44页
第7章 图形编程(1).ppt_第2页
第2页 / 共44页
点击查看更多>>
资源描述

《第7章 图形编程(1).ppt》由会员分享,可在线阅读,更多相关《第7章 图形编程(1).ppt(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Version 3.0(一)图形窗口与基本绘图(一)图形窗口与基本绘图第七章第七章本次课目标本次课目标创建窗口创建窗口在窗口中绘制图形,文本在窗口中绘制图形,文本控制图形和文本的颜色和字体控制图形和文本的颜色和字体2 2图形编程概述图形编程概述没有图形界面没有图形界面(GUI)的程序只能从键盘接受输入,在控制台的程序只能从键盘接受输入,在控制台屏幕上显示输出。现代的程序早已不是这样。屏幕上显示输出。现代的程序早已不是这样。Java对对GUI的支持:的支持:AWT(Abstractwindowtoolket)界面元素基于本地系统对等体的实现。具有移植方面的局限性,界面元素基于本地系统对等体的实现

2、。具有移植方面的局限性,各平台上的组件行为差异,及丰富程度不同等。各平台上的组件行为差异,及丰富程度不同等。SwingJava第二代图形用户界面组件包,其组件是第二代图形用户界面组件包,其组件是Java自行绘制自行绘制 (Light Weight),不依赖本地系统,元素更丰富,不依赖本地系统,元素更丰富,具有具有LookandFeel。Swing并非完全替代并非完全替代AWT,而是建立在而是建立在AWT的核心机制之上,的核心机制之上,Swing仍仍然使用然使用AWT的事件模型等。的事件模型等。3 31。创建框架。创建框架Java中的中的顶层窗口顶层窗口(即没有被包含在其他窗口(即没有被包含在其

3、他窗口中的窗口,比如中的窗口,比如“主窗口主窗口”)称作)称作框架框架(Frame),对应的对应的Swing类是类是JFrame (Swing中的中的类均以类均以J开头)开头)一个空白框架窗口一个空白框架窗口4 4框架窗口一般具有标题栏,边框,最大最小框架窗口一般具有标题栏,边框,最大最小化按钮等化按钮等“装饰装饰”。Java图形界面应用程序至少拥有一个框架窗图形界面应用程序至少拥有一个框架窗口。口。5 5以下的代码创建一个空白框架以下的代码创建一个空白框架import javax.swing.*;public class firstFrame extends JFrame public st

4、atic void main(String args)firstFrame frame=new firstFrame(first window);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(300,200);frame.setVisible(true);public firstFrame(String s)super(s);创建框架对象创建框架对象指定窗口关闭时指定窗口关闭时的行为的行为指定窗口大小,默认为指定窗口大小,默认为0 x0显示窗口显示窗口,建立后不可见建立后不可见定义我们自己的框架窗口类定义我

5、们自己的框架窗口类6 6JFrame类的继承关系类的继承关系ObjectComponentContainerWindowFrameJFrameJComponentJPanelJLable7 7几个几个JFrame(或其父类的)或其父类的)成员函数:成员函数:setDefaultCloseOperation(intoperation)setLocation(int x,int y)setBounds(int x,int y,int width,int height)setTitle(String s)setSize(int w,int h)setVisible(boolean show)disp

6、ose()释放窗口及子部件的内存资源并使窗口不可见pack()调整窗口使得最适合子部件的排放,并显示窗口(若处于未显示状态)8 8例例2。在屏幕居中显示窗口在屏幕居中显示窗口import javax.swing.*;import java.awt.*;public class firstFrame extends JFrame public static void main(String args)firstFrame frame=new firstFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVis

7、ible(true);public firstFrame()Toolkit kit=Toolkit.getDefaultToolkit();Dimension screenSize=kit.getScreenSize();int screenHeight=screenSize.height;int screenWidth=screenSize.width;setSize(screenWidth/2,screenHeight/2);setLocation(screenWidth/4,screenHeight/4);setTitle(centered frame);9 9有关类有关类Toolkit

8、 类对象类对象是所有是所有AWT的具体实现类的抽象父类。它的的具体实现类的抽象父类。它的子类包含了窗口系统的具体实现和属性。如子类包含了窗口系统的具体实现和属性。如果没有专门在系统属性中指定,则默认的果没有专门在系统属性中指定,则默认的Toolkit为为sun公司的公司的 sun.awt.motif.MToolkit 要获得要获得 Toolkit 对象,可以使用对象,可以使用 Toolkit 类的类的静态静态 getDefaultToolkit 方法。方法。Toolkit getDefaultToolkit():返回缺省工具包返回缺省工具包。1010进一步理解框架关于容器和面板进一步理解框架关

9、于容器和面板1111内容窗格内容窗格每个每个Java图形界面程序都有至少一个图形界面程序都有至少一个顶层容顶层容器器,对于,对于Swing应用程序来说至少有一个应用程序来说至少有一个JFrame作为顶层容器。作为顶层容器。每个顶层容器具有一个每个顶层容器具有一个内容窗格内容窗格(content pane)它一般再包含顶层容器中其)它一般再包含顶层容器中其他可见的图形界面组件。他可见的图形界面组件。content pane是一种是一种JComponent或其子类。或其子类。1212内容窗格内容窗格在窗口中绘制图形文字或放置其他组件等操作的规在窗口中绘制图形文字或放置其他组件等操作的规范做法是在内

10、容窗格中而不是框架中来完成的。范做法是在内容窗格中而不是框架中来完成的。(对于(对于JFrame来说即使直接向其中加入组件也实际来说即使直接向其中加入组件也实际上将加入到它的内容窗格中。)上将加入到它的内容窗格中。)常用的常用的方法之一方法之一:把自定义的组件设为内容窗格。:把自定义的组件设为内容窗格。方法之二方法之二:向内容窗格中加入一个自定义组件并覆:向内容窗格中加入一个自定义组件并覆盖内容窗格的整个区域。盖内容窗格的整个区域。1313JPanelJPanel 组件是一个中间容器组件是一个中间容器用于将小型的轻量级组件组合在一起用于将小型的轻量级组件组合在一起JPanel 的缺省布局为的缺

11、省布局为 FlowLayoutJPanel 具有下列构造函数:具有下列构造函数:JPanel()JPanel(LayoutManager lm)1414继承自继承自JPanel的自定义类的自定义类JPanel是是JComponent的子类,它具有一个能的子类,它具有一个能够在上面进行绘制的表面。它本身够在上面进行绘制的表面。它本身是容器是容器但但不是顶层容器,同时不是顶层容器,同时也是组件也是组件。很适合做内。很适合做内容窗格或覆盖内容窗格区域的组件。容窗格或覆盖内容窗格区域的组件。JFrame中的默认的内容窗格就是一个中的默认的内容窗格就是一个JPanel对象。对象。1515例例3。clas

12、s HelloWorldFrame extends JFrame public HelloWorldFrame()setTitle(HelloWorld application);setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);HelloWorldPanel panel=new HelloWorldPanel();/setContentPane(panel);Container contentPane=getContentPane();contentPane.add(panel);public static final int DEFAULT_WIDTH=300;p

13、ublic static final int DEFAULT_HEIGHT=200;import javax.swing.*;import java.awt.*;public class HelloWorld public static void main(String args)HelloWorldFrame frame=new HelloWorldFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);1616class HelloWorldPanel extends JPane

14、l public void paintComponent(Graphics g)super.paintComponent(g);g.drawString(Hello world!my first GUI program,MESSAGE_X,MESSAGE_Y);public static final int MESSAGE_X=50;public static final int MESSAGE_Y=100;1717JComponent绘制自身的方法绘制自身的方法以以下顺序:以以下顺序:1.paintComponent()2.paintBorder()(如果有边框)(如果有边框)3.paint

15、Children()1818理解理解paintComponent 方法方法paintComponet是图形对象绘制自身的地方,是图形对象绘制自身的地方,系统在需要绘制该对象的时候将调用该方系统在需要绘制该对象的时候将调用该方法。不能自行调用。法。不能自行调用。通过调用通过调用repaint()方法可以间接地令系统调方法可以间接地令系统调用用paintComponent()绘制自定义图形,需要在从绘制自定义图形,需要在从JPanel扩展的自扩展的自定义类中覆盖父类的定义类中覆盖父类的paintComponent()方法方法在扩展类的在扩展类的paintComponent()中一般需要中一般需要调

16、用父类的调用父类的 paintComponent()注:注:paint()方法最终调用方法最终调用paintComponent()1919Graphics类对象类对象paintComponent方法包含一个方法包含一个Graphics类型类型的参数。的参数。Graphics对象记录针对绘制图形和文本的一对象记录针对绘制图形和文本的一系列设置,系列设置,比如设置的图标或当前颜色、比如设置的图标或当前颜色、字体等。字体等。Java中,所有绘制都必须通过一个图形对中,所有绘制都必须通过一个图形对象完成。象完成。2020基本的绘图方法基本的绘图方法 利用利用 Graphics 的常用绘图成员方法有:的

17、常用绘图成员方法有:setColor(someColor);/设置颜色设置颜色setFont(someLimitedFont);/设置字体设置字体drawString(Strings,intx,inty);/绘制字符串绘制字符串drawLine(intx1,inty1,intx2,inty2);/画线画线drawRect(intx,inty,intwidth,intheight);/矩形矩形 fillRect(intx,inty,intwidth,intheight);drawOval(intx,inty,intwidth,intheight);/椭圆椭圆fillOval(intx,inty,

18、intwidth,intheight);2121字体设置,字体设置,Font 类类要要设设置置默默认认字字体体之之外外的的字字体体,需需首首先先创创建建字体对象。再调用字体对象。再调用Graohics的的setFont()Font 类只有一个构造函数类只有一个构造函数:publicFont(Stringname,intstyle,intpointsize)参数参数name表示字体的名称。表示字体的名称。参数参数style表示样式可以是表示样式可以是Font.PLAIN、Font.BOLD或或Font.ITALIC参数参数pointsize表示字体的点数,即以磅为单位的字体表示字体的点数,即以磅

19、为单位的字体大小,可以是大小,可以是 11、12、14、16 等等。publicvoidpaint(Graphicsg).g.setFont(newFont(Helvetica,Font.ITALIC,18);g.drawString(Drawwhereeveryouwant,100,10);.2222使用字体示例使用字体示例1import java.awt.*;import javax.swing.*;class FontsPanel extends JPanel public void paintComponent(Graphics g)String quote=生活是一种态度.;Font

20、 f=new Font(宋体,Font.PLAIN,20);g.setFont(f);g.drawString(quote,75,80);f=new Font(隶书,Font.ITALIC,24);g.setFont(f);g.drawString(quote,75,125);该包中包含该包中包含JPanel和和JFrame组件组件创建一种新字创建一种新字体,并将该字体,并将该字体设置为当前体设置为当前字体字体public class FontsDemo extends JFrame public FontsDemo()setTitle(test);setSize(300,200);Conta

21、iner contentPane=getContentPane();contentPane.add(new FontsPanel();public static void main(String args)FontsDemo frame=new FontsDemo();frame.setVisible(true);2323通过使用通过使用 getFontMetrics()方法,而不是方法,而不是new运算符(因为它是一个抽象类),可以创建运算符(因为它是一个抽象类),可以创建该类的对象。该类的对象。这个对象包含与字体相关的大量信息,包括这个对象包含与字体相关的大量信息,包括字符的高度、按像素数

22、计算的字符串宽度等。字符的高度、按像素数计算的字符串宽度等。常用方法如下:常用方法如下:intstringWidth(Strings):返回返回字符串宽度字符串宽度intcharWidth(charc):返回字符返回字符c c的宽度的宽度intgetHeight():返回字体的高度返回字体的高度FontMetrics 类类有有时时,需需要要测测量量用用特特殊殊字字体体显显示示的的一一个个字字符符串串,可以使用可以使用FontMetrics 类类2424使用字体示例使用字体示例2importjava.awt.*;importjavax.swing.*;classFonts2Panelextend

23、sJPanelpublicvoidpaintComponent(Graphicsg)Stringmyquote=Happinessisanattitude.;Fontf=newFont(TimesNewRoman,Font.BOLD+Font.ITALIC,24);g.setFont(f);FontMetricsfm=getFontMetrics(f);intx=(getSize().width-fm.stringWidth(myquote)/2;inty=getSize().height/2;g.drawString(myquote,x,y);创建一种新字创建一种新字体,并设为当体,并设为当

24、前字体前字体求字符串宽求字符串宽度度2525有关的类有关的类GraphicsEnvironmentGraphicsEnvironmentGraphicsDeviceGraphicsDeviceGraphicsDevicescreen1screen2printer1GraphicsConfiguration绘图模式,能力等属性绘图模式,能力等属性2626利用利用GraphicsEnvironment 列出当前平台上所有可用字体列出当前平台上所有可用字体importjava.awt.*;publicclassListFontspublicstaticvoidmain(Stringargs)Grap

25、hicsEnvironmentenv=GraphicsEnvironment.getLocalGraphicsEnvironment();StringfontNames=env.getAvailableFontFamilyNames();System.out.println(可用字体:可用字体:);for(inti=0;ifontNames.length;i+)System.out.println(+fontNamesi);2727颜色颜色java.awt.Color 类提供了类提供了1313个可用作标准颜色个可用作标准颜色的常量:的常量:black(黑色)黑色)green(绿色)绿色)red

26、(红色)红色)blue(蓝色)蓝色)lightGray(浅灰色)浅灰色)white(白色)白色)cyan(蓝绿色)蓝绿色)magenta(洋红色)洋红色)yellow(黄色)黄色)darkGray(深灰色)深灰色)orange(橙色)橙色)gray(灰色)灰色)pink(粉红色)粉红色)2828Color类的构造函数类的构造函数Color类的构造函数如下:类的构造函数如下:-Color(intred,intgreen,intblue):使使用用三三个个分分别别代代表表红红、绿绿、蓝蓝的的整整数数来来表表示示它它们们混混合的颜色。这些值必须在合的颜色。这些值必须在0 0到到255255之间。之间

27、。-Color(float red,float green,floatblue):用三个浮点数指定红、绿、蓝的相对混合。用三个浮点数指定红、绿、蓝的相对混合。Colora=newColor(0.907F,2F,0F);Colorb=newColor(255,255,0);2929如如果果要要修修改改或或设设置置组组件件的的颜颜色色,可可以以使使用用下下列列几几种方法:种方法:Graphics类的类的voidsetColor(ColornewColor):设置当前绘制设置当前绘制的颜色的颜色 Component 类类的的voidsetForeground(Color):设置前景色设置前景色voi

28、dsetBackground(Color):设置背景色设置背景色 设置颜色方法设置颜色方法3030使用颜色示例使用颜色示例importjava.awt.*;importjavax.swing.*;classColorsPanelextendsJPanelpublicvoidpaintComponent(Graphicsg)Fontf=newFont(Georgia,Font.ITALIC,16);g.setFont(f);g.setColor(Color.red);g.drawString(Hello,75,100);g.setColor(newColor(0,128,128);g.drawS

29、tring(World,75,125);3131绘制图形绘制图形 2-1使用使用 AWT 时,通常通过调用时,通常通过调用 Graphics 对象对象的的 drawXxx 或或 fillXxx 方法来绘制图形。方法来绘制图形。通过通过drawXxx方法绘制方法绘制图形边框,通过图形边框,通过fillXxx 方法绘制方法绘制填充图形。填充图形。这些对象用这些对象用当前选择的颜色当前选择的颜色来绘制和填充,来绘制和填充,黑色是默认的颜色。黑色是默认的颜色。3232使用线条绘制图形使用线条绘制图形java.awt.Graphics中提供了一些方法用来绘中提供了一些方法用来绘制图形对象中的直线和多边形

30、。方法如下:制图形对象中的直线和多边形。方法如下:void drawLine(int startX,int startY,int entX,int endY):绘制一绘制一条直线条直线 void drawPolygon(int x,int y,int numpoints):绘制多边形绘制多边形轮廓轮廓 void fillPolygon(int x,int y,int numpoints):绘制填充多边形绘制填充多边形 void drawPolyline(int x,int y,int numpoints):绘制顺序连线,绘制顺序连线,如果第一个点和最后一个点不同,该图形不封闭如果第一个点和最后

31、一个点不同,该图形不封闭3333绘制矩形和椭圆绘制矩形和椭圆 void drawRect(int top,int left,int width,int height):绘制矩形边框绘制矩形边框void fillRect(int top,int left,int width,int height):绘制填充矩形绘制填充矩形void drawOval(int top,int left,int width,int height):绘制椭圆边框绘制椭圆边框void fillOval(int top,int left,int width,int height):绘制填充椭圆绘制填充椭圆3434绘图示例绘

32、图示例classShapesPanelextendsJPanelpublicvoidpaintComponent(Graphicsg)super.paintComponent(g);g.drawLine(0,0,100,100);/画线画线g.drawRect(10,10,60,30);/绘制矩形绘制矩形g.drawRoundRect(90,80,80,80,20,20);/绘制圆角矩形绘制圆角矩形intxpoints=20,50,60,30,10;intypoints=50,50,70,90,70;g.drawPolygon(xpoints,ypoints,5);/绘制多边形绘制多边形g.s

33、etColor(Color.red);/设置颜色设置颜色g.fillRect(90,10,80,30);/绘制填充矩形绘制填充矩形g.fillRoundRect(180,50,100,80,15,15);/绘制填充圆角矩形绘制填充圆角矩形g.fillOval(10,100,80,30);/绘制填充椭圆绘制填充椭圆 3535绘图模式绘图模式XOR 模式的优点是,无论用什么颜色绘制对模式的优点是,无论用什么颜色绘制对象,始终能够保证新对象是可见的。象,始终能够保证新对象是可见的。语法如下所示:语法如下所示:void setXORMode(Color xorColor)其中,其中,xorColor

34、指定了绘制对象时与窗口进指定了绘制对象时与窗口进行异或操作的颜色。行异或操作的颜色。要返回至覆盖模式,请调用要返回至覆盖模式,请调用 setPaintMode():void setPaintMode()绘绘图图模模式式决决定定了了对对象象是是如如何何被被画画在在窗窗口口中中的的。默默认认情情况况下下,对对一一个个窗窗口口的的新新的的输输出出将将覆覆盖盖该该窗窗口口中中的的任任何已经存在的内容。何已经存在的内容。3636importjava.awt.*;importjavax.swing.*;classXORPanelextendsJPanelpublicvoidpaintComponent(G

35、raphicsg)super.paintComponent(g);g.setColor(Color.red);g.fillRect(10,10,80,30);g.setColor(Color.green);g.fillRect(50,20,80,30);g.setXORMode(Color.blue);/设置为设置为XOR绘图模式绘图模式g.fillOval(90,30,80,30);设置绘图模式示例设置绘图模式示例3737显示图像文件显示图像文件1.ImageIO类含有一系列读写图像文件的静态方法。类含有一系列读写图像文件的静态方法。如:如:BufferedImageread(Fileinp

36、ut)从文件读入Image对象Applet 类类 也有读取图象的方法,也有读取图象的方法,publicImagegetImage(URLurl)2.在在JPanel的的paintComponet方法中用方法中用Graphics类类的的drawImage方法方法绘绘制制图图像。像。booleandrawImage(Imageimg,intx,inty,ImageObserverobs)(ImageObserver是一个接口,支持异步图象读取,Component类及其子类实现了此接口)CopyArea()方法可以复制窗口内的方法可以复制窗口内的图图象象voidcopyArea(intx,inty,

37、intwidth,intheight,intdx,intdy)dx,dy:从源到目标的距离3838Graphics对象的局限性对象的局限性可以用可以用Graphics对象绘制图形的功能有限。对象绘制图形的功能有限。例如:例如:不能绘制虚线或宽度不定的线条不能绘制虚线或宽度不定的线条 不能对图形进行旋转不能对图形进行旋转 不能使用纹理或渐变颜色填充形体不能使用纹理或渐变颜色填充形体3939Graphics2D介绍介绍Java2D 包括一个包括一个 Graphics2D 类,它是类,它是 Graphics 类的子类,所有图形方法都可以配类的子类,所有图形方法都可以配合合 Graphics2D 对象

38、使用对象使用Java 2D 图形的重要功能:图形的重要功能:颜色和图案:图形可以用渐变颜色和填充图案着色。颜色和图案:图形可以用渐变颜色和填充图案着色。透明绘制:图形的不透明度通过透明绘制:图形的不透明度通过 透明值控制。透明值控制。本地字体:平台上的所有本地字体都可用于绘制文本。本地字体:平台上的所有本地字体都可用于绘制文本。画笔的显式控制:可以使用线条的粗细、虚线图案以及画笔的显式控制:可以使用线条的粗细、虚线图案以及段连接样式。段连接样式。坐标系的转换:可以使用平移、缩放、旋转和剪切坐标系的转换:可以使用平移、缩放、旋转和剪切 为为了了解解决决图图形形对对象象的的局局限限性性,在在Jav

39、a1.1以以后后的版本中引入了的版本中引入了Java 2D。4040绘制图形绘制图形 2-2在在 Java 2D 中,通常先创建中,通常先创建 Shape 对象,然对象,然后调用后调用 Graphics2D 对象的对象的 draw 或或 fill 方法。方法。Java 2D 库以面向对象的方式组合几何形体。库以面向对象的方式组合几何形体。java.awt.geom包中囊括了一些有用的包中囊括了一些有用的Shape实实现。如现。如:Line2DRectangle2DEllipse2D4141Java 2D 中的基本绘图方法中的基本绘图方法publicvoidpaintComponent(Grap

40、hicsg)super.paintComponent(g);Graphics2Dg2d=(Graphics2D)g;/强制转换为强制转换为Graphics2Dg2d.setPaint(fillColorOrPattern);g2d.setStroke(penThicknessOrPattern);g2d.setComposite(someAlphaComposite);g2d.setFont(anyFont);g2d.setColor(anyColor);g2d.translate(.);g2d.rotate(.);g2d.scale(.);g2d.shear(.);g2d.setTransf

41、orm(someAffineTransform);SomeShapes=newSomeShape(.);g2d.draw(s);/绘制图形轮廓绘制图形轮廓g2d.fill(s);/绘制填充图形绘制填充图形4242Java2D示例:示例:4343总结总结 2-1JFrame 和和JPanel的使用的使用Graphics 类用于在屏幕上绘制诸如文本、线条、类用于在屏幕上绘制诸如文本、线条、矩形和椭圆的对象。矩形和椭圆的对象。Font 类用于使类用于使 Java 程序输出结果中的文本显得程序输出结果中的文本显得更生动。更生动。Color 类用于向应用程序或小应用程序组件添加类用于向应用程序或小应用程序组件添加颜色。颜色。绘图模式决定了对象如何被画在窗口中。绘图模式决定了对象如何被画在窗口中。可以可以使用使用 Toolkit 对象将图形文件读入应用程序。对象将图形文件读入应用程序。4444

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁