Java程序设计课件高晓黎第十章文本显示与图形图像处理2

上传人:枫** 文档编号:585757540 上传时间:2024-09-03 格式:PPT 页数:73 大小:1.11MB
返回 下载 相关 举报
Java程序设计课件高晓黎第十章文本显示与图形图像处理2_第1页
第1页 / 共73页
Java程序设计课件高晓黎第十章文本显示与图形图像处理2_第2页
第2页 / 共73页
Java程序设计课件高晓黎第十章文本显示与图形图像处理2_第3页
第3页 / 共73页
Java程序设计课件高晓黎第十章文本显示与图形图像处理2_第4页
第4页 / 共73页
Java程序设计课件高晓黎第十章文本显示与图形图像处理2_第5页
第5页 / 共73页
点击查看更多>>
资源描述

《Java程序设计课件高晓黎第十章文本显示与图形图像处理2》由会员分享,可在线阅读,更多相关《Java程序设计课件高晓黎第十章文本显示与图形图像处理2(73页珍藏版)》请在金锄头文库上搜索。

1、第十章第十章 文本显示与图形图像处理文本显示与图形图像处理第1章走马观花看Java立体化教材计算机系列 Java程序设计程序设计 3目录重点与难点点拨重点与难点点拨重点与难点点拨重点与难点点拨JavaJava绘图基础绘图基础绘图基础绘图基础JavaJava图像处理图像处理图像处理图像处理经典练习题经典练习题经典练习题经典练习题GraphicsGraphics绘图绘图绘图绘图字体设置字体设置字体设置字体设置立体化教材计算机系列 Java程序设计程序设计 4本章知识重点3132GUI组件及Graphics类的绘图方法33字体设置34基本图形绘制的各方法及画布CanvasJava图像处理35与图形图

2、像处理相关的类 立体化教材计算机系列 Java程序设计程序设计 5本章知识难点33基本图形绘制的各方法及画布Canvas343132GUI组件及Graphics类的绘图方法 字体设置及颜色设置图像的静态、动态处理立体化教材计算机系列 Java程序设计程序设计 6Java绘图基础JavaJava的绘图机制的绘图机制 与图形图像处理相关的类与图形图像处理相关的类 java java中支持图形图像处理的类与接口主要定义于中支持图形图像处理的类与接口主要定义于java.awtjava.awt类库中类库中31立体化教材计算机系列 Java程序设计程序设计 7Java绘图基础GraphicsGraphic

3、s类类 GraphicsGraphics类中封装了几乎所有的图形处理的方法,该类用于在类中封装了几乎所有的图形处理的方法,该类用于在一个二维坐标系中绘制图形与显示格式化文字。由于一个二维坐标系中绘制图形与显示格式化文字。由于GraphicsGraphics类定义于类定义于java.awtjava.awt包中,在绘制图形的程序中,必须引入包中,在绘制图形的程序中,必须引入java.awtjava.awt,即在程序开头需加上以下语句:,即在程序开头需加上以下语句: import java.awt.*; import java.awt.*; 或或import java.awt.Graphics;im

4、port java.awt.Graphics;32立体化教材计算机系列 Java程序设计程序设计 8Java绘图基础 Graphics Graphics类的绘图区域为能够绘制并显示图形的一些组件,类的绘图区域为能够绘制并显示图形的一些组件,坐标原点在组件的左上角,坐标原点在组件的左上角,X X轴为水平方向,坐标值从左轴为水平方向,坐标值从左至右逐渐增大,至右逐渐增大,Y Y轴在垂直方向,坐标值从上向下逐渐增轴在垂直方向,坐标值从上向下逐渐增大。大。JavaJava坐标的度量单位是像素,在坐标的度量单位是像素,在JavaJava的图形坐标系统的图形坐标系统中,坐标值只能为整数。由于不同的平台具体

5、实现绘图功中,坐标值只能为整数。由于不同的平台具体实现绘图功能中存在着一定差异,能中存在着一定差异,GraphicsGraphics类为抽象类,不能用类为抽象类,不能用newnew命令创建命令创建GraphicsGraphics类实例对象,类实例对象,JavaJava只提供给用户一个不只提供给用户一个不依赖于具体平台的通用接口,使用户能够调用依赖于具体平台的通用接口,使用户能够调用GraphicsGraphics类类的各种绘图方法,实现绘图与绘制文本的功能。的各种绘图方法,实现绘图与绘制文本的功能。立体化教材计算机系列 Java程序设计程序设计 9Java绘图基础 GUI程序中,文本的输出显示

