代码之家  ›  专栏  ›  技术社区  ›  Pyrolistical

如何在Swing中组合重新喷漆?

  •  3
  • Pyrolistical  · 技术社区  · 15 年前

    我经常从一个听众那里调用重绘,但是我设计我的绘制功能的方式只需要一个重绘。我生成了许多重绘,因为它钩住了我的鼠标运动监听器。

    是否有方法取消某个组件的所有挂起的重新喷漆?我不能忽略重绘,因为有些是有效的,比如当你调整帧的大小或从最小化恢复它。

    我为什么在乎?因为我的油漆代码很重,我不能在一个非常高的fps进行完整的重新喷漆。

    5 回复  |  直到 15 年前
        1
  •  2
  •   Sbodd    15 年前

    Swing将为您组合重新喷漆:请参见 "Painting in AWT and Swing" 在Sun的网站上。如果您快速连续地安排多个重新绘制,它们将被组合成一个调用paintimmediately()。

        2
  •  2
  •   Eugene Ryzhikov    15 年前

    频繁的重新绘制请求会自动折叠成一个请求。优化这一点的最佳方法不是重新绘制整个对象,而是调用具有特定区域坐标的重新绘制。这意味着您只需重新绘制实际更改的区域。

        3
  •  1
  •   Dave Ray    15 年前

    我的理解是 repaint() 只需通过将组件的一个区域添加到重绘队列来安排重绘。如果组件上已请求重新绘制,则新的重新绘制区域将与先前请求的区域联合。在处理事件队列中的所有其他事件之前,不会实际执行重新绘制。因此,您的额外重新绘制可能不会有太大的区别,即您的绘制代码将只执行一次。见 JComponent.repaint RepaintManager.addDirtyregion .

        4
  •  0
  •   pjp    15 年前

    我已经 类似的东西一起改进了JFreechart在多次调用重新绘制时决定如何绘制。

    基本上,我会做以下工作:

    • 创建一个 ScheduledExecutorService 作为课堂上的一个领域
    • 收到第一次重新喷漆请求,以及 submit 让执行者在50毫秒内运行EDT以恢复未来
    • 接收第二个请求-测试以查看上一次重新喷漆是否完成( fut.isDone() )如果是这样,安排下一次重新喷漆;否则什么也不做。

    这样,您每秒最多可以收到20个重新喷漆请求。

    我做过类似的事情来成批地处理 fireDataTableChanged 当许多变化同时发生时。

        5
  •  0
  •   Relequestual    15 年前

    我听到你的话了。 您确实只能重新绘制一部分区域。 在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);
            }
    

    此代码受版权保护(请参见 here for full code and copyright notice )

    here for further example listings

    说实话,我在FPS上也有类似的问题,但这可能是因为我目前的代码太差了!在过去的几个月里,我学到了很多东西,现在我可以提高代码的效率了。希望我能克服FPS的问题,当超过2个“人”放慢我的图形!哼哼… 我只为我的代码中的同一部分实现了上述代码,而不是其他部分,但无论如何,请尝试一下!