【问题标题】:Can't make repaint() work无法使 repaint() 工作
【发布时间】:2012-08-27 22:47:26
【问题描述】:

我的班级是这样的。

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

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

【问题讨论】:

  • 您在正确的网站上。那是肯定的。
  • 尝试只打电话给repaint() :-)
  • 也许你应该使用Canvas,无论如何。

标签: java swing graphics repaint paintcomponent


【解决方案1】:

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

public void paintComponent(Graphics g) 

否则你会无限循环。

【讨论】:

  • @user949300 他很可能在调用paintComponent()的线程上遇到堆栈溢出。
  • 是的,我打电话给超级。刚刚在这里复制编辑代码的时候不小心把它删了。
  • 只需调用 moveSquare,这对我来说就完美了。您要更改 X 还是 Y?
  • @Reimeus,参数一次改一个。
【解决方案2】:

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

根据 AWT 上的一篇 Oracle 文章 paint(找到 here),

当 AWT 调用此方法时,Graphics 对象参数会预先配置适当的状态以在此特定组件上绘图:

  • Graphics 对象的 color 设置为组件的 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();
  }        
}

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    相关资源
    最近更新 更多