java画图总结之三(常用方法paint,repaint,update)

利用WebDAV协议将百度网盘挂载为本地网络硬盘的完整指南 WebDAV是一种基于HTTP/HTTPS的扩展协议,它允许客户端通过标准HTTP方法对远程服务器上的文件进行读写和管理。其核心原理是通过定义如PROPFIND、PUT、GET等标准化方法,实现跨平台的远程文件系统访问。这项技术的价值在于打破了不同存储服务间的壁垒,将封闭的云存储生态接入开放标准协议体系。在工程实践中,WebDAV常被用于实现跨设备文件同步、媒体服务器集成和生产力工具数据备份等场景。通过搭建WebDAV服务器作为协议转换层,可以将百度网盘这类封闭存储服务映射为标准网络存储,实现类似bdpan 阅读详情

三,常用方法paint,repaint,update

这个问题的由来是因为,我在编写java小程序,画图的时候,发现我重写了paint(graphics g)方法,而执行的时候调用的是repaint()无参方法。老师说,repaint里面间接调用了paint方法。但是是如何间接调用的呢?repaint方法里面是否new了一个graphics对象呢然后传给paint呢?
首先paint方法,并不仅是JPanel的方法,而是继承自JComponent的方法,该方法说明如下:
/**
     * Invoked by Swing to draw components
     * Applications should not invoke <code>paint</code> directly,
     * but should instead use the <code>repaint</code> method to
     * schedule the component for redrawing.
     * <p>
     * This method actually delegates the work of painting to three
     * protected methods: <code>paintComponent</code>,
     * <code>paintBorder</code>,
     * and <code>paintChildren</code>.  They're called in the order
     * listed to ensure that children appear on top of component itself.
     * Generally speaking, the component and its children should not
     * paint in the insets area allocated to the border. Subclasses can
     * just override this method, as always.  A subclass that just
     * wants to specialize the UI (look and feel) delegate's
     * <code>paint</code> method should just override
     * <code>paintComponent</code>.
     *
     * @param g  the <code>Graphics</code> context in which to paint
     * @see #paintComponent
     * @see #paintBorder
     * @see #paintChildren
     * @see #getComponentGraphics
     * @see #repaint
     */
------------------------------------解释-----------------------------------------------
这个方法是被swing调用来画组件的,应用不应该直接调用paint,而应该调用repaint。paint这个方法实际上代表了三个protected的方法。 *<code>paintComponent</code>,<code>paintBorder</code>,<code>paintChildren</code>.  *里面一次调用者三种方法来确保....(略)
重要的是子类通常要重写这个方法,来定制special特殊的图形组件。

那么为什么不应该直接调用paint而应该调用repaint呢?查了很多资料,有一个说的很简单,直接。(接下来一段几乎全部引用)
-------------------------------------引用-------------------------------------------
http://wenku.baidu.com/link?url=uXdbhvny1uvjCuWhyD-28cfrVg8I65gq3LOEQCP2Dh2d7rsX-7sEBJwdU0HtCHCh__9XtkhSpBiAhkLVfPpuWfR1F00GQTyIaL1NQZYf_X3

调用paint的一般是repaint()或当显示器刷新的时候调用的类似repaint()的类。
 
当对于桌面执行了某类操作,改变了桌面上的图象时,jvm收到界面被调整的信息,此时会调用visible是ture的图形组件的repaint()
方法对界面重绘。 
 
