我的类看起来是这样的。
import java.awt.*;
import javax.swing.*;
public class Painter extends JPanel {
int x=200;
int y=200;
int newX;
int newY;
Painter(){
setPreferredSize(new Dimension(400,400));
}
public void moveSquare(int newX, int newY){
if(newY != y|| newX != x){
repaint(x,y, 10, 10);
y = newY;
x = newX;
repaint(x,y, 10, 10);
}
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(x, y, 10, 10);
}
}
这些方法是从另一个类调用的。x
和y
的值确实改变了它们应该改变的方式。然而,广场并没有移动。我做错什么了吗?
编辑:是的,我叫"超级"。我只是在复制和编辑这里的代码时不小心删除了它。现在将其编辑回.
您需要调用super.paintComponent(g)
而不是paintComponent(g)
在中
public void paintComponent(Graphics g)
否则,您将无限循环。
调用repaint(x, y, w, h)
只会将一个选择区域设置为dirty;Graphics
围绕这个边界设置一个剪辑,因此您将只看到在那里发生的更改。使用不带任何参数的repaint()
会将整个区域标记为脏:-)
根据Oracle关于AWT paint
的一篇文章(可在此处找到),
当AWT调用此方法时,
Graphics
对象参数被预先配置为在该特定组件上绘制的适当状态:
- Graphics对象的颜色设置为组件的
foreground
属性- Graphics对象的字体设置为组件的
font
属性- Graphics对象的平移设置为使坐标(0,0)表示组件的左上角
- Graphics对象的剪辑矩形设置为需要重新绘制的组件区域
要对此进行测试,请尝试打印g.getClip
:-)
我给你一个提示。。。
java.awt.Rectangle[x=0,y=0,width=10,height=10] java.awt.Rectangle[x=0,y=0,width=10,height=10] java.awt.Rectangle[x=0,y=0,width=10,height=10]
这是一个固定的moveSquare
。。。
public void moveSquare(int newX, int newY){
if (newY != y|| newX != x) {
y = newY;
x = newX;
repaint();
}
}