多参数版本的重绘是如何在Java中工作的



我正在阅读Java的自定义绘画教程,其中讨论了绘画和重画方法。在本教程中,repaint方法使用多个参数作为方法中计算中使用的变量值来调用。

那么,这些参数的目的是什么?我们可以发送任意数量的参数吗?这些参数是否覆盖了在方法本身中设置这些变量值的语句?

例如

:现在,对于下面的代码,我可以使用参数robot_x和robot_y调用repaint来直接重新绘制形状吗?

        int robot_x=0;
        int robot_y=0;     
        int robot_radius=50;
        ArrayList<Integer> robot_list= new ArrayList<Integer>();
        robot_list=positionRobot(robot_x,robot_y);
        robot_x=robot_list.get(0);
        robot_y=robot_list.get(1);
        drawRobot(g,robot_x,robot_y,robot_radius);
        private void drawRobot(Graphics g, int x, int y, int radius)
       {
        g.setColor(Color.GREEN);
        g.fillOval(x, y, radius, radius);   
       }

Oracle网站中的代码片段

 private void moveSquare(int x, int y) {
        int OFFSET = 1;
        if ((squareX!=x) || (squareY!=y)) {
            repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
            squareX=x;
            squareY=y;
            repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
        } 
    }

首先确保您已经通读并理解了Component#repaint的JavaDocs。

当使用这些方法时,剪辑矩形被修改,因此只有您指定的区域可以在Graphics上下文中使用,这意味着您仍然可以自由地在该区域之外绘制,但它将没有效果。

同时,确保你先"清除"了之前的区域,否则你最终会得到重影。

这意味着,除非你的绘制过程是优化的,以利用这一点,它可能对实际绘制该区域所花费的时间几乎没有影响。

所以,简而言之,是的,调用repaint(int, int, int, int),如果做得正确,将允许你重新绘制UI的一部分,但你需要考虑到你现在试图绘制的东西可能已经在其他地方绘制过了,也需要重新绘制……

引自AWT和Swing中的绘画

程序必须假设调用paint()意味着图形的剪辑矩形定义的区域被"损坏",必须完全重新绘制

"智能"绘画

而AWT试图使过程尽可能高效地渲染组件,组件的paint()实现本身可以对整体产生重大影响表演可能影响此过程的两个关键区域是:

使用剪辑区域来缩小渲染的范围。
利用内部知识的布局来缩小什么范围儿童被涂上颜色(仅限体重轻的)。
如果您的组件是简单——例如,如果它是一个按钮——那么它就不值得努力对渲染进行因子化处理,以便只绘制该部分与剪辑矩形相交;最好是直接涂整个组件,并让图形剪辑适当。然而,如果您已经创建了一个呈现复杂输出(如文本)的组件组件,那么代码使用剪辑信息至关重要缩小渲染量

此外,如果您正在编写一个复杂的轻量级容器,其中包含多个组件,其中组件和/或其布局管理器具有关于布局的信息,那么使用该布局是值得的更聪明地决定哪个孩子必须是画。Container.paint()的默认实现简单依次查看子节点并测试其可见性和交集——一种可能不必要地低效的操作有一定的布局。例如,如果一个容器布置了组件在100x100网格中,然后可以使用该网格信息以便更快地确定这10,000个组件中哪些相交剪辑矩形和实际需要绘制。

基本上,这就是说,除非你需要优化绘画过程,否则这可能不值得。

最新更新