Swing渲染基本原理<一>

本文深入探讨了Swing渲染及其在用户界面绘制过程中的关键作用,包括事件处理、绘制、双缓冲技术、线程交互等内容。重点阐述了事件队列管理、组件绘制策略、重绘请求类型及其优化策略,旨在帮助开发者理解和优化Swing应用程序的UI性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=large]
利用Swing渲染,Swing应用程序绘制了在显示器上出现的用户界面。主要包括在事件、绘制 、渲染、双缓冲、线程。
事件:Swing接收和处理事件的方式是理解线程如何在Swing内部交互及理解应用程序如何与Swing和AWT事件交互的关键。在Java中,事件可以来自本地系统,如一个可见的窗体或键盘输入。也可也是Java本身,如应用程序产生的请求。所有的时间都是放在一个事件队列中的,Java.awt.EventQueue负责取出事件并来派发事件,它的机制是一个单独的线程管理,叫做事件派发线程。
绘制:Swing中的绘制是应用程序用来更新显示的过程,它也是由事件队列所受的影响来影响Swin组件的paint()和paintComponent()来绘制。是通过Swing或AWT库自身发起一个绘制请求,或应用程序代码发起这样子的一个请求。在这样子的情况下发起的请求,应用程序代码知道,基于一些内部状态的改变,显示也应该改变。
组件中发起绘制方法的主要分为两类:异步请求和同步请求。

异步绘制请求的工作原理 告诉Swing需要更新内容,让Swing处理了编排这些请求的细节,并适当的组合这些请求。所有的异步请求都是repaint()得变体,它也可以分为两类:整个组件的更新<Component.repaint()>和指定区域的更新<Component.repaint(int x,int y,int width,int height)>。

repaint()的底层告诉Swing必须更新整个组件区域。如果这个组件是一个容器,后续的paint()方法的调用还会导致每个子组件更新自身。重绘请求可以说是合并,例如,请求一个重绘,而在对垒中已经有一个还没有运行过的重绘请求,那么第二个请求将被忽略,因为已经由最早的那个请求执行了。
第二个方法和repaint()一样,只是重新绘制一个组件的部分区域
一个简单的repaint()等同于repait(0,0,getWedth(),getHeight()).

同步绘制请求:在处理同步绘制时必须小心处理,它必须在事件派发线程中进行,并且代码必须在正确的线程中以便正确的时间发生,如果不是正确的线程,结果也会不对。
它也有两个方法几个方法,
JComponet.paintImmediately(int x, int y,int w, int h) 和 JComponent.parintImmediately(Rectangle r)
这两个方法是相同的,都是指定需要更新的区域。要强制一个组件内容同步绘画,paintImmediately()是唯一需要的方法。用它来告诉组件指定区域更新,内部是调用适当的paint();有几个缺点是不止必须在派发事件线程中,还得立刻执行paint(),所以意味着它是没有合并绘画请求的。
还有一个是夜是Compont.paint(Graphics),正常发展情况下是不会调用的paint()的。但是在特定的情况下会调用,例如当要把一个组件渲染到一个图像,而不是它在Swing窗口中通常的位置。


[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值