Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Swing中仅重新绘制脏区域?_Java_Swing - Fatal编程技术网

Java 如何在Swing中仅重新绘制脏区域?

Java 如何在Swing中仅重新绘制脏区域?,java,swing,Java,Swing,重新绘制脏区域是否只会提高性能 如果答案是肯定的,怎么做? 最初我使用repaint()调用paintComponent(图形);但是,最近我发现repaint()实际上是repaint(0,0,width,height),它每次都会重新绘制所有内容。如果我使用带有参数的repaint()来指定脏区域,它将以何种方式将这些数据传递给paintComponent(Graphics) 如果我使用带有参数的repaint()来指定脏区域,它将以何种方式将这些数据传递给paintComponent(Gr

重新绘制脏区域是否只会提高性能

  • 如果答案是肯定的,怎么做? 最初我使用repaint()调用paintComponent(图形);但是,最近我发现repaint()实际上是repaint(0,0,width,height),它每次都会重新绘制所有内容。如果我使用带有参数的repaint()来指定脏区域,它将以何种方式将这些数据传递给paintComponent(Graphics)

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

    “剪辑边界”或图形对象将设置为指定区域

    1.重新绘制脏区域是否只会提高性能

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

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

    要仅重新绘制大型
    JComponent
    的“脏”区域,您需要使用。您可以通过以下方式获取当前的
    重新绘制管理器

    RepaintManager rm = RepaintManager.currentManager(component);
    

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

    您不能直接使用重新绘制管理器绘制脏区域。重绘请求通过Swing自动转发到重绘管理器。每当您对组件发出重绘(…)请求时,指定区域将作为脏区域添加。然后,RepaitManager将为您合并这些脏区域,然后在组件上调用paint()。“重新绘制脏区域是否只会提高性能?”除非您对代码进行了优化以使用它。除非您检查当前的
    剪辑
    边界,并且只更新其中出现的内容,否则它在性能改进方面几乎没有什么作用-因为在一天结束时,Java仍然需要将整个生成的位图绘制到屏幕上——也许可以看看其中有关于这个主题的讨论。我有一个绘制方法,可以大量调用Graphics.fill()。当鼠标靠近某些形状时,它们会发生变化,所以我天真地重新绘制了所有东西。它在4K大小时落后了很多。我通过重新绘制(边界)获得了更好的性能。无需减少fill()的调用数。