Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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中是如何工作的?_Java_Swing_Graphics_Operator Overloading_Repaint - Fatal编程技术网

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

重绘的多参数版本在Java中是如何工作的?,java,swing,graphics,operator-overloading,repaint,Java,Swing,Graphics,Operator Overloading,Repaint,我正在阅读Java教程,其中讨论了绘制和重新绘制方法。在本教程中,将使用多个参数作为变量值调用repaint方法,这些变量值用于方法中的计算 那么,这些论点的目的是什么?我们可以发送任意数量的参数吗这些参数是否覆盖在方法本身中设置这些变量值的语句? 例如: 现在,对于下面的代码,我可以使用robot_x和robot_y的参数调用repait来直接重新绘制形状吗 int robot_x=0; int robot_y=0; int robot

我正在阅读Java教程,其中讨论了绘制和重新绘制方法。在本教程中,将使用多个参数作为变量值调用repaint方法,这些变量值用于方法中的计算

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

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

        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);   
       }

首先,确保你已经通读并理解了文章

使用这些方法时,将修改剪裁矩形,以便在
图形
上下文中,只有指定的区域可用,这意味着您仍可以在该区域之外自由绘制,但不会产生任何效果

此外,请确保先“清除”上一个区域,否则最终将出现重影工件


这意味着,除非您对绘制过程进行了优化以利用这一点,否则它可能对实际绘制该区域所需的时间几乎没有影响

因此,简言之,是的,如果调用
repaint(int,int,int,int,int)
,如果操作正确,将允许您仅重新绘制UI的一部分,但您需要考虑到这样一个事实,即您现在尝试绘制的内容可能已在其他地方绘制,并且也需要重新绘制

引用

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

“智能”绘画

而AWT试图使 尽可能高效地渲染组件,组件的绘制() 实施本身可以对总体环境产生重大影响 演出影响这一过程的两个关键领域是:

使用剪辑区域缩小渲染范围。
使用内部布局知识来缩小什么范围 儿童上漆(仅轻型)。
如果您的组件 简单——例如,如果它是一个按钮——那么它就不值得这么做 努力将渲染因子化,以便仅绘制 与剪辑矩形相交;最好是只在墙上刷油漆 整个组件,并让图形剪辑适当。然而,如果 您已经创建了一个呈现复杂输出的组件,如文本 组件,那么代码使用片段信息是至关重要的 缩小渲染量。

此外,如果您正在编写一个包含 许多组件,其中组件和/或其布局管理器 关于布局的信息,那么使用该布局是值得的 在决定哪一个孩子必须 被粉刷。Container.paint()的默认实现只是 按顺序查看子项并测试可见性和 交叉口——一种不必要的低效操作 有一定的布局。例如,如果容器将 100×100网格中的组件,然后可以使用该网格信息 以更快地确定这10000个组件中的哪一个相交 剪辑矩形,实际上需要绘制


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

我没有看到您调用
重新绘制
,我也没有看到
绘制
任何地方……代码完全脱离上下文。你说的是哪个版本的
repaint
,有5个
repaint
方法可用于扩展
JComponent
的类。我刚刚补充了这一点以供参考。我指的是教程网站上的代码。我刚刚为它添加了一段代码。您想了解varargs吗?首先,确保你已经通读并理解了文章。使用这些方法时,将修改剪裁矩形,以便在
图形
上下文中,只有指定的区域可用,这意味着您仍可以在该区域之外自由绘制,但不会产生任何效果。此外,请确保先“清除”前一个区域,否则最终会产生重影瑕疵。这意味着,除非您优化了绘制过程以利用这一点,否则它可能对实际绘制该区域所需的时间几乎没有影响。
 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);
        } 
    }