当然,直接重绘或全部重绘是很亏的,一个是用双缓存技术,另一个是只对桌面上显示的部分重绘。双缓存是指在缓存内先模拟重绘过程,只把最后成形的结果传给显示器显示。部分重绘就是指使用repaint(Dimensionarea)及类似的方法,只重绘与需调整的部分相关的界面。幸运的是,目前jdk提供的repaint()并不是傻呼呼的就直接重绘所有组件,已经用了上述两种方法优化过了。所以即使反复调用repaint()也不会有效率的损失。
 
 
repaint()是重要概念,它是在图形线程后追加一段重绘操作,是安全的!是系统真正调用的重绘!所以如果你需要某个部件刷新一下界面,记得调用repaint(),千万不要直接调用paint()!
paint()是提供给用户编程的,往往声明在接口之中,然后用户实现该接口,以拥有重绘的功能。
若要定制某个图形组件的界面,可以重写paint()方法,记得一般习惯这样改写: 
void paint(Graphics g){  
super.paint(g);  
// your code }  
除了paint(),有的组件会有paintBorder()之类的专门用于某个部分重绘的方法,不过一般是 
protected的,在对该类组件扩展的时候可以重写该方法。
  
最后,graphics是一个抽象类,其实现大都是平台相关的,所以不容易自己创建一个graphics实例。一般graphics的实例会由依照你所在的桌面环境给出。Graphics类及其子类Graphics2D提供的只是一些基本绘图方法,比如画直线、曲线什么的。 
所以做一个图形组件的基本思路可以总结为以下过程: 
选择适合的基本图形组件 -> 继承它 -> 重写paint等方法->在需要刷新图形的时候调用repaint等方法!
至于Graphics,先假设它存在,因为真正的Graphics实例只有当程序在jvm上跑的时候才会创建。(这一点上一章说过了) 
 
如果要找最终调用paint的地方的话,一定是通过repaint()方法。因为直接调用paint(),次数少还行,次数多就会导致该图形进程卡在与显示器的交互上,所以一定只有repaint才是可以被调用来重绘的。然而repiant存在的意义并不是绘界面,而是使绘界面操作更安全。 
 
可以看Component的repaint方法的实现,他将触发重绘的源放在AWTEventQueue里,然后等到图形处理的Queue有空的时候,自动拿出源,此时调用paint()。而paint的参数Graphics也只有此时能传给paint!因为Graphics与系统相关性太大,只能是通过JNI用底层代码实现,也就是C++代码创建。所以你要找到Graphics创建不能从jdk代码里找,要去找jvm的源代码(jdk6开源,你可以找找试试),可能会找到一些带有Impl后缀的关于Graphics的实现。 
然后,如果深究paint()在哪调用,我可以说,你所找到的jdk里所有带有paint()的代码段都不是最终paint被调用的地方。因为jdk只允许paint被repaint触发,而repaint到传递Event给AWTEventQueue后,所有的代码都变成系统相关,那么就不能从jdk里找到实现了。
 ----这也解释了,为什么直接调用repaint就可以,而不用给paint传graphics参数。
系统相关的处理,一般是在jdk只声明接口,然后利用反射机制动态创建。一般类名放在系统的环境变量中,然后反射该类,类的实现不同jvm不同。
------------------------------------引用结束---------------------------------------
 引用总结:就是说repaint比paint优化过效率更高,并且是绘图界面操作更安全。。。。。!!!!

说了这么多,好像跟update没什么关系。那么update又是什么呢?
我在查看repaint源代码的时候发现,repaint是Component类的方法,该类中还有paint和update方法,方法的代码实现,你们可去看,这里不再粘贴,而是放上方法说明:
     * Repaints this component.
     * <p>
     * If this component is a lightweight component, this method
     * causes a call to this component's <code>paint</code>
     * method as soon as possible.  Otherwise, this method causes
     * a call to this component's <code>update</code> method as soon
     * as possible.
     * <p>
意思是,重画组件,如果component是轻量级的(看总结一),repaint会调用paint(不是立即,而是as soon as possible尽快,参考引用)如果是重量级的,则会调用update。
如果你直接调用update的话,update也会先判断这个组件是轻量级还是重量级,如果是轻量级,update又会调用repaint由repaint去调用paint。
感觉没说清楚,看了很多文章,源码,解释,说明,总之在写代码的时候直接用paint或者update就是会有问题(例如有人说闪烁,重叠),所以要用更安全,效率更高的repaint。




三维点云转深度图 点云投影过程是将三维点云数据转化为二维图像坐标的关键步骤,它的实现涉及到相机内外参数的计算,包括相机的内部参数(如焦距和主点)和外部参数(如相机位置和方向)。具体来说,可以通过将每个点的三维坐标转换为相机坐标系下的坐标,然后使用相机内部参数和外部参数来计算在二维图像中的坐标。接着计算每个点的深度值,将深度值映射到像素值上,最后创建深度图像并将深度值赋给对应的像素值。这里需要注意的是,在将深度值映射到像素值上时,需要将像素值转换为 uchar 类型,否则在将深度值赋给像素值时会出现类型不匹配的错误。 阅读详情

相关推荐

手把手教你搭建三端口DC-DC变换器(含Boost+Buck电路实战)

本文详细介绍了如何从零开始搭建三端口DC-DC变换器,涵盖Boost和Buck电路的硬件设计、元器件选型、电路板布局、焊接技巧、控制系统设计与调试等关键步骤。通过实战案例和优化建议,帮助工程师避开常见陷阱,提升系统效率和稳定性,适用于光伏、储能等电力电子应用场景。

x8y9z0的博客 931

java paint的使用_java使用paint方法画图的方法

java使用paint方法画图的方法发布时间:2020-08-24 12:06:15来源:亿速云阅读:98作者:小新小编给大家分享一下java使用paint方法画图的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!java使用paint方法画图需要继承JFrame类来画窗口 => public class Game extends JFrame {}setTitle(Stri...

weixin_42118161的博客 3080

MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载)

目录 MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载) MQTT(二)在windows64位上安装Python环境 MQTT(三)Python客户端+net客户端+net服务端 简单通信 MQTT(四)树莓派开机自动运行Python客户端 MQTT(五)EMQ开源MQTT消息服务器 1 什么是 MQTT ? MQTT(Message Que...

pw的博客 10万+

java中paint_Java中paint怎么用

paint方法的用法:首先在Java文件中的第一个类要继承Jframe或者JPanel;然后再写一个构造方法进行初始化窗口,通过main方法调用该构造方法;最后通过paint方法进行画图。【推荐课程:Java教程】paint方法的正确用法:(1)新建的.java文件里边的第一个类继承(extends)Jframe(容器)或者JPanel(轻量级容器)(2)写一个构造方法,进行初始化窗口(大小、位置...

weixin_39942400的博客 2551

ArcGIS | 全球新冠肺炎地图数据下载和处理

ArcGIS

thinkpang的博客 2901

说一说JAVA中paint(Graphics g)和repaint();

paint方法的用法:首先在Java文件中的第一个类要继承Jframe或者JPanel;然后再写一个构造方法进行初始化窗口,通过main方法调用该构造方法;最后通过paint方法进行画图。

weixin_45345143的博客 3411

顶刊级科研绘图技巧

顶刊级科研绘图技巧

2401_89571885的博客 1158

java中paint_java中paint()的具体用法是什么?

展开全部1、这个方法需要注意62616964757a686964616fe58685e5aeb931333365646232的地方不多,也就是重写时,先调用 super.paint(g) 方法 。paint方法不需要编写代码调用,只需要重写。2、paint 。public void paint(Graphics g)绘制容器。该方法将 paint 转发给任意一个此容器子组件的轻量级组件。如果重新实...

weixin_31092009的博客 2740

【PPS便携式移动电源】如何透彻了解便携式移动电源,仅需要十分钟阅读即可

PPS 便携式储能电源的发展前景广阔,受益于户外经济爆发、应急备灾需求提升及 “双碳” 政策支持,全球市场规模预计持续增长,2025 年出货量将达 2380 万台,未来将向大功率大容量、光充一体化、智能化方向发展,还会拓展家庭储能、移动医疗等新场景,同时钠离子电池应用、双向逆变技术升级将进一步推动行业发展。

昔时扬尘处 272

新手必看!手把手教你如何在飞牛NAS上玩转Docker容器!(飞牛Nas(fnOS)如何创建Docke容器以及Compose部署项目)

新手必看!手把手教你如何在飞牛NAS上玩转Docker容器!(飞牛Nas(fnOS)如何创建Docke容器以及Compose部署项目)

XiaoqiangClub的博客 1万+

利用paint方法,在窗体绘制图形--java

当我们创作一个界面的时候,我们可以加入许多组件,让界面丰富多彩。但是,如果当你想要的图形,并没有被设定好能调用,我们该怎么办呢?这个时候我们可以使用paint方法,来自己绘制。 使用前有两点需要了解。 第一:paint方法绘制的是Graphics(图形),每个可视化组件对象都有一个Graphics,也只能在自己的范围里调用。Graphics通过不断的刷新,绘制,从而留在屏幕上。 第二:paint方法早已被前人写好,无法满足我们的需求。因此我们要将其重写,来实现自己要的效果。 绘制步骤: 1.继承原

AkinanCZ的博客 1493

YOLOv10有效涨点专栏目录 | 包含卷积、主干、检测头、注意力机制、Neck、二次创新、独家创新等上百种创新机制

Hello,各位读者们好本专栏自开设以来已经更新改进教程100余篇其中包含二次创新、独家创新多种改进方法,包含C2f、主干、检测头、注意力机制、Neck多种结构,也有损失函数和一些细节点上的创新。同时本人一些讲解视频和包含我所有创新的YOLOv10文档并不能在优快云上传,通过建立交流群的形式在内上传我完整的文件和视频我也会在群内不定期和大家交流回答大家问题。专栏介绍。

Snu77的博客 1万+

关于Java中的paint,repaint,update三个方法的关系

这些天一直在用repaint()和paint(),到网上一查,还揪出了update(), 其中查到一篇介绍Java中的paint,repaint,update三个方法的关系的文章: 1.  先还是看看 Java API 中的介绍吧:update public void update(Graphics g)     更新组件。     如果此组件不是轻量级组件,则为了响应对 repaint 的调

xiaoliangmei 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java中paint,repaint,update之间的关系(闪烁问题的解决)

最近总结了一下java中的paint,repaint和updata三者之间的关系,首先咱们都知道用paint方法来绘图,用repaint重绘,用update来写双缓冲。但是他们之间是怎么来调用的呢,咱们来分析一下(想直接看结果,请跳过分析过程): -------------------------------------------------------------------------

Xiaosang's blog 2万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java repaint_java 中paint .repaint.update

paint,repaint,update,这3个都跟绘图有关系的相关的方法把。这3个虽然以前用过,但是但是没有完全理解。下面这个段话是转载的(感觉讲的比较好):repaint()这个方法是一个具有刷新页面效果的方法,如果你要页面进行重画就可以调用.从上面的流程图可以看出,在绘制动画图形时候如果没有调用repaint()方法的时候直接就是由线程调用paint()方法进行绘制,用 repaint()进...

weixin_30803379的博客 411

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java中的repaint_java 中paint .repaint.update

paint,repaint,update,这3个都跟绘图有关系的相关的方法把。这3个虽然以前用过,但是但是没有完全理解。下面这个段话是转载的(感觉讲的比较好):repaint()这个方法是一个具有刷新页面效果的方法,如果你要页面进行重画就可以调用.从上面的流程图可以看出,在绘制动画图形时候如果没有调用repaint()方法的时候直接就是由线程调用paint()方法进行绘制,用 repaint()进...

weixin_30431445的博客 745

java repaint闪烁_java中paint,repaint,update之间的关系(闪烁问题的解决)

最近总结了一下java中的paint,repaint和updata三者之间的关系,首先咱们都知道用paint方法来绘图,用repaint重绘,用update来写双缓冲。但是他们之间是怎么来调用的呢,咱们来分析一下(想直接看结果,请跳过分析过程):-----------------------------------------------------------------------------...

weixin_33547979的博客 622

paint repaint paintComponent update

其实java里设置属性后会导致重绘的,只不过由于这个重绘事件也被放在事件派发线程里的,因此就导致了事件派发线程被Idle了,要避免这种情况,将这个堵塞动作放到另外的线程里面完成。             repaint是出发重绘动作,当调用repaint后,会通知repaintManager增加一个重绘区域,repaintManager在一定条件下会合并一些重绘区域,然后派发一个绘制动作到事件派发...

开发笔记 321

java repaint paint_Java,paint() repaint() paintComponent() update()这些方法的区别是什么?

事件派发线程执行到这个绘制事件时,就会调用组件的paint,在paint方法里会先调用update来将重绘区域清空(默认情况下是填充白色),然后再调用paintComponent来绘制自身,最后调用paintChildren来绘制所有的子。具体流程可以参考JComponent里的paint方法.public void update(Graphics g)调用 paint。不清除背景,而是查看 Co...

weixin_35953060的博客 357

java 中paint .repaint.update

paint,repaint,update,这3个都跟绘图有关系的相关的方法把。 这3个虽然以前用过,但是但是没有完全理解。 下面这个段话是转载的(感觉讲的比较好): repaint()这个方法是一个具有刷新页面效果的方法,如果你要页面进行重画就可以调用. 从上面的流程图可以看出,在绘制动画图形时候如果没有调用repaint()方法的时候直接就是由线程调用paint()方法进行绘制,用 re

zfqzpp的专栏 3061

update paint repaint

JackCF1的专栏 755

Java | 图形界面中paint,repaint,paintcomponent等函数的理解

事件派发线程::事件派发线程是用于swing组件的。当你在main函数里创建一个窗口类的子类像JFrame,就自动创建了一个事件派发线程,如果你在 窗口里按下一个按钮或操作其它控件,就会产生事件,如果你为这个事件定义了响应代码,这些代码就会在事件派发线程里执行。我的理解是事件派发线程里有个事 件队列,事件派发线程不停地检查事件队列,如果有事件就取出来并执行相应操作。 在java里设置组件的属性后会导致重绘,只不过由于这个重绘事件被放在事件派发线程里,因此随后调用的堵塞动作会导致事件派发线程被Id...

黄佳俊的博客 3640

Java学习笔记之repaint,paint

这几天在写工程实践项目,五子棋,自然用到一些图形程序设计,期间最让我疑惑的就是repaint(),我就从最初的地方说起。          基本框架JFrame,然后结构中有一个叫做内容面板的层次,然后将JPanel放入其中,所以,我的主要图形和操作都是在JPanel上的,其本身也是一个组件,然后就进入正题。通过JPanel的继承关系可以知道,repaint,paint还有update都是继承而

Vurteon的专栏 1653

java基础学习总结——关于Java中的paint,repaint,update三个方法的关系

这些天一直在用repaint()和paint(),到网上一查,还揪出了update(), 其中查到一篇介绍Java中的paint,repaint,update三个方法的关系的文章: 1.  先还是看看 Java API 中的介绍吧:update public void update(Graphics g)     更新组件。     如果此组件不是轻量级组件,则为了响应对 repaint 

yiziweiyang的专栏 5685

三分钟彻底搞懂paint,repaint,update!

JPanel的paint是按顺序画的,因为Frame已经过时了,以后咱们就可以把用paint方法把东西画在JPanel(或者JLabel)上面,这样不用加双缓冲就不闪烁!最近总结了一下java中的paint,repaint和updata三者之间的关系,首先咱们都知道用paint方法来绘图,用repaint重绘,用update来写双缓冲。运行:发现不闪烁了,说明刚才加的双缓冲是没有问题的,然后我在JFrame的update方法里和Frame的update方法里都加个输出语句。我第一时间想到的就是加个双缓冲。

linjianshaonian_的博客 1098
上一篇: java画图总结之一 java.awt和javax.swing
下一篇: float和double的数值怎么保存在二进制中
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值