6、是作为图形对象来处理的,控制台应用程序中的System.out.println()方法,只能以DOS字符的形式,在命令行窗口上显示文字。GUI界面中字符串信息的显示,要使用Graphics或Graphics2D提供的绘制字符或字符串信息的成员方法。图形文本图形文本33立体化教材计算机系列 Java程序设计程序设计 10Java绘图基础Graphics类提供了三种绘制文字的方法:字符串输出方法:drawString(String s,int x,int y)。字符数组输出方法:drawChars(char s,int offset,int length,int x,int y)。字节数组输出方法

7、:drawBytes(byte s,int offset,int length,int x,int y)。其中x、y参数为字符串输出的位置坐标。例如:g. drawString(“我的爱好是读书和听音乐”,50,100);语句将会绘出一串文本,输出位置坐标为(50,100) 。立体化教材计算机系列 Java程序设计程序设计 11Java绘图基础 GUI编程中,Color类定义了操作颜色的常量与方法,该类的完整包路径为java.awt.Color。 Color类常用的三种构造方法的定义为:public Color(int r,int g,int b);public Color(float r,f

8、loat g,float b);public Color(int rgb);Color类中封装了常用的13种标准颜色的符号常量。如: Color.BLACK Color.WHITE Color.RED Color.GREEN Color.BLUE Color.YELLOW 等颜色设置颜色设置34立体化教材计算机系列 Java程序设计程序设计 12Java绘图基础此外,Color类还提供了获取RGB颜色分量的对应方法:public int getRed(); /获取当前颜色的红色分量值(范围为0,255)。public int getGreen(); /获取当前颜色的绿色分量值(范围为0,255

9、)。public int getBlue(); /获取当前颜色的蓝色分量值(范围为0,255)。 立体化教材计算机系列 Java程序设计程序设计 13Java绘图基础 如创建一个以粉红色pink(RGB值为:255,175,175)前景显示“姓名”的标签对象,可用以下语句实现:Color labelColor=new Color(255,175,175);Label lblName=new Label(“姓名”);lblName.setForeground(labelColor);或者用以下等价的方式实现:Label lblName=new Label(“姓名”);lblName.setFor

10、eground(Color.PINK);立体化教材计算机系列 Java程序设计程序设计 14Java绘图基础 java.awt.Component类作为大多数GUI组件的基类,定义了paint()方法,用来实现在组件上绘制图形的功能。applet小程序的基类:Applet或Japplet,也间接地由Component类派生,因此applet小程序也具有paint()方法 paint()方法定义:void paint(Graphics g); paint()方法通常由系统自动调用,用户一般不能直接在程序中显式调用它,而是通过repaint()方法来间接调用它。组件首次显示外观时,applet小程

11、序在被加载运行时,系统都会调用相关的paint()方法。 GUIGUI组件的绘图方法组件的绘图方法ComponentComponent类与类与paint()paint()方法方法 31立体化教材计算机系列 Java程序设计程序设计 15Java绘图基础此外,Component类中还定义了另外两个直接或间接调用paint()方法的方法:更新方法update(Graphics g);当组件的尺寸、外观等被改变时,系统将调用此方法,重新绘制组件。update()方法的实现中包含了对paint()方法的调用。重绘方法repaint();该方法没有参数,执行时会清除组件的原有背景图形,并使用paint(

12、)方法重新绘制该组件。用户可以在程序中直接调用repaint()方法,当组件为轻量级组件时,该方法会直接调用paint()方法,否则会通过调用update()方法间接调用paint()方法。 立体化教材计算机系列 Java程序设计程序设计 16Java绘图基础【例】在一个300200的Frame窗口内,用红色绘制四叶玫瑰曲线。立体化教材计算机系列 Java程序设计程序设计 17Java绘图基础import java.awt.*;import java.awt.event.*;import java.awt.Color;public class Exa_10_1 extends Frame pr

13、ivate static final double PI=3.1415926; private int appWidth,appHeight; public Exa_10_1(String title) super(title); this.setSize(300,200); /实现关闭窗口的功能 this.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); 立体化教材计算机系列 Java程序设计程序设计 18Java绘图基础public void p

