9

我的问题是,为什么在 JPanel 上绘图时,与直接在 JFrame 上相比,相同的摆动自定义绘图程序快近 16 倍?它只是双缓冲吗?不可能吧?

背景:当 JFrame 未被遮挡(尤其是仅被部分遮挡)时,我遇到了自定义绘制未刷新的问题。在搜索了 SO 之后,我决定硬着头皮弄清楚如何将 JPanel 的子类连接到一个 bluddy-NetBeans-form-designer 表单中。

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

所以......这让我能够“正确地做”并在组件上绘画,而不是直接在表单上。此外,panels-key-listener 是一个比劫持帧 key-event-dispatcher 更简洁的解决方案。

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

先感谢您。基思。


编辑:这个问题是基于被误解的指标。分析器不包括/报告 AWT-EventQueue 线程中的 JPanel 的 paintComponent() 方法,因为我的基线配置文件确实包括 JFrame 的 paint()。在问一个愚蠢的问题之前,我应该更仔细地看一下。我的错。

4

2 回答 2

1

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

于 2013-10-10T10:02:39.120 回答
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 管道都默认启用(我假设它们各自用于不同的事情)。”

继续阅读:在 Swing 应用程序启动期间首次调用 JFrame 构造函数需要很长时间(因为 java.awt.Window())

于 2013-08-20T13:28:50.703 回答