3

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

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

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

4

5 回答 5

2

频繁的重绘请求会自动合并为一个。优化这一点的最佳方法不是重新绘制整个事物,而是使用特定区域的坐标调用重新绘制。这意味着您只重新绘制实际更改的区域。

于 2009-08-10T19:08:51.257 回答
2

Swing 将为您结合重绘:请参阅Sun 网站上的“在 AWT 和 Swing 中绘画” 。如果您安排快速连续的多次重绘,它们将合并为一个对paintImmediately() 的调用。

于 2009-08-10T19:09:27.730 回答
1

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

于 2009-08-10T19:08:42.973 回答
0

我已经一起破解了类似的东西,以改进 JFreechart 在多次调用重新绘制时决定绘制的方式。

本质上,我执行以下操作:

  • 在类中创建一个ScheduledExecutorService字段
  • 接收第一个重绘请求,并将submit其发送给执行程序以在 50 毫秒内在 EDT 上运行,然后返回未来
  • 接收第二个请求 - 测试前一次重绘是否完成(fut.isDone()),如果完成则安排下一次重绘;否则什么也不做。

这样,您每秒最多应该获得 20 个重绘请求。

fireDataTableChanged当大量更改同时发生时,我已经做了类似的事情来批量处理调用次数。

于 2009-08-10T19:15:21.290 回答
0

我听你说什么。您确实只能重新绘制一部分区域。在 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 问题!嗯...我只在我的代码中为同一部分实现了上述代码,而不是其他代码,但一定要试一试!

于 2009-08-13T23:05:59.093 回答