我正在阅读用Java编写的定制绘画教程,该教程讨论的是油漆和重绘方法。在本教程中,使用多个参数调用重绘方法,作为方法中计算中使用的变量值。
那么,这些争论的目的是什么呢?我们可以发送任意数量的参数吗?,这些参数是否覆盖在方法本身中设置这些变量值的语句?
例如:现在,对于下面的代码,我可以用robot_x和robot_y的参数调用重绘来直接重新绘制形状吗?
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);
}
}发布于 2014-07-29 03:55:47
首先要确保你已经阅读并理解了Component#repaint。
当使用这些方法时,裁剪矩形会被修改,因此只有您指定的区域可以在Graphics上下文中使用,这意味着您仍然可以在该区域之外自由绘制,但不会产生任何影响。
另外,确保您首先“清除”了前面的区域,否则您将得到幽灵的工件。
这意味着,除非你对绘画过程进行优化以利用这一点,否则它可能对实际油漆该区域所需的时间几乎没有影响。
因此,简单地说,是的,调用repaint(int, int, int, int) (如果正确的话)将只允许您重新绘制UI的一部分,但您需要考虑这样一个事实,即您现在试图绘制的内容可能已经绘制到其他地方,并且还需要重新绘制.
引用AWT和Swing中的绘画
程序必须假定调用the ()意味着图形剪辑矩形定义的区域“损坏”,必须完全重新绘制
和
虽然AWT试图使呈现组件的过程尽可能高效,但组件的have ()实现本身会对整体性能产生重大影响。影响此过程的两个关键区域是:使用剪辑区域缩小呈现内容的范围。 使用布局的内部知识来缩小子程序绘制的范围(仅限轻量级)。 如果您的组件很简单--例如,如果它是一个按钮--那么就不值得为只绘制与剪辑矩形相交的部分进行渲染,而只绘制整个组件并让图形剪辑适当。但是,如果您已经创建了一个呈现复杂输出的组件,比如文本组件,那么您的代码使用剪辑信息来缩小呈现量是至关重要的。此外,如果您正在编写一个包含多个组件的复杂轻量级容器,其中组件和/或其布局管理器包含有关布局的信息,那么使用布局知识来更聪明地确定必须绘制哪些子组件是值得的。Container.paint()的默认实现只是按顺序查看子程序,并测试可见性和交叉点--对于某些布局来说,这种操作可能不必要地效率低下。例如,如果一个容器将组件放置在一个100x100网格中,那么可以使用该网格信息更快地确定这10,000个组件中哪些与剪辑矩形相交,实际上需要进行绘制。
基本上,这是说,除非你有必要优化绘画过程,这可能是不值得的。
https://stackoverflow.com/questions/25007946
复制相似问题