14、aint(Graphics g) super.paint(g);/调用父类的绘制方法 /获取当前窗口的宽度与高度值 appWidth=this.getWidth(); appHeight=this.getHeight(); int ox,oy,x,y; /设置原点(ox,oy)的坐标为当前窗口中心 ox=appWidth/2; oy=appHeight/2; g.setColor(Color.RED); /设置绘图的前景色 立体化教材计算机系列 Java程序设计程序设计 19Java绘图基础/绘制坐标轴 g.drawLine(ox,10,ox,appHeight); g.drawLine(0,

15、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绘图基础/计算最新的轨迹点坐标 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); /画轨迹

16、点 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类提供了一组类提供了一组getget类型的方法用来获类型的方法用来获取当前绘图上下文环境的一些重要参数。取当前绘图上下文环境的一些重要参数。getGraphics()getGraphics()为当前组件创建为当前组件创

17、建 graphics graphics上下文环境上下文环境getGraphicsConfiguration()getGraphicsConfiguration()获取相关的获取相关的GraphicsGraphics设置设置getForeground()getForeground()获取与当前组件的前景颜色获取与当前组件的前景颜色getBackground()getBackground()获取与当前组件的背景颜色获取与当前组件的背景颜色getFont()getFont()获取与当前组件的字体对象获取与当前组件的字体对象getFontMetrics(Font font)getFontMetrics

18、(Font font)获取指定字体的样式信息获取指定字体的样式信息ComponentComponent类的类的get/setget/set方法组方法组32立体化教材计算机系列 Java程序设计程序设计 22Java绘图基础Component类还提供了一组用来设置外观与行为的set方法:setEnabled(),设置组件的可用性。setVisible(),设置组件的可见性。setForeground(),设置组件的前景色。setBackground(),设置组件的背景色。setBounds(),设置组件的起始位置与尺寸大小。setLocation(),设置组件的起始位置。setSize(),设置

19、组件的尺寸大小。setPreferredSize(),设置组件首选的尺寸。setMaximumSize(),设置组件的最大尺寸。setMinimumSize(),设置组件的最小尺寸。此外,常用的还有一个设置组件显示文字字体类型与样式的一个方法:public void setFont(Font f)。立体化教材计算机系列 Java程序设计程序设计 23Java绘图基础【例】用组件的getGraphics()方法实现如下所述的功能:在一个300200的JFrame窗口内,放置一个标签与一个按钮,当点击按钮后,标签中绘制一个黄色的椭圆,并在椭圆内显示蓝色的RGB值。立体化教材计算机系列 Java程序

20、设计程序设计 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 JLabel(); private JButton jbtnDraw=new JButton(开始绘图); public Exa_10_2(String title) super(title); this.setS

