Graphics: 1. java.awt.Graphics;2.android.graphics

Canvas:1.java.awt.Canvas;2.android.graphics.Canvas

android.graphics与android.graphics.Cancas都是在android中使用的绘图工具,下一篇再记载。

在绘图时发现,大部分绘图都是继承JPanel,然后重写它的paint()方法,在其中获取Graphics来完成绘图即:

public void paint(Graphics g){

.................//do something you want to do

}

这样做的好处是可以在窗体发生改变时保存自己的绘图,应为当窗体大小改变,或是最小化,最大化时,系统都会调用窗体的repaint()方法,如果是轻量级组件就会调用该组件的paint(),否则调用该组件的update(),再由update()调用paint(),归根结底都是调用的paint()方法。注意:重写JFrame的paint()方法会导致闪烁,因为JFrame与JPanel的paint()方法来源不一样。

但我想自己获取Graphics实例来绘图,这时发现自己是不能创建Graphics实例的,Graphics都是有系统创建,然后引用的。所以在上面的重写paint方法时,系统会在调用paint方法时将已经创建的Graphics引用传入。如果想要获取Graphics,必须是在程序在jvm中运行后,即JFrame或JDialog等最高级容器已经被绘画在屏幕中时,这是graphics实例已经被创建用于画出要显示的内容,具体代码就是在setVisible(true)后就可通过getDraphics()获取Graphics实例了。因为,setVisible()实际上是调用的show()方法显示图形:

这时会通过show()方法调用repaint()方法来显示图形,这时就可以获取到graphics实例来进行绘画了,而对于JPanel等继承与JComponent的容器或组件来说,使用setVisible(true)之后是获取不了graphics的,必须将其添加到顶级容器(如JFrame)中才可以在父容器setVisible(true)后获取graphics,否则会返回null。add(Component c)是 java.awt.Container类的方法,在其中会调用addImpl(),在其中设置Component的GraphicsConfiguration,其实就是将父容器的Graphics引用传递给子组件,就是通过add()添加的组件。

而Canvas是一个绘图的轻量型组件,相较于JPanel继承了JComponent,而JComponent又继承了AWT中的Container,Container又继承了Component,Canvas只继承了Component。那么创建一个Canvas实例,该类的对象所占内存空间无疑更小,因为它所要加载的父类比JPanel小。所以如果是只要简单点的画图,还是用Canvas好。

但直接使用时发现,当窗体变化时,会导致图形失效,因为会调用paint()方法,而我们并没有使用paint()方法来绘图。获取Graphics后直接画图还是显示不出来,要让主线程睡眠一会(11毫秒),再画图就可以显示出来。

把注释取消即可正常运行,显示图形。

所以想要通过PaintEvent来实现对图形的绘制。但在JPanel中并不能添加PaintEventListener,而且既然要使用绘画事件监听,还不如直接重写paint()方法。

Graphics与Canvas的更多相关文章

  1. Canvas 教程

    在本文章中 在你开始之前 教程内容 相关资料 A note to contributors <canvas> 是一种可以通过编写脚本(通常是JavaScript)来实现绘制图形的HTML元 ...

  2. Canvas tutorial

    <canvas> 是一种可以通过编写脚本(通常是JavaScript)来实现绘制图形的HTML元素.例如,它能用来绘制图形,制作组合图像或者生成简单的 (偶尔 也不简单) 动画.右边的图像 ...

  3. 用仿ActionScript的语法来编写html5——第五篇,Graphics绘图

    用仿ActionScript的语法来编写html5——第五篇,Graphics绘图 canvas本身就是一个Graphics,可以直接进行绘图在actionscript里面,每个Sprite都有一个G ...

  4. Graphics 小记

    1.切图 drowg.DrawImage(productImg1, new System.Drawing.Rectangle(30, 30, 300, 300), new System.Drawing ...

  5. 【转载】《Ext JS 4 First Look》翻译之一:新特性

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:^_^肥仔John      原文地址:http://www.cnblogs. ...

  6. [C#技术参考]在PictureBox 中绘图防止闪烁的办法

    开篇之前说点别的,马上年终了,好希望年终奖大大的,但是好像这次项目的展示很重要,所以这几天绷得比较近,但是真的没有感觉烦,就是害怕来不及.所以抓紧了.下面直接正题.说一下用到的东西,都是Google搜 ...

  7. Android Skia和2D图形系统 .

    Android Skia 和 2D 图形系统 1 Skia 概述 Skia 是 Google 一个底层的图形.图像.动画. SVG .文本等多方面的图形库,是 Android 中图形系统的引擎. Sk ...

  8. Extjs4新特性

    Extjs 4相对于之前的版本作出了重大的修正.其中包括全新的类系统.新平台的引入.API的修整和加强还有新组件的引入(如新的图表和图形组件).Extjs 4提供更快速.更稳定的用户体验,并且让开发人 ...

  9. AI应用开发实战 - 手写算式计算器

    扩展手写数字识别应用 识别并计算简单手写数学表达式 主要知识点 了解MNIST数据集 了解如何扩展数据集 实现手写算式计算器 简介 本文将介绍一例支持识别手写数学表达式并对其进行计算的人工智能应用的开 ...

随机推荐

  1. 模糊C均值聚类-FCM算法

    FCM(fuzzy c-means) 模糊c均值聚类融合了模糊理论的精髓.相较于k-means的硬聚类,模糊c提供了更加灵活的聚类结果.因为大部分情况下,数据集中的对象不能划分成为明显分离的簇,指派一 ...

  2. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_16.RabbitMQ研究-与springboot整合-生产者代码

    springBoot给我们提供了 RarbbitTemplate发送消息 创建测试类,因为我们是基于SpringBoot的来写的测试类.所以要加上@SpringBootTest和@RunWith的注解 ...

  3. 如何屏蔽掉烦人的www.google-analytics.com

    有时候在开发的网站项目中会加载谷歌分析的js,并且加载的非常慢导致浏览器一直在转圈圈. 按下面的方法可屏蔽掉烦人的www.google-analytics.com   现在想只有屏蔽掉google-a ...

  4. Day04:循环结构(while、do-while、for)

    Java 循环结构 - while ,do...while,for 反复执行一段相同或相似代码的格式. 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java ...

  5. KVM虚拟化介绍(1)

    一.虚拟化分类    1.虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独 立的空间内运 ...

  6. L1不可导的时候该怎么办

    坐标轴下降法 比较浅显的解释: 坐标轴下降法(解决L1正则化不可导的问题) 以代码进行简单入门的博客(演示的代价函数是可导的): Coordinate descent in Python Introd ...

  7. 修改ssh登录的初始目录

    目录 修改ssh登录的初始目录 title: 修改ssh登录的初始目录 date: 2019/11/27 20:18:27 toc: true --- 修改ssh登录的初始目录 /etc/passwd ...

  8. 使用tensorflow训练SSD(一):相关环境的配置

    在使用TensorFlow进行目标检测时,首先需要下载tensorflow object detection API模型,该模型的下载地址为https://github.com/tensorflow/ ...

  9. 创建多个Fragment可滑动界面

    创建新项目,选择Tabbed Activity 默认就有2个Fragment,这里我们删除相关代码. 在切换时 FragmentPagerAdapter onDestroyView onCreateV ...

  10. APUE ☞ 文件和目录

    粘着位(Sticky Bit) S_ISVTX位被称为粘着位.如果一个可执行程序文件的这一位被设置了,程序第一次运行完之后,程序的正文部分的一个副本仍被保存在交换区(程序的正文部分是机器指令).这使得 ...