版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机科学与技术学院赵志崑赵志崑在组件上绘制图形在组件上绘制图形 图形可以绘制在任意Swing组件上,但一般绘制在面板(JPanel)上,因为面板是空白的。绘制图形需要三步: 定义一个扩展自JPanel的新类; 覆盖其paintComponent方法,将绘图的语句添加在这个方法中; 创建一个新类的对象,添加到要显示的容器中。见见PanelExample.javapublic class PanelExample extends JFrame public PanelExample() contentPane.add(new MyPanel(); class MyPanel extends JP
2、anel public void paintComponent(Graphics g) /绘图部分代码super.paintComponent(g);g.drawRect(10,10,100,50); 赵志崑paintComponentpaintComponent方法方法 此方法是一个回调方法,声明如下: public void paintComponent(Graphics g) paintComponent方法在组件需要绘制时被自动调用: 面板首次显示时; 面板尺寸变化时; 其它窗口遮住面板时; 组件的repaint()方法被调用时。 paintComponent方法的参数: Graphi
3、cs g:绘图对象,所有绘图动作都是对其方法的调用。g相当于一块画布,主要有以下几类方法: 绘制简单几何图形,如矩形、椭圆等; 绘制图像,如图片; 绘制文字; 设置画笔属性,如颜色、文字字体、绘图模式等。赵志崑绘制直线绘制直线void drawLine(int x1, int y1, int x2, int y2) 绘制一条线。见见GraphicsExample.javag.drawLine(10,20,60,50);(x1,y1)(x1,y1)XY赵志崑绘制矩形绘制矩形void drawRect(int x, int y, int width, int height) 绘制一个矩形。void
4、 fillRect(int x, int y, int width, int height) 填充一个矩形。见见GraphicsExample.javag.drawRect(10,20,60,50);g.fillRect(80,20,60,50);(x,y)widthheight赵志崑绘制圆角矩形绘制圆角矩形void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) 绘制一个圆角矩形void fillRoundRect(int x, int y, int width, int heig
5、ht, int arcWidth, int arcHeight) 填充一个圆角矩形(x,y)widthheight见见GraphicsExample.javag.drawRoundRect(10,10,100,50,20,15);g.fillRoundRect(160,10,100,50,20,15);arcHeightarcWidth赵志崑绘制椭圆绘制椭圆void drawOval(int x, int y, int width, int height) 绘制一个椭圆void fillOval(int x, int y, int width, int height) 填充一个椭圆(x,y)w
6、idthheight见见GraphicsExample.javag.drawOval(10,10,100,50);g.fillOval(160,10,100,50);赵志崑绘制弧线绘制弧线void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) 绘制一条弧。void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) 填充一个扇形。见见GraphicsExample.javag.drawArc(1
7、0,10,100,50,0,60);g.fillArc(160,10,100,50,0,60);(x,y)widthheightstartAnglearcAngle赵志崑绘制多边形绘制多边形void drawPolygon(Polygon p) 绘制一个多边形void fillPolygon(Polygon p) 填充一个多边形见见GraphicsExample.javaPolygon p = new Polygon();p.addPoint(10,10);p.addPoint(100,30);p.addPoint(50,50);p.addPoint(100,70);p.addPoint(30
8、,100);g.drawPolygon(p);p.translate(150,0);g.fillPolygon(p);(10,10)(100,30)(50,50)(100,70)(30,100)150赵志崑设置颜色设置颜色void setColor(Color c):将当前画笔颜色设置为c。Color getColor():读取当前画笔颜色。颜色的构造: 构造函数Color(int r, int g, int b):参数为红、绿、蓝的值(0-255)。 直接使用Color类中的静态对象:如Color.blue, Color.yellow, Color.orange, 见见ColorExampl
9、e.javaint red = 0;int green = 0;int blue = 0;int gray = 0;for(red = 0; red = 255; red += 16) g.setColor(new Color(red,green,blue);g.fillRect(red+16,16,15,15);赵志崑输出文字输出文字 将字符串输出到特定位置: void drawString(String str, int x, int y)(x,y)见见TextExample.javag.drawString(Hello World!,50,50);g.drawString(世界你好!,5
10、0,100);赵志崑设置字体设置字体设置当前字体:void setFont(Font font)获取当前字体:Font getFont()Font的构造器:Font(String name, int style, int size) name:字体名称,可以用下面的方法获取系统支持的所有字体: String GraphicsEnvironment. getLocalGraphicsEnvironment(). getAvailableFontFamilyNames() style:字体形式,为Font.PLAIN,Font.BOLD,Font.ITALIC。 size:字体的高度,单位为像素。
11、这些设置字体的方法同样可以应用于组件上显示的字体。见见FontExample.javapublic void paintComponent(Graphics g) super.paintComponent(g);g.setFont(new Font(fontName,fontStyle,fontSize);g.drawString(Hello World!,50,50);g.drawString(世界你好!,50,100);赵志崑见见ImageExample.javaclass ImagePanel extends JPanel private Image unitsImage = null;
12、private int unitX;private int unitY;public ImagePanel() Toolkit kit = Toolkit.getDefaultToolkit();unitsImage = kit.getImage(globe.gif);public void paintComponent(Graphics g) super.paintComponent(g);g.drawRect(10,10,100,100);g.drawImage(unitsImage,unitX,unitY,null);public void setUnitLocation(int aX,
13、 int aY) unitX = aX;unitY = aY;repaint();绘制图像绘制图像-1 -1drawImage(Image img, int dx, int dy, ImageObserver observer) 将img中图片绘制到当前画布。globe.gifunitsImage赵志崑见见ImageExample1.javapublic void paintComponent(Graphics g) int sx1 = 118 * unitIndex;int sy1 = 0;int sx2 = sx1 + 117;int sy2 = sy1 + 97;int dx1 = un
14、itX;int dy1 = unitY;int dx2 = dx1 + 117;int dy2 = dy1 + 97;g.drawImage(unitsImage,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,null);public void setUnitLocation(int aX, int aY) unitIndex = (unitIndex + 1) % 4;repaint();绘制图像绘制图像-2 -2drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx
15、2, int sy2, ImageObserver observer) 将img中的一个矩形区域绘制到当前画布的一个矩形区域,且可拉伸。 透明的部分不绘制(gif图片可以指定一个透明色),用于绘制不规则图像。unitsImageduke.gif(dx1,dy1)(dx2,dy2)(sx1,sy1)0123(sx2,sy2)11898赵志崑等待图像加载等待图像加载问题: Java加载图片文件(kit.getImage)的时候,采用异步的方式,即图片文件可能还没有加载完,getImage方法就返回了。这是为了适应网络速度慢下加载图片的时间比较长的情况。 此时,如果使用图片的数据,则是错误的。因此需
16、要一种机制等待图片加载完成。解决: Java采用一个MediaTracker来跟踪图片的加载过程。见见ImageExample1.javapublic ImagePanel() Toolkit kit = Toolkit.getDefaultToolkit();unitsImage = kit.getImage(duke.gif);MediaTracker tracker = new MediaTracker(this);tracker.addImage(unitsImage,0);trytracker.waitForID(0);catch(Exception e)System.out.pri
17、ntln(e);使用MediaTracker的方法:1、创建一个MediaTracker对象;2、用addImage方法将正在装入的图片加入到MediaTracker对象,并赋予一个编号;3、用waitForID(编号)方法等待图片装入完成。赵志崑JavaJava支持的图片格式支持的图片格式 Java支持三种图片格式: JPEG:Joint Photographic Experts Group,支持全24位色彩。它是通过精确地记录每个像素的光亮但同时平均它们的色调的方法压缩图片,是有损压缩。 GIF:Graphics Interchange Format,采用颜色索引的方式存储图片。一个GIF
18、图片中只能有不多于256种的色彩,因此无法存储高质量照片。一个GIF文件可以包含几张图形以及每张图形的持续值,以产生动画效果。它也有有限度的可透明性:调色板中的某个色彩可被指定为透明色。 PNG:Portable Network Graphics,无损压缩,适合在网络中传播;具有8位、24位和32位三中色彩深度;支持Alpha通道透明( 32位)和色彩索引透明( 8位)。赵志崑Graphics2DGraphics2D Graphics类是一个抽象类,所以paintComponent(Graphics g)方法中的参数g不可能是一个Graphics类型的对象。参数g实际上是Graphics的子类
19、Graphics2D类型的对象。 Graphics2D类提供的功能比Graphics类强大,包括: 支持绘制更复杂的形状,如二次曲线、三次曲线; 支持更复杂的坐标变换,如旋转等; 支持设置线型,如实线、虚线、线条粗细; 支持更复杂的填充方法,如多种颜色着色。 要使用Graphics2D类的功能时,可以直接进行造型。public void paintComponent(Graphics g) super.paintComponent(g);Graphics2D g2 = (Graphics2D)g;/g2支持Graphics2D类的所有方法赵志崑缓冲区绘图缓冲区绘图 问题: Graphics类没
20、有能够取得某一点的颜色的方法。 组件没有将图片保存到文件的方法。 解决: BufferedImage类(Image类的子类)有取色功能(getRGB方法)和保存到文件功能。 采用双缓冲区绘图的方法,将BufferedImage和JPanel联系起来: 创建一个BufferedImage对象,作为后台绘图缓冲区; 所有绘图操作均在BufferedImage对象上进行; 绘制完成后,将BufferedImage对象整个绘制到JPanel上; 这样,BufferedImage对象和JPanel的图像将完全一样。globe.gif(文件)unitImage(Image)backBuffer(Buffe
21、redImage)Graphics g(JPanel的paintComponent方法)赵志崑见见DoubleBufferExample.javaclass PhotoPanel extends JPanel private BufferedImage backImage = new BufferedImage(1024,800,BufferedImage.TYPE_BYTE_INDEXED); public void paintComponent(Graphics g) super.paintComponent(g);Graphics backG = backImage.getGraphics();backG.drawImage(photoImage,0,0,null);g.drawImage(backImage,0,0,null);backG.dispose(); public Color getColor(int x, int y) int c = backImage.getRGB(x,y);return new Color(c); 读取图像数据读取图像数据采用双缓冲区绘图的方法后,将BufferedImage和JPanel的图像完全相同。因此,若想从JPanel某个位置
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年新能源培训产业园区运营协议
- 2026年云计算采购托管运营合同
- 村委会网格化工作制度
- 村帮扶责任人工作制度
- 预算绩效管理工作制度
- 领办重要任务工作制度
- 领导干部四述工作制度
- 食品安全信息工作制度
- 麻醉后复苏室工作制度
- 南阳市邓州市2025-2026学年第二学期五年级语文第七单元测试卷(部编版含答案)
- 2025年统计学多元统计分析期末考试题库:多元统计分析综合试题
- 《小石潭记》对比阅读-2024-2025中考语文文言文阅读专项训练(含答案)
- 江岸区2023-2024学年下学期期中七年级数学试卷(含答案)
- 党的基本路线课件
- 杭州市2024届高三二模(高三年级教学质量检测)英语试卷(含答案)+听力音频
- 招标代理服务服务方案
- 保密员培训课件教学
- 清明祭英烈-主题课件
- 小学四年级下家长会(数学教师)
- 四下语文园地一
- JBL音响系列产品参数
评论
0/150
提交评论