Java I';我试图移动一个物体,但我想让它留下痕迹

Java I';我试图移动一个物体,但我想让它留下痕迹,java,swing,animation,jframe,jlabel,Java,Swing,Animation,Jframe,Jlabel,所以基本上它不会留下痕迹。我尝试删除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) {

所以基本上它不会留下痕迹。我尝试删除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();
        }
    }
}
}
问题/解决办法:

  • Swing绘制在paintComponent方法替代中完成,而不是在paint方法中完成
  • 确保在您自己的覆盖方法中首先调用'super's paintComponent方法,以便JPanel可以进行内部绘制
  • 动画循环应该是Swing计时器,而不是while(true)循环,因为后者可能会违反Swing线程规则
  • 如果要创建动画但在图形中保留持久图像,则
    • 创建表示轨迹的对象(可能是点)的ArrayList,并在paintComponent方法中使用遍历ArrayList的for循环绘制轨迹,或者
    • 使用BuffereImage作为背景图像,该图像在调用
      super.paintComponent(g)
      但在绘制移动sprint之前立即在paintComponent方法中绘制。通过调用BuffereImage上的
      getGraphics()
      ,从BuffereImage中获取图形对象,将轨迹绘制到此BuffereImage中

那么你是在试图追踪球的移动?……喂?