21、ize(300,200); jlblDraw.setSize(300,150); /实现关闭窗口的功能 立体化教材计算机系列 Java程序设计程序设计 25Java绘图基础this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jbtnDraw.addActionListener(this); Container contentPane=this.getContentPane(); contentPane.setLayout(new BorderLayout(); contentPane.add(jlblDraw,BorderLayout.CE

22、NTER); contentPane.add(jbtnDraw,BorderLayout.SOUTH); /按钮点击事件响应方法 public void actionPerformed(ActionEvent e) /创建标签的Graphics上下文环境 Graphics g=jlblDraw.getGraphics(); 立体化教材计算机系列 Java程序设计程序设计 26Java绘图基础/用黄色画一填充椭圆 g.setColor(Color.YELLOW); g.fillOval(50,10,200,130); /用蓝色显示当前颜色的字符串 g.setColor(Color.BLUE);

23、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程序设计程序设计 27Java绘图基础paintComponent(),用来绘制几何图形,渲染图形文字。paintComponent()方法的原型定义如下:protected

24、 void paintComponent(Graphics g);JComponent类的paintComponent()方法与Component类的paint()具有完全相同的参数形式,两种方法的功能与使用也基本类似。 JComponentJComponent类与类与paintComponent()paintComponent()方法方法 33立体化教材计算机系列 Java程序设计程序设计 28Java绘图基础 Swing应用中,经常会在JPanel组件中绘制图形。通常的做法是:定义一个JPanel类的子类,在该子类中覆盖/重写类的paintComponent()方法,在方法体内放入绘图的操

25、作语句。然后再将该JPanel组件添加到主窗口的内容窗格(ContentPane)内。 具体的实现结构类似于如下的代码: class drawPanel extends Jpanel public void paintComponent(Graphics g) / super.paintComponent(g); /相关的图形或文字绘制语句 立体化教材计算机系列 Java程序设计程序设计 29字体设置一个Font类的对象表示了一种字体显示效果,包括字体类型、Font MyFont = new Font ( TimesRoman, Font.BOLD, 12 ); MyFont对应的是12磅Ti

26、mesRoman类型的黑体字,其中指定字型时要用到Font类三个常量:Font.PLAIN, Font.BOLD, Font.ITALIC。如果希望使用该Font对象,则可以利用Graphics类的setFont( )方法: g. setFont ( MyFont );如果希望指定控制组件,如按钮或文本框中的字体效果,则可以使用控制组件的方法setFont( )。如设btn是一个按钮对象,则语句: btn.setFont(MyFont);另外,与setFont( )方法相对的getFont( )方法将返回当前Graphics或组件对象使用的字体。FontFont类类立体化教材计算机系列 Jav

27、a程序设计程序设计 30字体设置【例】获取当前系统中所有可用字体的名称,在标签中显示出这些可用字体的数目,在文本区中显示出这些可用字体的名称。 立体化教材计算机系列 Java程序设计程序设计 31字体设置import java.awt.*;import javax.swing.*;import java.awt.event.*;public class Exa_10_4 extends JFrame implements ActionListener /定义GUI所涉及的组件 JLabel jlblTotalFonts=new JLabel(); JButton jbtnDisp=new JB

28、utton(显示当前可用字体名称); JTextArea jtxtaFontNames=new JTextArea(); JScrollPane jsclpane4txtArea=new JScrollPane(jtxtaFontNames); 立体化教材计算机系列 Java程序设计程序设计 32字体设置 public Exa_10_4(String title) super(title); jbtnDisp.addActionListener(this); /为标签组件设置前景色为红色 jlblTotalFonts.setForeground(new Color(255,0,0); /设置文

29、本区组件为不可编辑状态 jtxtaFontNames.setEditable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /添加各个组件到窗口的内容窗格中 Container contentPane=this.getContentPane(); contentPane.setLayout(new BorderLayout(); contentPane.add(jlblTotalFonts,BorderLayout.NORTH); 立体化教材计算机系列 Java程序设计程序设计 33字体设置contentPane.ad

30、d(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; /获取当前平台可用的字体集 GraphicsEnvironment ge=Graphics

31、Environment.立体化教材计算机系列 Java程序设计程序设计 34字体设置getLocalGraphicsEnvironment(); availableFontNames=ge.getAvailableFontFamilyNames(); /当前平台可用字体的总数 int total=availableFontNames.length; jlblTotalFonts.setText(当前平台系统可用的字体总数为: +total+); /将当前平台可用字体名称添加到文本区中 for (int k=0;ktotal;k+) jtxtaFontNames.append(available

32、FontNamesk+n); public static void main(String args) new Exa_10_4(Font Usage Demo); 立体化教材计算机系列 Java程序设计程序设计 35字体设置FontMetrics类定义了字体的规格对象,提供了比Font类更详尽的特定字体的描述信息。这些信息可以通过调用FontMetrics类的相关方法来获得。FontMetrics类提供了获取文字样式中各类规格信息的成员方法。 创建FontMetrics类对象要通过调用Graphics类的getFontMetrics()方法来实现。如:public void paint(Gr

33、aphics g) FontMetrics fm = g.getFontMetrics(); FontMetricsFontMetrics类类立体化教材计算机系列 Java程序设计程序设计 36字体设置【例】编程实现演示FontMetrics类的字体规格信息。用一根粗黑线表示Baseline,另外三根分别表示字体的Leading、Ascent和Descent的位置。窗口顶端包含输入显示文本内容的文本域及三个用来选择字体名称、字体样式及字号的组合列表框。当在文本域中输入新的内容并敲回车,或者改变了任何一个组合列表框的当前选择,都会使字体规格信息的演示内容发生变化。立体化教材计算机系列 Java程

34、序设计程序设计 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.drawRect(40,10,50,20)

35、;/画矩形框(左上角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); /画椭圆框 g.fillOva

36、l(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程序设计程序设计

37、 40Graphics绘图要在Java程序图形界面的容器中绘制图形,首先,需要明确希望绘制的图形是什么,是圆、椭圆,还是直线,这由所选定的方法来确定;其次,需要指明所绘制图形或文字的大小和位置,立体化教材计算机系列 Java程序设计程序设计 41Graphics绘图绘制直线的方法格式为:drawline(intx1,inty1,intx2,inty2)。其中整型参数对(x1,y1)代表直线的起点,(x2,y2)代表直线的终点。基本图形绘制基本图形绘制 点点(Point)(Point) 直线直线(Line)(Line)3132立体化教材计算机系列 Java程序设计程序设计 42Graphics绘

38、图【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】圆

39、角矩形线条方式: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程序

40、设计程序设计 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绘图椭圆绘制方法与普通矩形的方法在形式上相同的,这是因为椭圆的规格大小是用它的外接矩形

41、来指定的。线条方式:drawOval(intx,inty,intw,inth)填充方式:fillOval(intx,inty,intw,inth)【参数说明】x、y参数代表椭圆外接矩形的左上角位置坐标。参数w、h代表椭圆外接矩形的宽度和高度。椭圆椭圆(Oval)(Oval)34立体化教材计算机系列 Java程序设计程序设计 46Graphics绘图圆弧是椭圆的一部分,夹在两个角之间,因此画圆弧的方法比画椭圆的方法多了两个角度参数(都以角度为单位):起始角和张角。起始角确定了圆弧的起始位置,张角确定了圆弧的大小。张角可正可负,当取正值时,画出的为沿逆时针方向的圆弧;取负值时,画出的为沿顺时针方向

42、的圆弧。当张角取值大于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

43、表示圆弧的起始角。arcAngle表示圆弧的张角,可取正负整数值代表有方向的角度。 立体化教材计算机系列 Java程序设计程序设计 48Graphics绘图 线条方式画出的多边形一般是不封闭的,除非首顶点与尾顶点坐标值一样。但填充方式画出的填充多边形则为封闭的多边形,因为填充不应该溢出多边形的有效范围。 根据绘制所采用的数据表达方式的不同,多边形的绘制方法可分为两组,每一组又具有线条与填充两种绘制方式。多边形多边形(Polygon)(Polygon)36立体化教材计算机系列 Java程序设计程序设计 49Graphics绘图第一组:用坐标数组作为多边形的顶点序列绘制多边形:线条方式:drawP

44、olygon(int xPoints,int yPPoints,int nPoints) 填充方式:fillPolygon(int xPts,int yPts,int n)【参数说明】xPoints与yPPoints为两个数组,分别保存多边形多个顶点的X坐标值与Y坐标值。两个数组的长度应该相等nPoints表示多边形顶点的个数,其值不能超过两个数组的长度。多边形绘制方法将两个数组对应的顶点按顺序用直线连接起来,组成一个多边形,多边形的顶点坐标序列为:(xPoints0,yPPoints0),(xPoints1,yPPoints1)(xPointsn,yPPointsn)。立体化教材计算机系列

45、Java程序设计程序设计 50Graphics绘图第二组:用Polygon对象作为数据源绘制多边形:线条方式:drawPolygon(Polygon p)填充方式:fillPolygon(Polygon p)【参数说明】参数p为Polygon对象。Polygon类是java.awt包内提供的工具类,该类封装了一个封闭区域的节点坐标序列。该类具有以下构造方法:Polygon(),创建一个空的多边形对象。Polygon(int xpoints, int ypoints, int npoints),创建以指定参数为初始化值的多边形对象。其参数意义与drawPolygon()方法相同。 Polygon

46、类具有addPoint(int x, int y)成员方法,用来将一个指定点的坐标添加到多边形对象中。立体化教材计算机系列 Java程序设计程序设计 51画布CanvasCanvas是java.awt包中用来绘图的矩形组件,其作用类似于Windows的画图板,用户可在这块区域上直接画出图形。Canvas继承自Component类,具有Paint(Graphics g)、update(Graphics g)及repaint()方法,能够响应鼠标和键盘事件,并具有自己的坐标系统。画布提供了一块专门的图形区域,通过设定自己的边界而和其它组件区分开,以保护画面不被覆盖。即使画面被破坏,仍可通过调用Ca

47、nvas的paint()方法重画图形,恢复原有的状态。Canvas类的构造方法有两种形式: 无参构造方法Canvas(),用来创建一个新的画布对象。有参构造方法Canvas(GraphicsConfiguration config),创建一个适用于指定的绘图配置对象的的画布对象。立体化教材计算机系列 Java程序设计程序设计 52画布Canvas如Canvas canvas1=new Canvas();语句就创建了一个空白的画布对象。创建了Canvas对象后,还要调用setSize()方法设定这个画布的大小。 Canvas类的重要方法包括:paint(Graphics g),用来在画布上绘制图

48、形。void update(Graphics g),用来更新画布。用户无法直接使用Canvas的paint()方法,使用时需要先定义一个以Canvas为基类的子类,并在子类中重写paint()方法;然后在子类的paint()方法中,借助于方法的Graphics对象参数,调用Graphics类的绘图方法,实现用户的绘图操作。立体化教材计算机系列 Java程序设计程序设计 53画布Canvas【例】使用画布实现以下功能:在画布上沿一条水平直线,从左到右绘制一系列的圆,圆的半径逐步增大,所有圆的圆心坐标在水平直线上。立体化教材计算机系列 Java程序设计程序设计 54画布Canvasimport j

49、ava.awt.*;import 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/重写p

50、aint()方法 public void paint(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

51、extends JFrame /建立一个JPanel子类的对象 MulOvalsCanvas 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(tru

52、e); public static void main(String args)Exa_10_11 app=new Exa_10_11(Canvas Usage Demo);立体化教材计算机系列 Java程序设计程序设计 57Java图像处理静态图像处理静态图像处理 常用的图像文件格式有BMP、JPEG、GIF、PNG等格式。图像的基本操作图像的基本操作 Java中处理图像的基本操作主要包括:创建图像对象,获取图像资源,加载图像,显示图像等。立体化教材计算机系列 Java程序设计程序设计 58Java图像处理java.awt的Component类提供了一个createImage()方法来生成I

53、mage图像对象。CreateImage()方法有两种重载形式:Image createImage(ImageProducer producer);方法的第一种形式从一个指定的图像产生器producer创建一幅图像并由方法返回。producer是一个现实了ImageProducer接口的类对象。Image createImage(int width, int height);方法的第二种形式创建并返回一幅具有指定宽度和高度的空白图像。创建图像对象31立体化教材计算机系列 Java程序设计程序设计 59Java图像处理获取本地图像资源通过java.awt.Toolkit类的静态方法getDefa

54、ultToolkit(),获得当前默认的Toolkit(工具包)对象,然后再使用Toolkit类的getImage()方法,就可以从指定的文件中读取GIF、JPEG或PNG格式的图像数据了。例如:从本机上获取名为myPhoto.gif的文件内容,并将文件中的图像数据生成Image对象myPhoto的语句序列为:String fileName = “myPhoto.gif”;Image myPhoto = olkit.getDefaultToolkit().getImage(fileName);获取图像资源32立体化教材计算机系列 Java程序设计程序设计 60Java图像处理获取网络图像资源如

55、果要获取的图像资源在网络上,则需要使用URL类来得到图像。Applet类提供了getCodeBase()方法,用以返回一个URL对象,该URL对象代表了applet小程序在网络上地址。通常的做法为:用网络地址与图像文件名组成的字符串生成一个URL对象,然后使用Toolkit类的getImage()方法,读取远程的图像数据,创建对应的图像对象。例如要获取Sun公司的标志图片文件sun_logo.gif:URL url = new URL(“sun/im/sun_logo.gif”);Image sunLogo = Toolkit.getDefaultToolkit().getImage(url)

56、;立体化教材计算机系列 Java程序设计程序设计 61Java图像处理java.applet.Applet类提供了getImage()方法来实现图像的加载。通过getImage()方法,能够将JPEG、GIF或PNG格式的图像文件转换为Image对象,便于在程序中进行操作。getImage()方法有以下两种重载形式:Image getImage(URL url);/参数url指定了图像资源的位置路径与名称。Image getImage(URL url, String imageName);/参数指定了图像的位置路径及图像文件名称的Image类的一个实例对象。加载图像33立体化教材计算机系列 J

57、ava程序设计程序设计 62Java图像处理Java应用程序中图像的显示要通过调用Graphics类的drawImage()方法来实现。drawImage()方法有6种重载形式,可根据需要任选一种来使用。下面给出drawImage()众多重载方法中的一种:boolean drawImage(Image imgObj, int left, int top, ImageObserver imgOb);该方法显示由imgObj对象所引用的图像文件,显示区域的左上角坐标为(left,top)。ImgOb是一个实现了ImageObserver接口的类的对象。ImageObserver接口由所有的AWT组

58、件所实现。例如,要显示本机上myPhoto.gif文件中的图像:public void paintComponent(Graphics g)Image myPhoto=Toolkit.getDefaultToolkit().getImage(“myPhoto.gif”);g.drawImage(myPhoto, 90, 60, null);显示图像34立体化教材计算机系列 Java程序设计程序设计 63Java图像处理【例】在窗口中显示当前目录下card.jpg图像文件的内容。 立体化教材计算机系列 Java程序设计程序设计 64Java图像处理import java.awt.*;import

59、 javax.swing.*;/建立一个JPanel类的子类class DrawImage extendsJPanel/重写paintComponent()方法 public void paintComponent(Graphics g) /调用父类的paintComponent()方法 super.paintComponent(g);/获取图像资源并创建Image对象Image cardImage=Toolkit.getDefaultToolkit().getImage(card.jpg); /将当前图像原始尺寸缩小一半显示 int showWidth=cardImage.getWidth(

60、this)/2; int showHeight=cardImage.getHeight(this)/2; g.drawImage(cardImage,15,10,showWidth,showHeight,this); 立体化教材计算机系列 Java程序设计程序设计 65Java图像处理public class Exa_10_12 extends JFrameDrawImage christmasCard=new DrawImage(); public Exa_10_12(String title) super(title); /设置窗口大小 this.setSize(260,230); thi

61、s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane=this.getContentPane(); contentPane.add(christmasCard); this.setVisible(true); public static void main(String args) Exa_10_12 app=new Exa_10_12(Image Usage Demo); 立体化教材计算机系列 Java程序设计程序设计 66Java图像处理动画处理动画处理 用Java实现动画的原理与放映动画片类似,取若

62、干相关的图像或图片,顺序、连续地在屏幕上先显示,后擦除,循环往复就可以获得动画的效果。在计算机上,以1030幅/每秒钟的速度显示图像即可达到满意的动画质量。立体化教材计算机系列 Java程序设计程序设计 67Java图像处理【例】将一个小球的图像显示到当前窗口中,让小球围绕着窗口中心点,沿着圆周不停地做旋转运动。立体化教材计算机系列 Java程序设计程序设计 68Java图像处理import java.awt.*;import javax.swing.*;/建立一个JPanel类的子类class MoveImage extends JPanel /定义Image对象并初始化为指定的图像资源 p

63、rivate Image moveBall=Toolkit.getDefaultToolkit().getImage(Images/ball.jpg); /小球运动轨迹对应圆周的圆心坐标与半径 private final int OX; private final int OY; private final int R; 立体化教材计算机系列 Java程序设计程序设计 69Java图像处理/小球显示当前位置坐标 private int moveX; private int moveY; /小球旋转的角度 private static int moveAngle=0; /构造方法 public

64、MoveImage() this.setSize(300,300); this.OX=getWidth()/2-25; this.OY=getHeight()/2-28; this.R=getHeight()/2-30; 立体化教材计算机系列 Java程序设计程序设计 70Java图像处理 /重写paintComponent()方法 public void paintComponent(Graphics g) /调用父类的paintComponent()方法 super.paintComponent(g); try /计算小球当前的显示坐标 moveX=OX+(int)(Math.cos(mo

65、veAngle*Math.PI/180.0)*R); moveY=OY+(int)(Math.sin(moveAngle*Math.PI/180.0)*R); g.drawImage(moveBall,moveX,moveY,this); /调用线程类的延时方法使时间停顿0.1秒 Thread.sleep(100); moveAngle+=10; /小球旋转的角度值增加步长10 catch (InterruptedException e) repaint(); /擦除原有图像,重绘图像 立体化教材计算机系列 Java程序设计程序设计 71Java图像处理public class Exa_10_

66、13 extends JFrame /建立一个JPanel子类的对象 MoveImage surroundBall=new MoveImage(); public Exa_10_13(String title) super(title); /设置窗口大小 this.setSize(300,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane=this.getContentPane(); contentPane.add(surroundBall); this.setVisible(true); public static void main(String args) Exa_10_13 app=new Exa_10_13(Moving Image Demo); 立体化教材计算机系列 Java程序设计程序设计 72经典练习题31编写程序,显示一个字符串,用两个按钮控制字符串的放大和缩小。?32编写程序,加载和显示一幅图像,并放大和缩小这幅图像的显示。33编写一个程序,使用渐变颜色画一个填充圆,然后将其旋转。立体化教材计算机系列 Java程序设计程序设计 73再见

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号