无法使repaint()工作

时间:2012-08-27 22:47:26

标签: java swing graphics repaint paintcomponent

我的班级看起来像这样。

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的值确实会改变它们应该的方式。然而广场不动。我在这里做错了吗?

编辑是的,我打电话给#34;超级"。我在这里复制和编辑代码时偶然删除了它。现在重新编辑它。

2 个答案:

答案 0 :(得分:4)

您需要致电super.paintComponent(g)而不是paintComponent(g)

in

public void paintComponent(Graphics g) 

否则你将无限循环。

答案 1 :(得分:2)

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

根据Oracle关于AWT的文章paint(找到here),

  

当AWT调用此方法时,Graphics对象参数已预先配置了适合绘制此特定组件的状态:

     
      
  • 图形对象的颜色设置为组件的foreground属性。
  •   
  • Graphics对象的 font 设置为组件的font属性。
  •   
  • 设置Graphics对象的 translation ,使坐标(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();
  }        
}