1、第十章第十章 文本显示与图形图像处理文本显示与图形图像处理 第1章走马观花看Java立体化教材计算机系列 Java程序设计程序设计 3 立体化教材计算机系列 Java程序设计程序设计 4本章知识重点3132GUI组件及Graphics类的绘图方法 33字体设置34基本图形绘制的各方法及画布CanvasJava图像处理35与图形图像处理相关的类 立体化教材计算机系列 Java程序设计程序设计 5本章知识难点33基本图形绘制的各方法及画布Canvas343132GUI组件及Graphics类的绘图方法 字体设置及颜色设置图像的静态、动态处理立体化教材计算机系列 Java程序设计程序设计 6Java
2、绘图基础 JavaJava的绘图机制的绘图机制 与图形图像处理相关的类与图形图像处理相关的类 javajava中支持图形图像处理的类与接口主要定义于中支持图形图像处理的类与接口主要定义于java.awtjava.awt类库中类库中31立体化教材计算机系列 Java程序设计程序设计 7Java绘图基础GraphicsGraphics类类 GraphicsGraphics类中封装了几乎所有的图形处理的方法,该类用于在类中封装了几乎所有的图形处理的方法,该类用于在一个二维坐标系中绘制图形与显示格式化文字。由于一个二维坐标系中绘制图形与显示格式化文字。由于GraphicsGraphics类定义于类定义
3、于java.awtjava.awt包中,在绘制图形的程序中,必须引入包中,在绘制图形的程序中,必须引入java.awtjava.awt,即在程序开头需加上以下语句:,即在程序开头需加上以下语句:import java.awt.import java.awt.*;或或import java.awt.Graphicsimport java.awt.Graphics;32立体化教材计算机系列 Java程序设计程序设计 8Java绘图基础 Graphics Graphics类的绘图区域为能够绘制并显示图形的一些组件,类的绘图区域为能够绘制并显示图形的一些组件,坐标原点在组件的左上角,坐标原点在组件的左
4、上角,X X轴为水平方向,坐标值从左轴为水平方向,坐标值从左至右逐渐增大,至右逐渐增大,Y Y轴在垂直方向,坐标值从上向下逐渐增轴在垂直方向,坐标值从上向下逐渐增大。大。JavaJava坐标的度量单位是像素,在坐标的度量单位是像素,在JavaJava的图形坐标系的图形坐标系统中,坐标值只能为整数。由于不同的平台具体实现绘统中,坐标值只能为整数。由于不同的平台具体实现绘图功能中存在着一定差异,图功能中存在着一定差异,GraphicsGraphics类为抽象类,不能类为抽象类,不能用用newnew命令创建命令创建GraphicsGraphics类实例对象,类实例对象,JavaJava只提供给用户只
5、提供给用户一个不依赖于具体平台的通用接口,使用户能够调用一个不依赖于具体平台的通用接口,使用户能够调用GraphicsGraphics类的各种绘图方法,实现绘图与绘制文本的功类的各种绘图方法,实现绘图与绘制文本的功能。能。立体化教材计算机系列 Java程序设计程序设计 9Java绘图基础 GUI程序中,文本的输出显示是作为图形对象来处理的,控制台应用程序中的System.out.println()方法,只能以DOS字符的形式,在命令行窗口上显示文字。GUI界面中字符串信息的显示,要使用Graphics或Graphics2D提供的绘制字符或字符串信息的成员方法。图形文本图形文本33立体化教材计算
6、机系列 Java程序设计程序设计 10Java绘图基础Graphics类提供了三种绘制文字的方法:字符串输出方法:drawString(String s,int x,int y)。字符数组输出方法:drawChars(char s,int offset,int length,int x,int y)。字节数组输出方法:drawBytes(byte s,int offset,int length,int x,int y)。其中x、y参数为字符串输出的位置坐标。例如:g.drawString(“我的爱好是读书和听音乐”,50,100);语句将会绘出一串文本,输出位置坐标为(50,100)。立体化教
7、材计算机系列 Java程序设计程序设计 11Java绘图基础 GUI编程中,Color类定义了操作颜色的常量与方法,该类的完整包路径为java.awt.Color。Color类常用的三种构造方法的定义为:public Color(int r,int g,int b);public Color(float r,float g,float b);public Color(int rgb);Color类中封装了常用的13种标准颜色的符号常量。如:Color.BLACK Color.WHITE Color.RED Color.GREEN Color.BLUE Color.YELLOW 等颜色设置颜色设
8、置34立体化教材计算机系列 Java程序设计程序设计 12Java绘图基础此外,Color类还提供了获取RGB颜色分量的对应方法:public int getRed();/获取当前颜色的红色分量值(范围为0,255)。public int getGreen();/获取当前颜色的绿色分量值(范围为0,255)。public int getBlue();/获取当前颜色的蓝色分量值(范围为0,255)。立体化教材计算机系列 Java程序设计程序设计 13Java绘图基础 如创建一个以粉红色pink(RGB值为:255,175,175)前景显示“姓名”的标签对象,可用以下语句实现:Color labe
9、lColor=new Color(255,175,175);Label lblName=new Label(“姓名”);lblName.setForeground(labelColor);或者用以下等价的方式实现:Label lblName=new Label(“姓名”);lblName.setForeground(Color.PINK);立体化教材计算机系列 Java程序设计程序设计 14Java绘图基础 java.awt.Component类作为大多数GUI组件的基类,定义了paint()方法,用来实现在组件上绘制图形的功能。applet小程序的基类:Applet或Japplet,也间接地
10、由Component类派生,因此applet小程序也具有paint()方法 paint()方法定义:void paint(Graphics g);paint()方法通常由系统自动调用,用户一般不能直接在程序中显式调用它,而是通过repaint()方法来间接调用它。组件首次显示外观时,applet小程序在被加载运行时,系统都会调用相关的paint()方法。GUIGUI组件的绘图方法组件的绘图方法ComponentComponent类与类与paint()paint()方法方法 31立体化教材计算机系列 Java程序设计程序设计 15Java绘图基础此外,Component类中还定义了另外两个直接或
11、间接调用paint()方法的方法:更新方法update(Graphics g);当组件的尺寸、外观等被改变时,系统将调用此方法,重新绘制组件。update()方法的实现中包含了对paint()方法的调用。重绘方法repaint();该方法没有参数,执行时会清除组件的原有背景图形,并使用paint()方法重新绘制该组件。用户可以在程序中直接调用repaint()方法,当组件为轻量级组件时,该方法会直接调用paint()方法,否则会通过调用update()方法间接调用paint()方法。立体化教材计算机系列 Java程序设计程序设计 16Java绘图基础【例】在一个300200的Frame窗口内,
12、用红色绘制四叶玫瑰曲线。立体化教材计算机系列 Java程序设计程序设计 17Java绘图基础import java.awt.*;import java.awt.event.*;import java.awt.Color;public class Exa_10_1 extends Frame private static final double PI=3.1415926;private int appWidth,appHeight;public Exa_10_1(String title)super(title);this.setSize(300,200);/实现关闭窗口的功能 this.ad
13、dWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0););立体化教材计算机系列 Java程序设计程序设计 18Java绘图基础public void paint(Graphics g)super.paint(g);/调用父类的绘制方法 /获取当前窗口的宽度与高度值 appWidth=this.getWidth();appHeight=this.getHeight();int ox,oy,x,y;/设置原点(ox,oy)的坐标为当前窗口中心 ox=appWidth/2;o
14、y=appHeight/2;g.setColor(Color.RED);/设置绘图的前景色 立体化教材计算机系列 Java程序设计程序设计 19Java绘图基础/绘制坐标轴 g.drawLine(ox,10,ox,appHeight);g.drawLine(0,oy,appWidth,oy);/定义控制角度与半径变化的变量 int i,j=10;double angle,r;while (j100)for(i=0;i1023;i+)/计算最新的角度 angle=i*PI/512;r=j*Math.sin(2*angle);立体化教材计算机系列 Java程序设计程序设计 20Java绘图基础/计
15、算最新的轨迹点坐标 x=(int)Math.round(r*Math.cos(angle)*2);y=(int)Math.round(r*Math.sin(angle);g.fillOval(ox+x,oy+y,1,1);/画轨迹点 j=j+5;/增进的步长 public static void main(String args)Exa_10_1 app=new Exa_10_1(Paint()Method Usage);app.setVisible(true);立体化教材计算机系列 Java程序设计程序设计 21Java绘图基础 组件的基类组件的基类ComponentComponent类提供
16、了一组类提供了一组getget类型的方法用来获类型的方法用来获取当前绘图上下文环境的一些重要参数。取当前绘图上下文环境的一些重要参数。getGraphics()getGraphics()为当前组件创建为当前组件创建 graphicsgraphics上下文环境上下文环境getGraphicsConfiguration()getGraphicsConfiguration()获取相关的获取相关的GraphicsGraphics设置设置getForeground()getForeground()获取与当前组件的前景颜色获取与当前组件的前景颜色getBackground()getBackground()
17、获取与当前组件的背景颜色获取与当前组件的背景颜色getFont()getFont()获取与当前组件的字体对象获取与当前组件的字体对象getFontMetrics(Font font)getFontMetrics(Font font)获取指定字体的样式信息获取指定字体的样式信息ComponentComponent类的类的get/setget/set方法组方法组32立体化教材计算机系列 Java程序设计程序设计 22Java绘图基础Component类还提供了一组用来设置外观与行为的set方法:setEnabled(),设置组件的可用性。setVisible(),设置组件的可见性。setForeg
18、round(),设置组件的前景色。setBackground(),设置组件的背景色。setBounds(),设置组件的起始位置与尺寸大小。setLocation(),设置组件的起始位置。setSize(),设置组件的尺寸大小。setPreferredSize(),设置组件首选的尺寸。setMaximumSize(),设置组件的最大尺寸。setMinimumSize(),设置组件的最小尺寸。此外,常用的还有一个设置组件显示文字字体类型与样式的一个方法:public void setFont(Font f)。立体化教材计算机系列 Java程序设计程序设计 23Java绘图基础【例】用组件的getG
19、raphics()方法实现如下所述的功能:在一个300200的JFrame窗口内,放置一个标签与一个按钮,当点击按钮后,标签中绘制一个黄色的椭圆,并在椭圆内显示蓝色的RGB值。立体化教材计算机系列 Java程序设计程序设计 24Java绘图基础import java.awt.*;import java.awt.event.*;import java.awt.Color;import javax.swing.*;public class Exa_10_2 extends JFrame implements ActionListener private JLabel jlblDraw=new JL
20、abel();private JButton jbtnDraw=new JButton(开始绘图);public Exa_10_2(String title)super(title);this.setSize(300,200);jlblDraw.setSize(300,150);/实现关闭窗口的功能 立体化教材计算机系列 Java程序设计程序设计 25Java绘图基础this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jbtnDraw.addActionListener(this);Container contentPane=this.get
21、ContentPane();contentPane.setLayout(new BorderLayout();contentPane.add(jlblDraw,BorderLayout.CENTER);contentPane.add(jbtnDraw,BorderLayout.SOUTH);/按钮点击事件响应方法 public void actionPerformed(ActionEvent e)/创建标签的Graphics上下文环境 Graphics g=jlblDraw.getGraphics();立体化教材计算机系列 Java程序设计程序设计 26Java绘图基础/用黄色画一填充椭圆 g
22、.setColor(Color.YELLOW);g.fillOval(50,10,200,130);/用蓝色显示当前颜色的字符串 g.setColor(Color.BLUE);g.drawString(g.getColor().toString(),65,75);/使按钮变得不再可用 jbtnDraw.setEnabled(false);public static void main(String args)Exa_10_2 app=new Exa_10_2(getGraphics()Method Usage);app.setVisible(true);立体化教材计算机系列 Java程序设计程
23、序设计 27Java绘图基础paintComponent(),用来绘制几何图形,渲染图形文字。paintComponent()方法的原型定义如下:protected void paintComponent(Graphics g);JComponent类的paintComponent()方法与Component类的paint()具有完全相同的参数形式,两种方法的功能与使用也基本类似。JComponentJComponent类与类与paintComponent()paintComponent()方法方法 33立体化教材计算机系列 Java程序设计程序设计 28Java绘图基础 Swing应用中,经
24、常会在JPanel组件中绘制图形。通常的做法是:定义一个JPanel类的子类,在该子类中覆盖/重写类的paintComponent()方法,在方法体内放入绘图的操作语句。然后再将该JPanel组件添加到主窗口的内容窗格(ContentPane)内。具体的实现结构类似于如下的代码:class drawPanel extends Jpanel public void paintComponent(Graphics g)/super.paintComponent(g);/相关的图形或文字绘制语句 立体化教材计算机系列 Java程序设计程序设计 29字体设置 一个Font类的对象表示了一种字体显示效果
25、,包括字体类型、Font MyFont=new Font(TimesRoman,Font.BOLD,12);MyFont对应的是12磅TimesRoman类型的黑体字,其中指定字型时要用到Font类三个常量:Font.PLAIN,Font.BOLD,Font.ITALIC。如果希望使用该Font对象,则可以利用Graphics类的setFont()方法:g.setFont(MyFont);如果希望指定控制组件,如按钮或文本框中的字体效果,则可以使用控制组件的方法setFont()。如设btn是一个按钮对象,则语句:btn.setFont(MyFont);另外,与setFont()方法相对的ge
26、tFont()方法将返回当前Graphics或组件对象使用的字体。FontFont类类立体化教材计算机系列 Java程序设计程序设计 30字体设置【例】获取当前系统中所有可用字体的名称,在标签中显示出这些可用字体的数目,在文本区中显示出这些可用字体的名称。立体化教材计算机系列 Java程序设计程序设计 31字体设置import java.awt.*;import javax.swing.*;import java.awt.event.*;public class Exa_10_4 extends JFrame implements ActionListener /定义GUI所涉及的组件 JLa
27、bel jlblTotalFonts=new JLabel();JButton jbtnDisp=new JButton(显示当前可用字体名称);JTextArea jtxtaFontNames=new JTextArea();JScrollPane jsclpane4txtArea=new JScrollPane(jtxtaFontNames);立体化教材计算机系列 Java程序设计程序设计 32字体设置 public Exa_10_4(String title)super(title);jbtnDisp.addActionListener(this);/为标签组件设置前景色为红色 jlbl
28、TotalFonts.setForeground(new Color(255,0,0);/设置文本区组件为不可编辑状态 jtxtaFontNames.setEditable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/添加各个组件到窗口的内容窗格中 Container contentPane=this.getContentPane();contentPane.setLayout(new BorderLayout();contentPane.add(jlblTotalFonts,BorderLayout.NORTH);立
29、体化教材计算机系列 Java程序设计程序设计 33字体设置contentPane.add(jsclpane4txtArea,BorderLayout.CENTER);contentPane.add(jbtnDisp,BorderLayout.SOUTH);this.setSize(300,300);this.setVisible(true);/响应按钮点击事件 public void actionPerformed(ActionEvent e)jbtnDisp.setEnabled(false);/使自己失效以免两次被点击 String availableFontNames;/获取当前平台可用
30、的字体集 GraphicsEnvironment ge=GraphicsEnvironment.立体化教材计算机系列 Java程序设计程序设计 34字体设置getLocalGraphicsEnvironment();availableFontNames=ge.getAvailableFontFamilyNames();/当前平台可用字体的总数 int total=availableFontNames.length;jlblTotalFonts.setText(当前平台系统可用的字体总数为:+total+);/将当前平台可用字体名称添加到文本区中 for(int k=0;ktotal;k+)jt
31、xtaFontNames.append(availableFontNamesk+n);public static void main(String args)new Exa_10_4(Font Usage Demo);立体化教材计算机系列 Java程序设计程序设计 35字体设置FontMetrics类定义了字体的规格对象,提供了比Font类更详尽的特定字体的描述信息。这些信息可以通过调用FontMetrics类的相关方法来获得。FontMetrics类提供了获取文字样式中各类规格信息的成员方法。创建FontMetrics类对象要通过调用Graphics类的getFontMetrics()方法来
32、实现。如:public void paint(Graphics g)FontMetrics fm=g.getFontMetrics();FontMetricsFontMetrics类类立体化教材计算机系列 Java程序设计程序设计 36字体设置【例】编程实现演示FontMetrics类的字体规格信息。用一根粗黑线表示Baseline,另外三根分别表示字体的Leading、Ascent和Descent的位置。窗口顶端包含输入显示文本内容的文本域及三个用来选择字体名称、字体样式及字号的组合列表框。当在文本域中输入新的内容并敲回车,或者改变了任何一个组合列表框的当前选择,都会使字体规格信息的演示内容
33、发生变化。立体化教材计算机系列 Java程序设计程序设计 37Graphics绘图 利用Graphics类可绘制的图形有直线、各种矩形、多边形、圆和椭圆等。下面的例子综合了这些方法。GraphicsGraphics类的绘图方法类的绘图方法立体化教材计算机系列 Java程序设计程序设计 38Graphics绘图import java.awt.*;import java.applet.Applet;public class DrawFigures extends Applet public void paint(Graphics g)g.drawLine(30,5,40,5);/画直线 g.dra
34、wRect(40,10,50,20);/画矩形框(左上角x坐标,y坐标,x轴尺寸,y轴尺寸)g.fillRect(60,30,70,40);/画实心矩形 g.drawRoundRect(110,10,130,50,30,30);/画圆角矩形框 g.drawOval(150,120,70,40);/画椭圆形框(左上角x坐标,左上角y坐标,x轴尺 寸,y轴尺寸),若x 轴尺寸与y轴尺寸相等,则画出圆形 g.fillOval(190,160,70,40);/画实心椭圆立体化教材计算机系列 Java程序设计程序设计 39Graphics绘图 g.drawOval(90,100,50,40);/画椭圆框
35、 g.fillOval(130,100,50,40);/画实心椭圆 drawMyPolygon(g);/自定义的画多边形的方法 g.drawString(They are figures!,100,220);public void drawMyPolygon(Graphics g)int xCoords=30,50,65,119,127;/保存多边形各点x坐标的数组 int yCoords=100,140,127,169,201;/保存多边形各点y坐标数组 g.drawPolygon(xCoords,yCoords,5);/画自由多边形框 立体化教材计算机系列 Java程序设计程序设计 40G
36、raphics绘图 要在Java程序图形界面的容器中绘制图形,首先,需要明确希望绘制的图形是什么,是圆、椭圆,还是直线,这由所选定的方法来确定;其次,需要指明所绘制图形或文字的大小和位置,立体化教材计算机系列 Java程序设计程序设计 41Graphics绘图绘制直线的方法格式为:drawline(int x1,int y1,int x2,int y2)。其中整型参数对(x1,y1)代表直线的起点,(x2,y2)代表直线的终点。基本图形绘制基本图形绘制 点点(Point)(Point)直线直线(Line)(Line)3132立体化教材计算机系列 Java程序设计程序设计 42Graphics绘
37、图【1】普通矩形线条方式:drawRect(int x,int y,int w,int h)填充方式:fillRect(int x,int y,int w,int h)【参数说明】(x,y)为矩形的左上角坐标;w为矩形的宽度;h为矩形的高度。drawRect()和fillRect()方法的唯一不同之处在于:fillRect()方法画出矩形框后用前景色将其填充。矩形矩形(Rectangle)(Rectangle)33 Graphics类中提供了三种矩形类型。这三类矩形都包括线条 方式与填充方式两类绘图方法。立体化教材计算机系列 Java程序设计程序设计 43Graphics绘图【2】圆角矩形线条
38、方式:drawRoundRect(int x,int y,int w,int h,int arcWidth,int arcHeight)填充方式:fillRoundRect(int x,int y,int w,int h,int arcWidth,int arcHeight)【参数说明】圆角性质参数arcWidth与arcHeight,分别代表了圆角弧对应椭圆的的长轴(水平轴)与短轴(垂直轴)。圆角矩形的圆角性质参数的意义见图10.12。当arcWidth=w且arcHeight=h时,圆角矩形就成为一个椭圆。因此可用绘制圆角矩形的方法生成椭圆。立体化教材计算机系列 Java程序设计程序设计
39、44Graphics绘图【3】立体矩形线条方式:draw3DRect(int x,int y,int w,int h,boolean raised)填充方式:fill3DRect(int x,int y,int w,int h,boolean raised)【参数说明】布尔型的raised参数用来控制立体矩形的凸出或凹入效果。raised为true时,画出的立体矩形是凸起的;raised为false时,画出的立体矩形是凹陷的。立体化教材计算机系列 Java程序设计程序设计 45Graphics绘图椭圆绘制方法与普通矩形的方法在形式上相同的,这是因为椭圆的规格大小是用它的外接矩形来指定的。线条方
40、式:drawOval(int x,int y,int w,int h)填充方式:fillOval(int x,int y,int w,int h)【参数说明】x、y参数代表椭圆外接矩形的左上角位置坐标。参数w、h代表椭圆外接矩形的宽度和高度。椭圆椭圆(Oval)(Oval)34立体化教材计算机系列 Java程序设计程序设计 46Graphics绘图圆弧是椭圆的一部分,夹在两个角之间,因此画圆弧的方法比画椭圆的方法多了两个角度参数(都以角度为单位):起始角和张角。起始角确定了圆弧的起始位置,张角确定了圆弧的大小。张角可正可负,当取正值时,画出的为沿逆时针方向的圆弧;取负值时,画出的为沿顺时针方向
41、的圆弧。当张角取值大于360时,画出的就是椭圆。圆弧圆弧(Arc)(Arc)35立体化教材计算机系列 Java程序设计程序设计 47Graphics绘图drawArc()方法画出的是一段圆弧,而fillArc()方法画出的是一个扇形。线条方式:drawArc(int x,int y,int w,int h,int startAngle,int arcAngle)填充方式:fillArc(int x,int y,int w,int h,int startAngle,int arcAngle)【参数说明】前四个参数x、y、w和h规定了圆弧所对应椭圆的规格大小。startAngle表示圆弧的起始角。
42、arcAngle表示圆弧的张角,可取正负整数值代表有方向的角度。立体化教材计算机系列 Java程序设计程序设计 48Graphics绘图 线条方式画出的多边形一般是不封闭的,除非首顶点与尾顶点坐标值一样。但填充方式画出的填充多边形则为封闭的多边形,因为填充不应该溢出多边形的有效范围。根据绘制所采用的数据表达方式的不同,多边形的绘制方法可分为两组,每一组又具有线条与填充两种绘制方式。多边形多边形(Polygon)(Polygon)36立体化教材计算机系列 Java程序设计程序设计 49Graphics绘图第一组:用坐标数组作为多边形的顶点序列绘制多边形:线条方式:drawPolygon(int
43、xPoints,int yPPoints,int nPoints)填充方式:fillPolygon(int xPts,int yPts,int n)【参数说明】xPoints与yPPoints为两个数组,分别保存多边形多个顶点的X坐标值与Y坐标值。两个数组的长度应该相等nPoints表示多边形顶点的个数,其值不能超过两个数组的长度。多边形绘制方法将两个数组对应的顶点按顺序用直线连接起来,组成一个多边形,多边形的顶点坐标序列为:(xPoints0,yPPoints0),(xPoints1,yPPoints1)(xPointsn,yPPointsn)。立体化教材计算机系列 Java程序设计程序设计
44、 50Graphics绘图第二组:用Polygon对象作为数据源绘制多边形:线条方式:drawPolygon(Polygon p)填充方式:fillPolygon(Polygon p)【参数说明】参数p为Polygon对象。Polygon类是java.awt包内提供的工具类,该类封装了一个封闭区域的节点坐标序列。该类具有以下构造方法:Polygon(),创建一个空的多边形对象。Polygon(int xpoints,int ypoints,int npoints),创建以指定参数为初始化值的多边形对象。其参数意义与drawPolygon()方法相同。Polygon类具有addPoint(int
45、 x,int y)成员方法,用来将一个指定点的坐标添加到多边形对象中。立体化教材计算机系列 Java程序设计程序设计 51画布Canvas Canvas是java.awt包中用来绘图的矩形组件,其作用类似于Windows的画图板,用户可在这块区域上直接画出图形。Canvas继承自Component类,具有Paint(Graphics g)、update(Graphics g)及repaint()方法,能够响应鼠标和键盘事件,并具有自己的坐标系统。画布提供了一块专门的图形区域,通过设定自己的边界而和其它组件区分开,以保护画面不被覆盖。即使画面被破坏,仍可通过调用Canvas的paint()方法重
46、画图形,恢复原有的状态。Canvas类的构造方法有两种形式:无参构造方法Canvas(),用来创建一个新的画布对象。有参构造方法Canvas(GraphicsConfiguration config),创建一个适用于指定的绘图配置对象的的画布对象。立体化教材计算机系列 Java程序设计程序设计 52画布Canvas如Canvas canvas1=new Canvas();语句就创建了一个空白的画布对象。创建了Canvas对象后,还要调用setSize()方法设定这个画布的大小。Canvas类的重要方法包括:paint(Graphics g),用来在画布上绘制图形。void update(Gra
47、phics g),用来更新画布。用户无法直接使用Canvas的paint()方法,使用时需要先定义一个以Canvas为基类的子类,并在子类中重写paint()方法;然后在子类的paint()方法中,借助于方法的Graphics对象参数,调用Graphics类的绘图方法,实现用户的绘图操作。立体化教材计算机系列 Java程序设计程序设计 53画布Canvas【例】使用画布实现以下功能:在画布上沿一条水平直线,从左到右绘制一系列的圆,圆的半径逐步增大,所有圆的圆心坐标在水平直线上。立体化教材计算机系列 Java程序设计程序设计 54画布Canvasimport java.awt.*;import
48、javax.swing.*;import java.awt.Color;/建立一个Canvas类的子类class MulOvalsCanvas extends Canvas private int oy;private int canvasWidth;/构造方法中设置画布尺寸 public MulOvalsCanvas()this.setSize(450,250);oy=(this.getHeight()-30)/2;canvasWidth=this.getWidth();立体化教材计算机系列 Java程序设计程序设计 55画布Canvas/重写paint()方法 public void pa
49、int(Graphics g)int ox=12;int r=10;/绘制水平直线 g.setColor(Color.RED);g.drawLine(0,oy,canvasWidth,oy);/沿水平直线绘制一系列的圆 g.setColor(Color.BLUE);/构造循环体 while(ox+r)(canvasWidth-15)g.drawOval(ox-r,oy-r,2*r,2*r);r+=5;ox+=15;立体化教材计算机系列 Java程序设计程序设计 56画布Canvaspublic class Exa_10_11 extends JFrame /建立一个JPanel子类的对象 Mu
50、lOvalsCanvas multipleOvals=new MulOvalsCanvas();public Exa_10_11(String title)super(title);this.setSize(450,250);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Container contentPane=this.getContentPane();contentPane.add(multipleOvals);this.setVisible(true);public static void main(String args)Ex