Java2D工件是什么?

3
我正在编写一个游戏,使用Java2D,目前还没有遇到任何问题,直到我开始将其与其他swing组件集成时。我的问题是,当我添加到JFrame的第一个组件不是我绘图的画布时,当我在文本框的滚动条上悬停鼠标时会出现奇怪的伪像。每次执行应用程序时都会发生这种情况。当我将画布放在第一位时,就没有问题了。
由于某种原因,这似乎只发生在Windows上,当使用默认的Java2D管道(即sun.java2d.d3d=true)时,伪像才会出现。当我设置sun.java2d.opengl=true或sun.java2d.noddraw=false AND sun.java2d.d3d=false时,就不会发生了。
我猜这是Direct3D Java2D管道的某种bug?我可以很容易地解决它,但很想知道是否有其他人遇到过这样的问题?我正在运行最新的JDK7u7,但以前的版本也会出现这个问题。值得注意的是,如果我最小化窗口并将其恢复,伪像就会消失,并且永远不会返回,直到我重新启动应用程序。
带有伪像: bad 没有伪像(在添加画布而不是JLabel图像之后): good 如果有人对此有更多信息,我会非常感激。谢谢!

2
你能否提供一个简单的工作示例?这可能是重量和轻量级组件的问题,不正确的绘画链,线程更新...你想让我们继续猜测吗? - MadProgrammer
我相信你是正确的,这可能与将Canvas类与JFrame / JTextPane等混合使用有关。问题在于,根据我的研究,似乎没有轻量级的Canvas类等效物。这可能意味着我必须自己编写双缓冲。 - Consty
JComponent 不难想到,但 JPanel 或许更好。它们都可以提供默认的双缓冲功能。 - MadProgrammer
1个回答

5

我不覆盖paint()或paintComponent(),因为我使用BufferStrategy在专用线程内获取Graphics2D类进行绘制。我确实继承自Canvas,但这是否很重?如果是,那么是否有一个轻量级的等效物可以与Swing很好地配合使用? - Consty
JPanel是一个不错的选择,因为它启用了默认的BufferStrategy,但我认为GL需要一个java.awt.Canvas。编辑:更多信息请参见此处 - trashgod
1
看起来切换到JPanel并使用内部双缓冲效果很好。我只需要将我的游戏循环切换为调用repaint(),并将所有绘图代码放置在paintComponent()中,现在我不再遇到这个问题了。这明显是由于混合轻量级和重量级组件引起的。谢谢! - Consty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接