Graphics与Canvas
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的更多相关文章
- Canvas 教程
在本文章中 在你开始之前 教程内容 相关资料 A note to contributors <canvas> 是一种可以通过编写脚本(通常是JavaScript)来实现绘制图形的HTML元 ...
- Canvas tutorial
<canvas> 是一种可以通过编写脚本(通常是JavaScript)来实现绘制图形的HTML元素.例如,它能用来绘制图形,制作组合图像或者生成简单的 (偶尔 也不简单) 动画.右边的图像 ...
- 用仿ActionScript的语法来编写html5——第五篇,Graphics绘图
用仿ActionScript的语法来编写html5——第五篇,Graphics绘图 canvas本身就是一个Graphics,可以直接进行绘图在actionscript里面,每个Sprite都有一个G ...
- Graphics 小记
1.切图 drowg.DrawImage(productImg1, new System.Drawing.Rectangle(30, 30, 300, 300), new System.Drawing ...
- 【转载】《Ext JS 4 First Look》翻译之一:新特性
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:^_^肥仔John 原文地址:http://www.cnblogs. ...
- [C#技术参考]在PictureBox 中绘图防止闪烁的办法
开篇之前说点别的,马上年终了,好希望年终奖大大的,但是好像这次项目的展示很重要,所以这几天绷得比较近,但是真的没有感觉烦,就是害怕来不及.所以抓紧了.下面直接正题.说一下用到的东西,都是Google搜 ...
- Android Skia和2D图形系统 .
Android Skia 和 2D 图形系统 1 Skia 概述 Skia 是 Google 一个底层的图形.图像.动画. SVG .文本等多方面的图形库,是 Android 中图形系统的引擎. Sk ...
- Extjs4新特性
Extjs 4相对于之前的版本作出了重大的修正.其中包括全新的类系统.新平台的引入.API的修整和加强还有新组件的引入(如新的图表和图形组件).Extjs 4提供更快速.更稳定的用户体验,并且让开发人 ...
- AI应用开发实战 - 手写算式计算器
扩展手写数字识别应用 识别并计算简单手写数学表达式 主要知识点 了解MNIST数据集 了解如何扩展数据集 实现手写算式计算器 简介 本文将介绍一例支持识别手写数学表达式并对其进行计算的人工智能应用的开 ...
随机推荐
- java中的异步处理和Feature接口(一)
背景介绍想象这样一个场景:你可能希望为你的法国客户提供指定主题的热点报道.为实现这一功能,你需要向 谷歌或者Twitter的API请求所有语言中针对该主题最热门的评论,可能还需要依据你的内部算法 对它 ...
- pymysql检查是否断开, 断开重连
python mysql使用持久链接 python链接mysql中没有长链接的概念,但我们可以利用mysql的ping机制,来实现长链接功能~ 思路: 1 python mysql 的cping 函数 ...
- jquery 对svg 元素的addClass removeClass 支持
jquery 2.2 之后才支持对svg 元素的addClass removeClass
- [Scikit-learn] 1.5 Generalized Linear Models - SGD for Classification
NB: 因为softmax,NN看上去是分类,其实是拟合(回归),拟合最大似然. 多分类参见:[Scikit-learn] 1.1 Generalized Linear Models - Logist ...
- Futter基础组件之二
一.线性布局之Row布局组件(以水平阵列显示其子级的小部件) 属性:Row({ TextDirection textDirection, 表示水平方向子组件的布局顺序(是从左往右还是从右往左),默认为 ...
- SpringCloud 与 Dubbo区别
总览 Dubbo SpringCloud 服务注册中心 Zookeeper Spring Cloud Netfix Eureka 服务调用方式 RPC REST API 服务监控 Dubbo-mo ...
- kibana配置文件说明书
#端口号 server.port: 5601 #kibana服务安装的地址 server.host: "192.168.122.21" #当使用代理时,这里可能对应的是加工后的ki ...
- 我的vim开发环境搭建:C/C++/Go,持续更新中
懒得在github博客上折腾评论功能,先借用博客园推广下,虽然好像也没什么用. 我的vim开发环境搭建(1): 准备工作 我的vim开发环境搭建(2): 常用的vim插件 我的vim开发环境搭建(3) ...
- 【转】转载一篇优质的讲解epoll模型的文章
从事服务端开发,少不了要接触网络编程.Epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,Nginx.Redis.Skynet 和大部分游戏服务器都使用到这一多路复用技术. Epoll ...
- 《你必须知道的495个C语言问题》读书笔记之第11-14章:ANSI C标准、库函数、浮点数
一.ANSI C标准 1. ANSI向C语言预处理器引入了几项新的功能,包括“字符串化”操作符(#).“符号粘贴”操作符(##).#pragma指令. 2. Q:char a[3] = "a ...