如何在Swing中仅重绘脏区?

时间:2017-09-20 20:23:54

标签: java swing

  1. 重绘脏区只能提高性能吗?

  2. 如果答案是肯定的,怎么做? 最初我使用repaint()来调用paintComponent(Graphics);但是,最近我意识到repaint()实际上是重绘(0,0,宽度,高度),每次重绘一切。如果我使用带参数的repaint()来指定脏区域,它会以什么方式将这些数据传递给paintComponent(Graphics)?

2 个答案:

答案 0 :(得分:2)

  

如果我使用带参数的repaint()来指定脏区域,它会以什么方式将这些数据传递给paintComponent(Graphics)?

"剪辑边界"或者Graphics对象将被设置为指定的区域

  

1.重新涂抹脏区只能提高性能吗?

为什么呢?你有绘画问题吗?除非您有理由这样做,否则不要对代码进行微观优化。代码将难以维护和调试。您将添加额外的逻辑来确定需要重新绘制哪些区域。

另外,请记住,多个重绘请求会合并到一个请求中。因此,如果您请求重新绘制组件的左上角并立即请求重新绘制底部/右侧,则这两个请求将合并到包含两个区域的区域,这意味着整个组件将被重新绘制。所以你没有做任何额外的工作。

答案 1 :(得分:0)

要仅重新绘制大JComponent的“脏”区域,您需要使用RepaintManager。您可以使用以下内容获取当前RepaintManager

RepaintManager rm = RepaintManager.currentManager(component);

您甚至可以使用自己的自定义版本替换RepaintManager。其他详细信息可以在Oracle的网站上找到。