2

我的课看起来像这样。

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);
    }
}

这些方法是从另一个类调用的。的价值观xy确实改变了他们应该的方式。然而,方块并没有移动。我在这里做错了吗?

编辑是的,我叫“超级”。我只是在这里复制和编辑代码时不小心删除了它。现在重新编辑它。

4

2 回答 2

4

你需要打电话super.paintComponent(g)而不是paintComponent(g)

public void paintComponent(Graphics g) 

否则你会无限循环。

于 2012-08-27T22:49:35.047 回答
2

调用repaint(x, y, w, h)仅将选择区域设置为脏;Graphics在此边界周围设置一个剪辑,因此您只会看到那里发生的变化。不带任何参数使用repaint()会将整个区域标记为脏 :-)

根据关于 AWT 的 Oracle 文章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();
  }        
}
于 2012-08-27T23:41:39.730 回答