我的类看起来像这样。
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的值确实会按其应有的方式进行更改。但是,正方形不会移动。我是不是做错了什么?
编辑是的,我在叫“超级”。我只是在这里复制和编辑代码时不小心把它删除了。现在把它重新编辑回来。
发布于 2012-08-28 06:49:35
您需要调用super.paintComponent(g)而不是paintComponent(g)
在……里面
public void paintComponent(Graphics g) 否则你会无限期地循环。
发布于 2012-08-28 07:41:40
调用repaint(x, y, w, h)只会将选择区域设置为脏区域;调用Graphics会在此边界周围设置一个剪辑,因此您只会看到在那里发生的更改。使用不带任何参数的repaint()会将整个区域标记为脏:-)
根据Oracle在AWT paint (找到here)上的一篇文章,
当AWT调用此方法时,
Graphics对象参数已预先配置了用于在此特定组件上绘制的适当状态:
图形对象的颜色设置为组件的颜色property.
foreground对象的左上角的裁剪矩形设置为需要重新绘制的组件区域。要测试这一点,请尝试打印g.getClip :-)
我给你个提示。
java.awt.Rectanglex=0,主板,y=0,主板,width=10,主板,height=10 java.awt.Rectanglex=0,主板,y=0,主板,width=10,主板,height=10 java.awt.Rectanglex=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();
}
}https://stackoverflow.com/questions/12150637
复制相似问题