java - 使用 swing 的动画管道

标签 java swing animation paint jlayeredpane

我尝试优化我的应用程序的绘图。目前我已经实现了一个动画以及几个 GUI 组件。有些是完全分开的,有些是相互重叠的。目前我面临 Swing 组件重叠的问题。 GUI 的一部分与我的动画重叠,需要绘制大量字符串和 - 放入 Jlist 中 - 常见的 Swing 组件。

结果,重叠的 GUI 会随着动画的更新而重新绘制。我尝试使用很多不同的方法来确定在彼此面前绘制的内容。像 GlassPane、Jlayeredpane 这样的东西。不幸的是,在这些尝试中,重叠的 Menus PaintComponent 方法只需要在用户与它们交互时被调用,但由于动画而被频繁调用,并导致相当高的 CPU 使用率。

我尝试在分层 Pane 中以较低的顺序放置菜单,即:

    getLayeredPane().add(map, JLayeredPane.DEFAULT_LAYER);
    getLayeredPane().add(mapController, JLayeredPane.PALETTE_LAYER);
    getLayeredPane().add(settings, JLayeredPane.PALETTE_LAYER);        
    getLayeredPane().add(painter, JLayeredPane.POPUP_LAYER);   

在画家的绘画过程中,我尝试修改该区域 - 即:

@Override
protected void paintComponent(Graphics g) {

    g2 = (Graphics2D)g;
    g2.setRenderingHints(DefaultResources.getRenderQuality());

    g2.clip(JMain.getInstance().getMapBounds());

    ...}

好吧 - 一旦画家组件!isOpague();下面的所有组件都会被重新绘制。不幸的是,如果我确实将菜单放在更高的顺序中,它们也需要随着任何动画更新而重新绘制。

有人知道如何避免与动画组件重叠组件的永久重绘吗?

我见过的唯一解决方案是使用重量级容器。不幸的是,相对定位在移动过程中也表现出了一种不合适的行为。

感谢您的任何建议!!

最佳答案

嗯,很明显,如果您有重叠的非不透明组件,那么所有这些组件都将在其中一个组件发生任何更改时重新绘制,除非您优化对某些特定矩形的动画重绘调用,所以不会有任何无用的操作。

让我详细描述一下 Swing 的工作原理 - 您在 Paint、paintComponent 和其他方法(在每个组件重绘时调用)中所做的所有绘画都是在包含“缓存”版本的单个图像的子图像上完成的整个框架的接口(interface)。

现在假设您更改了 UI 中的某些内容(添加/删除/重绘组件) - 最终图像(或至少包含您的组件的一小部分)必须正确更新。为此,如果您的组件不是不透明的,所有子组件都将使用您的组件边界作为重绘矩形进行重新绘制,以便为您的组件创建正确的背景。如果您的组件是不透明的 - 它将是唯一一个被重新绘制的组件,但它也必须自行填充整个边界矩形,否则您将在每次重新绘制时在组件后面看到可怕的绘制伪影。

总结 - 为了避免无意义地重绘重叠组件,有几种方法:

  1. 优化对实际需要重绘区域的动画重绘调用
  2. 使用不透明组件,除非您想在组件中绘制透明的内容
  3. 优化所有重叠组件的绘制操作,这样重新绘制就不会花费太多时间

根据您的具体情况,可能还有更多的优化方法,但您必须自己找到它们,因为在不了解全局的情况下这是不可能的。

您还可以在本书中找到许多有关 Swing 优化的有用信息:Filthy Rich Clients

关于java - 使用 swing 的动画管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674122/

相关文章:

java - 如何使 SwingWorker 多次启动..?

javascript - Velocity.js 在动画后清除默认值

iphone - 从不同的 View Controller 调用时,UIView 动画不会触发?

java - 我们如何使用 Scene builder 2 来定位 java 7?

java - 在JAVA中通过不可靠的网络发送消息

java - 无效的方法声明 : "return type required" in constructor

ios - 在 Swift 中添加图像过渡动画

java - 如何使用 Java 从两个 for 循环中获取单独的输出

java - 如何让 Java 日志记录使用修改后的 java.util.logging.Level 类

java - 在 JTextArea 中实现复制/粘贴?