我的问题是为什么在JPanel上绘图时,相比直接在JFrame上绘制相同的swing定制绘画例程快近16倍?它只是双缓冲?它不可能,当然?为什么在JFrame上绘制比在JPanel上慢得多?
背景:当JFrame没有被遮挡时(特别是只有部分遮挡),我有一个自定义绘画未刷新的问题。在搜索完毕后,我决定咬紧牙关,想出如何将JPanel的一个子类连接到bluddy-NetBeans形式的设计器表单中。
对于处于同一情况的任何人:在NetBeans中,您需要创建一个新的标准类(而不是JPanel表单),并且手动对所有内容进行编码(无GUI设计器,天,叹了口气)。然后你添加一个标准的JPanel到你的表单中,设置它的大小;然后右键单击并选择“自定义代码”,然后在组合框中选择“自定义创建”......它将创建一个新的javax.swing.JPanel替换其子类。
所以...这让我“正确地做到”并在组件上绘画,而不是直接在窗体上绘画。此外,面板 - 按键 - 监听器是一个比hi-jacking frames key-event-dispatcher更方便的解决方案。
无论如何,现在profiler说完全相同的自定义绘制代码在JPanel的paintComponent()中执行的速度比相同的JFrame的paint()快近16倍......我想知道是否有人能解释为什么。
预先感谢您。基思。
编辑:这个问题是基于误解的指标。 profiler不包括/报告JPanel的paintComponent()方法在AWT-EventQueue线程中,因为我的基线配置文件包含JFrame的paint()。在问一个愚蠢的问题之前,我应该仔细看看。我的错。
分析器VisualVM iirc应该告诉你哪些方法需要更多时间。这将是一个很好的开始,找到正在发生的事情。 –
@JonathanDrapeau:你说得对!配置文件不会报告paintComponent作为“AWT-Event-Queue”线程的一部分(而JFrame绘图是)!所以这两种解决方案的报道方式有所不同。我的错! – corlettk
这是一个非常具体的问题,因为对AWT组件的访问会比它的孩子Swing JComponents更快(同龄人来自本地操作系统),但是我们已经讨论过史前图形核心,没有地方可以比较最优化的东西,一个新的图形核心用于Nimbus和相同的(AFAIK),作为JavaFX – mKorbel