我正在尝试移动一个物体,但我希望它留下痕迹
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 中画出你的足迹。
所以基本上不会留下痕迹。我试图删除 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 中画出你的足迹。