无法使重绘()工作



我的类看起来是这样的。

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的值确实改变了它们应该改变的方式。然而,广场并没有移动。我做错什么了吗?

编辑:是的,我叫"超级"。我只是在复制和编辑这里的代码时不小心删除了它。现在将其编辑回.

您需要调用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();
  }        
}

相关内容

  • 没有找到相关文章

最新更新