我正在尝试移动一个物体,但我希望它留下痕迹

I'm trying to move an object but i want it to leave a trail

所以基本上不会留下痕迹。我试图删除 super.paint 并且我尝试制作多个,但它要么会产生错误,要么不会。我至少经历了 10 次,这就是我来这里的原因。提前致谢!

import javax.swing.*;
import java.awt.*;

public class Grafik extends JPanel {
private int x = 0;

private void moveBall()
{
    x += 1;
}

public void paint(Graphics g)
{
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.fillRect(x, 50, 20, 80);
}

public static void main(String[] args)
{
    JFrame frame = new JFrame();
    Grafik grafik = new Grafik();

    frame.setSize(700, 800);
    frame.setLocation(300, 200);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(grafik);
    frame.setTitle("Mitt spel");
    frame.setResizable(false);
    frame.setVisible(true);

    while(true)
    {
        grafik.repaint();
        grafik.moveBall();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}

Problems/Solutions:

  • Swing 绘制是在 paintComponent 方法重写中完成的,而不是在 paint 方法中完成的。
  • 一定要在你自己的覆盖方法中首先调用 `super 的 paintComponent 方法,这样 JPanel 就可以进行内务绘画
  • 你的动画循环应该是一个 Swing 定时器,而不是 while (true) 循环,因为后者有 运行 违反 Swing 线程规则的风险
  • 如果您想创建动画但在绘图中留下永久图像,那么
    • 要么创建一个对象 ArrayList,可能是代表轨迹的点,然后在您的 paintComponent 方法中使用遍历 ArrayList 的 for 循环绘制轨迹,或者
    • 使用 BufferedImage 作为背景图像,在调用 super.paintComponent(g) 之后但在绘制移动冲刺之前立即在 paintComponent 方法中绘制。通过在 BufferedImage 上调用 getGraphics(),从中获取一个 Graphics 对象,在 BufferedImage 中画出你的足迹。