我从听众那里多次调用重绘,但我设计绘画函数的方式只需要一次重绘。我生成了一堆重绘,因为它连接到了我的鼠标运动侦听器。

有没有办法取消某个组件的所有待处理的重绘?我不能开始忽略重新绘制,因为有些重新绘制是有效的,例如调整框架大小或从最小化恢复它时。

我为什么关心?因为我的绘制代码非常繁重,而且我无法以非常高的 FPS 进行完全重绘。

有帮助吗?

解决方案

秋千将结合重绘你:看到AWT “画和Swing“在Sun的网站上。如果您安排了许多快速连续重绘,他们将共同结合成至paintImmediately()的单次调用。

其他提示

频繁重绘请求将自动折叠成一个。优化这个最好的办法是不要重绘整个事情,但称具体区域的坐标重新绘制。这意味着你只重绘这实际上改变了该地区。

我的理解是 repaint() 只需将组件的一个区域添加到重绘队列即可安排重绘。如果已在组件上请求重绘,则新的重绘区域将仅与先前请求的区域合并。直到处理完事件队列中的所有其他事件后,重绘才会真正执行。因此,您额外的重新绘制可能不会产生太大的影响,即你的绘画代码只会被执行一次。看 JComponent.repaintRepaintManager.addDirtyregion.

我有 被黑客入侵 类似的东西一起改进 JFreechart 在进行大量重新绘制调用时决定绘制的方式。

基本上我做了以下事情:

  • 创建一个 ScheduledExecutorService 作为类中的一个字段
  • 接收第一个重画请求和 submit 执行器在 EDT 上运行,例如 50 毫秒返回 future
  • 接收第二个请求 - 测试之前的重绘是否已完成(fut.isDone()) 如果是这样安排下一次重新绘制;否则什么都不做。

这样您每秒最多应该收到 20 个重绘请求。

我已经做了类似的事情来批量处理调用的数量 fireDataTableChanged 当许多变化同时发生时。

我听到你说的话。您确实只能重新绘制区域的一部分。在Sun网站上的“执行自定义绘画示例”中,我发现了一个有用的示例,它展示了如何绘制拖动的矩形,然后仅在鼠标移动或释放时重新绘制该区域。

这是代码的相关部分...

public void mouseDragged(MouseEvent e) {
            updateSize(e);
        }

        public void mouseReleased(MouseEvent e) {
            updateSize(e);
        }

        /* 
         * Update the size of the current rectangle
         * and call repaint.  Because currentRect
         * always has the same origin, translate it
         * if the width or height is negative.
         * 
         * For efficiency (though
         * that isn't an issue for this program),
         * specify the painting region using arguments
         * to the repaint() call.
         * 
         */
        void updateSize(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
            currentRect.setSize(x - currentRect.x,
                                y - currentRect.y);
            updateDrawableRect(getWidth(), getHeight());
            Rectangle totalRepaint = rectToDraw.union(previousRectDrawn);
            repaint(totalRepaint.x, totalRepaint.y,
                    totalRepaint.width, totalRepaint.height);
        }

此代码受版权保护(请参阅 此处获取完整代码和版权声明)

此处查看更多示例列表

说实话,我在 FPS 上也遇到了类似的问题,但这可能是由于我目前的代码很差!在过去的几个月里,我学到了很多东西,现在我可以使我的代码更加高效。希望当超过 2 个“人”拖慢我的图形速度时,我能够克服 FPS 问题!嗯……我只在我的代码中的同一部分实现了上述代码,而没有在其他部分实现,但无论如何请尝试一下!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top