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. Android 屏幕适配之dimens适配

    Android 屏幕适配之dimens适配     转  https://blog.csdn.net/github_2011/article/details/72636851 在过去多个项目中一直使用 ...

  2. sysbench 压测

    IP架构 sysbench部署服务器:172.17.100.107 压测服务器:172.17.100.100 MySQL部署目录:/usr/local/mysql 前置工作 1.完成MySQL的安装( ...

  3. 10Flutter页面布局 Padding Row Column Expanded组件详解:

    Padding组件: main.dart import 'package:flutter/material.dart'; import 'res/listData.dart'; /* flutter页 ...

  4. JavaScript 异步和单线程

    JavaScript语言本身是单线程的,所以它自身不可能是异步.所谓单线程,就必然意味着:所有任务需要排队,前一个任务结束,才会执行后一个任务. 但js的宿主环境(比如浏览器,Node)是多线程的.宿 ...

  5. 实现在线阅读WORD,PDF等文件,JAVA,PHP都可以

    1 <?php 2 //header("Content-type:text/html;charset=utf-8"); 3 //word转html 展示 4 $lj=$_GE ...

  6. 值得学习的C语言开源项目和库

    收集一些C/C++相关的源码,如有更高效的库,请提醒我 补充上去 C/C++相关交流Q群 1414577 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具. ...

  7. asp.net mvc 中Html.ValidationSummary显示html

    @if (!ViewData.ModelState.IsValid) { <div>@Html.Raw(HttpUtility.HtmlDecode(Html.ValidationSumm ...

  8. 配置Xmanager远程登录

    1.修改/etc/gdm/custom.conf文件找到下面的语句:[security]AllowRemoteRoot=true[xdmcp]Enable=true修改custom.conf后,必须重 ...

  9. Css3 伪元素

    伪元素---用于向某些选择器设置特殊的效果 语法:元素::伪元素 (element::pseudo-element) 兼容性:IE9+ FireFox4+ Chrome Safari Opera fi ...

  10. PJzhang:docker基础知识的2个疗程-one

    猫宁!!! 参考:http://virtual.51cto.com/art/201805/572135.htm https://www.cnblogs.com/rkit/p/9237696.html ...