为什么在JFrame上绘制的速度比在JPanel上慢得多?

时间:2013-08-16 12:10:01

标签: java swing custom-painting

我的问题是,与直接在JFrame上相比,绘制JPanel时,相同的swing-custom-painting例程快了近16倍?它只是双缓冲吗?它肯定不是吗?

背景:当JFrame未被遮挡时(特别是仅部分遮挡),我遇到了自定义绘画没有刷新的问题。搜索完SO后,我决定咬一口,弄清楚如何将JPanel的子类连接成一个bluddy-NetBeans-form-designer形式。

对于处于相同情况的任何人:在NetBeans中,您需要创建一个新的标准类(不是JPanel表单),恰好可以扩展JPanel,并手动编写其中的所有内容(没有GUI设计器,比如good-ole - 天,叹气)。然后在表单中添加标准JPanel,设置它的大小;然后右键单击并选择“自定义代码”并在组合框中选择“自定义创建”...它将创建一个新的javax.swing.JPanel替换您的子类。

所以...这使我能够“正确地”并在组件上绘画,而不是直接在表格上绘画。此外,面板 - 键 - 听众是一个更加简洁的解决方案,而不是提升框架键事件调度员。

无论如何,现在分析器说完全相同的自定义绘图代码在JPanel的paintComponent()中执行的速度比JFrame的paint()快了近16倍......我想知道是否有人可以解释原因。

提前谢谢你。基思。


编辑:此问题基于MISINTERPRETED METRICS。探查器不包含/报告AWT-EventQueue线程中的JPanel的paintComponent()方法,其中 - 我的基线配置文件确实包含JFrame的paint()。在问一个愚蠢的问题之前我应该​​仔细看一下。我的坏。

2 个答案:

答案 0 :(得分:1)

JFrame是一个扩展aw.Frame的顶级容器,需要本地资源进行绘制,而JPanel是由UI线程本身呈现的swing组件。

答案 1 :(得分:0)

“Swing使用Java2D API进行绘制,根据Java SE 7故障排除指南,Java2D使用一组渲染管道,”可以大致定义为渲染基元的不同方式“。更具体地说,Java2D渲染管道似乎将跨平台Java代码连接到可能支持硬件加速的本机图形库(OpenGL,X11,D3D,DirectDraw,GDI)。

在Java 1.6.0_10(又名6u10)中,基于Direct3D的“全硬件加速图形管道”被添加到Java2D for Windows中,以提高Swing和Java2D应用程序中的渲染性能(默认情况下启用)。

默认情况下,当在Windows系统上使用Java2D时,默认情况下会启用此Direct3D管道和DirectDraw / GDI管道(我假设它们分别用于不同的事情)。“

继续阅读:First call to JFrame constructor takes a long time during Swing application startup (because of java.awt.Window())