2012-08-31 30 views
2

我想问,如果有人可能有解决我面临的问题的解决方案。我在一个应用程序中工作,该应用程序绘制一个动画 - 例如一个包含对象的地图。我的问题是,在绘图顶部,还放置了Jtable,Jlist以及其他组件。动画与JComponents顶部

在我的特殊例子中,所有这些组件都被添加到包含地图的面板中。结果每个组件都像我的fps一样经常重绘。因此,将其中一个表格隐藏起来可以将已经很高的CPU使用率降低50%到30%以下。

我的问题是,我怎样才能避免调用一些静态的视觉内容paintComponent()方法,而没有“背景” - 地图 - 白出菜单。

由于动画会永久重绘,因此如果菜单与相应的JPanel分离,则菜单根本不会显示。

的第一个想法进入以下几个方向:

裁剪 - 其实不如我想,因为我还想,使周围的菜单移动。 JLayeredPane - 已经尝试,但似乎结果,菜单的paintComponent方法仍然频繁调用。 JWindow /内部框架 - 几分钟前曾有过这种想法。拥有一个完整的独立容器应该能够处理我的问题,或者?

我期待着,如果有人有一个优雅的想法,如何解决这一问题,并显着减少CPU使用率。

谢谢! 此致敬礼。

+2

为了更好地提供帮助,请发布[SSCCE](http://sscce.org) –

回答

3

对于画了JComponent(s)放入JPanel你看看

  1. JLayer (Java7)基于JXLayer(Java6)

  2. GlassPane,发现所有JComponents必须是轻量级的,否则是GlassPane背后重量级(J)Components

  3. 可以画到JViewport

EDIT

  • 必须使用Swing Timer用于与Icon放入JXLayerGlassPaneJViewport移动(在JLabel),不使用Runnable#Thread并从来没有,不是通过使用纯Thread.sleep(int)
  • 3

    我会创建一个自定义形状的剪辑。使用Area类并从Area中减去所有子元素的边界。

    +0

    嗯问题似乎是,由于这些组件都放置在applet的内容窗格中,所有paintComponent()方法被调用。因此,为了避免在这些组件后面绘制裁剪区域似乎只是它的一半。 我也尝试了GlassPane,但实际上也使用不同的层次来确保在其他人面前绘制哪个组件,结果仍然在glasspane添加的组件上绘制了任何paintComponent调用。 – user1514195

    +0

    好吧 - 由于地图从一些组件扩展而来,我不得不在适当的位置设置裁剪。因此,地图的重绘不会发生在给定的区域。出于某种原因 - 我的一个菜单组件被绘制一次或两次 - 如同id喜欢的,但是菜单的意思是,它只是一个灰色区域。除了菜单的初始绘制之外,甚至没有任何东西被绘制到小程序的那部分上。 – user1514195