我正在阅读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个组件中的哪个相交
剪辑矩形,实际上需要绘制。
基本上,这就是说,除非您需要优化绘画过程,否则可能不值得。