我正在阅读Java中的custom painting教程,其中涉及绘画和重绘方法。在本教程中,使用多个参数作为方法中计算中使用的变量值调用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);
        }
    }

最佳答案

首先,请确保您已阅读并理解JavaDocs for Component#repaint

使用这些方法时,将修改裁剪矩形,因此只有指定的区域才可以在Graphics上下文中使用,这意味着您仍然可以在该区域之外进行绘制,但是不会起作用。

另外,请确保首先“清除”先前的区域,否则最终将产生重影伪影。

这意味着,除非对绘画过程进行了优化以利用此优势,否则对实际绘画区域所花费的时间可能几乎没有影响。

简而言之,是的,调用repaint(int, int, int, int),如果正确完成,将只允许您重新绘画UI的一部分,但是您需要考虑到您现在尝试绘制的内容可能已经被绘制的事实。其他地方,也将需要重新粉刷...

Painting in AWT and Swing引用


  程序必须假定对paint()的调用意味着图形的剪辑矩形定义的区域已“损坏”,并且必须完全重绘





  AWT尝试进行“智能”绘画时
  使组件尽可能高效,即组件的paint()
  实施本身会对整体产生重大影响
  性能。可能影响此过程的两个关键领域是:
  
  使用剪辑区域缩小渲染范围。
  利用内部布局知识缩小范围
  儿童画(仅轻量级)。如果您的组件是
  简单-例如,如果它是一个按钮-则不值得
  努力将渲染考虑在内,以便仅绘制
  与剪辑矩形相交;最好只涂上
  整个组件,并适当裁剪图形。但是,如果
  您已经创建了一个呈现复杂输出的组件,例如文本
  组件,那么至关重要的是您的代码使用剪辑信息
  缩小渲染量。
  
  此外,如果您要编写一个复杂的轻型容器来存放
  众多组件,其中组件和/或其布局管理器具有
  有关布局的信息,那么值得使用该布局
  在确定哪些孩子必须更聪明方面的知识
  被绘。 Container.paint()的默认实现只是
  顺序查看孩子并测试可见性和
  相交-可能不必要地效率低下的操作
  具有某些布局。例如,如果一个容器布置了
  100x100网格中的组件,则可以使用该网格信息
  更快地确定这10,000个组件中的哪个相交
  剪辑矩形,实际上需要绘制。


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

10-07 18:57
查看更多