swing的渲染原理主要包括了Event,Painting,Rendering,Double Buffering,Threading,逐一介绍一下
Event:
事件在程序中可以有本地系统引发,或者java程序自己引发,或者应用程序自己构建,所有的事件都有事件队列EventQueue进行统一维护和分发,他是一个单线程的,叫做EDT,后面的Threading中将介绍。他是一个非常重要的机制,是保障高效、灵活的基础。
Painting:
在swing更新应用程序的界面时候执行代码,可以执行标准的组件代码,也可执行自定义代码。
painting进程主要包含了发送EDT的paint请求数据和EDt执行paint和paintComponent的执行结果。
二种数据来源:
1)swing或者awt发送的repaint请求
2)应用程序发送的请求
例如:窗口大小变化,awt会接受本地的请求,进行repaint自己。在swing中一个按钮鼠标移动到上面,状态发生变化,repaint自己,也可以在执行代码中去执行repaint,执行控件的绘制。
一般来说repaint是自动的,swing在发现了状态变化以后会自动执行repaint。
repaint主要包含二种类型
1)asyschronous:告诉swing需要更新,具体计划有swing自己安排,他分为按照控件重绘和按照区域重绘二种,这样可以提高效率。
2)syschronous:马上绘制,需要注意保证在正确的线程中,比较容易引起死锁,尽量少用。调用方法paintImmediately
Rendering:
paint在jdk中比较重要的方法介绍
paintComponent:如果定义的组件需要自定义render,覆盖此方法,进行组件的绘制
paint:绘制,他其中调用了paintComponent,paintBorder等方法,如果覆盖了需要保证他们的执行。不建议覆盖此方法,但是对于如果需要绘制半透明的组件,其中的边框也是半透明的,可以覆盖此方法进行处理。一般情况下AWT组件是覆盖paint方法,swing的组件,覆盖paintComponent方法。
setOpague:设置是否透明
Threading:
应用程序启动以后需要启动三个进程,一个主进程,一个是tookit进程,一个是EDT。
一个给textarea输入一个字符的事件需要进行如下处理:
按下键盘,eDT接受到事件,然后转给组件进行处理,因为组件已经注册了事件监听,然后监听在转给EDT,EDT接收到事件后分发给compoent进行repaint。
需要特别注意,EDT是单进程的,如果在进程中进行长时间的线程阻塞,会造成程序的假死,是一种非常不好的感知,这种方式有以下几种解决办法:(注意并不是只有swing是单线程的,其中的swt,qt,.net winForm都是单线程的)
1)采用编写新的线程.
new Thread(){
}.run()
这种方式可以将长时间的启动新的线程进行处理,不阻塞EDT,这样可以满足处理,但是啊违背了EDT的单线程原则,在长时间的处理完成以后,需要更新空间的属性,有一个新的线程去更新,可能会造成不法判断的问题。这个时候很有可能就会出现个人测试怎么都不会有问题,到客户哪里就经常出现问题的局面。
2)采用SwingUtilities的三个方法进行处理
A)invokeLater:这个方法是在处理的过程中给EDT发送新的处理,然后让EDt进行安排方法体内部的处理。
这个正好可以上面的1中的更新空间内容部分的问题,可以如下编码
new Thread(){
public void run(){
StringUtilities.invokeLater(new Runable(){
//run
});
}
}.run()
B)isEventDispatchThread:判断是否是EDT线程,
public void setLable(){
Runable test= new Runable(){
//处理函数
public void run(){}
}
if(SwingUtilities.isEventDispatchThread()){
test.run();
}else{
SwingUtilities.invokeLater(test);
}
}
c)invokeWait:执行等待,知道EDT返回值
jdk中二个Timer的区别:
java.util.Timer:不能执行EDt线程,只能通过SwingUtilities的invokeLater执行EDt
javax.swing.Timer,可以执行EDt线程
SwingWorker:SwingUtilities的功能非常强大,但是使用它以后会出现大量的内部类,在jdk6中添加了一个javax.swing.SwingWorker他可以满足这个功能,不用出现大量的匿名类
编写一个子类,继承自swingWorker,然后覆盖其中的doinBackground方法,
doinBackground:是执行的方法,返回t
在中间如果需要向EDT发送消息,可以采用pushlish(V)
结束以后可以调用done方法,在方法中可以用get方法取出doInBackground方法的值
分享到:
相关推荐
Real-Time+Rendering+3rd+edition,Real-Time+Rendering+3rd+edition,Real-Time+Rendering+3rd+edition,Real-Time+Rendering+3rd+edition,Real-Time+Rendering+3rd+edition,Real-Time+Rendering+3rd+edition
server-side-rendering-comparison, 服务器端渲染比较 服务器端呈现比较基准信息NODE_ENV=production 。renderToString 都需要 lib 而不是 dist具有 600个dom节点运行# preparenpm installnpm run
《Real-Time Rendering 3rd》 是一本在计算机图形学领域极具权威性的著作,专注于实时渲染技术。...通过学习这些知识,开发者可以构建出更为逼真且高效的实时图形应用,如游戏、虚拟现实、可视化工具等。
This paper describes a system architecture for realtime display of shaded polygons. Performance of 100,(300 lighted, 4-sided polygons per second is achieved. Vectors and points draw at the rate of 400...
Real-Time Rendering, Fourth Edition 实时渲染最新版 第四版PDF,下载地址见文档....
### OGRE(O-O Graphics Rendering Engine)中文版 #### OGRE简介 OGRE是一个高度灵活、性能优秀的3D渲染引擎,适用于游戏开发等图形密集型应用。它采用面向对象的设计理念,提供了丰富的功能集和良好的扩展性。 ...
server-side-rendering-master.rar
Algorithm-parallel-volume-rendering.zip,群集上并行体绘制的概述和详细讨论。我们描述了在高性能集群上实时呈现大数据的算法、优化技术和挑战。,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。
作者还指导读者如何循序渐进地阅读本书,确保学习过程既系统又高效。 #### 几何与变换 几何与变换是渲染技术中的基础概念。本书详细介绍了向量、点、法线、射线等基本几何元素,以及三维包围盒的应用。变换部分则...
《实时图形渲染引擎》是一本深入探讨实时图形渲染技术的权威著作,对于想要在游戏开发、虚拟现实、增强现实等领域从事引擎开发的人员来说,这本书是不可或缺的学习资源。书中涵盖了图像学的基础理论以及高级技术,...
Real-Time Rendering 4rd最新版,高清大概800M,详细介绍渲染知识
Real-Time Rendering 4th Edition(实时渲染第4版) 高清全彩版,图形学/游戏方向实时渲染经典书籍推荐,仅供学习使用。百度网盘下载链接永久有效。
"Screen-Space-Perceptual-Rendering-of-Human-Skin-Slides" 提供的文档着重介绍了如何在屏幕上模拟人类皮肤的感知渲染技术。 首先,我们要理解皮肤的基本结构。它由三层主要部分组成:薄油层、表皮和真皮层。薄...
附件为百度网盘链接。...Real-Time Rendering Forth Edition 2018年最新第四版,实时计算机图形学百科全书全新版本,图形学必备,完美pdf版本,非扫描版,可以选择字体,强烈推荐。文件较大,将近1G。
ShaderX 3.-.Advanced Rendering电子书,里面很多游戏特效
Silhouette Rendering Pencil Rendering Acknowledgments Bibliography Alpha Blending as a Post-Process Benjamin Hathaway Introduction The Alternatives The Source Artwork Initial Attempts The Screen-Space...
Real-Time Rendering 4th Edition完整版 全彩 pdf 892MB 这里挂的是百度云链接