【发布时间】:2015-07-16 22:44:57
【问题描述】:
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);
}
}
这是来自 Java 教程的 sn-p。这是一个关于用Java绘画的教程。 https://docs.oracle.com/javase/tutorial/uiswing/painting/step3.html
我不明白 OFFSET 究竟在做什么。
或者 在 repaint() 方法中会发生什么。
我知道,有必要正确绘制正方形,因为我注意到,如果没有偏移量,正方形有时会丢失一个边,该边没有被第一个 repaint() 方法绘制或删除。
我让程序在控制台中写入变量(用于绘制矩形(squareX...等))。但宽度和高度始终为 20 而不是 21(宽度 + 偏移)。即使我读取了 paintComponent() 方法中的变量。
这就是为什么我不明白,为什么正方形第一次正确绘制,但每隔一次它在没有偏移量的情况下重新绘制,然后它就被错误地绘制了。
而且我无法查看 repaint() 方法的内部(至少我不知道该怎么做)
另一个小问题:如果颜色、位置等变量没有改变,repaint 方法是否总是“删除/覆盖”它要绘制的对象(在本例中为正方形)?
这就是paintComponent()方法的作用。
g.setColor(Color.RED);
g.fillRect(squareX,squareY,squareW,squareH);
g.setColor(Color.BLACK);
g.drawRect(squareX,squareY,squareW,squareH);
我不明白的是,为什么第一个 repaint() 方法会删除旧方块。 squareX/Y/W/H 和之前一样。然后他们通过鼠标点击获得新坐标,然后在新位置绘制正方形。
为什么相同的代码在第一个 repaint() 中删除,而在第二个中创建一个新正方形?
对不起,如果我的英语不好。我来自德国。
提前感谢您的所有回答!!!
【问题讨论】:
-
通常,坐标是从零开始的,因此 20 像素宽的正方形将是 0-19 之类的东西。添加额外的像素克服了这种轻微的不稳定。您正在调用的
repaint方法设置了一个剪切矩形,它只更新组件的那部分,它不会改变squareW/H值的大小 -
“另一个小问题:如果颜色、位置等变量没有,repaint 方法是否总是“删除/覆盖”它想要绘制的对象(在本例中为正方形)改变了吗?” - 没有或更多,这取决于
paintComponent方法实际上在做什么。如果要更新的区域没有改变,那么从你的角度来看,它不会改变,但它会被重新粉刷或更新。这就是为什么你需要在重新绘制新位置之前重新绘制旧位置,否则你曾经存在于旧位置的东西将保留下来 -
感谢您的超级快速解答!我将有一个快速更新,因为关于第二个问题,我还有一点不明白。
标签: java swing paint offset repaint