Java I';我试图移动一个物体,但我想让它留下痕迹
所以基本上它不会留下痕迹。我尝试删除super.paint并尝试创建多个,但它要么创建错误,要么不创建错误。我至少看了10遍,这就是我来这里的原因。提前谢谢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) {
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作为背景图像,该图像在调用
但在绘制移动sprint之前立即在paintComponent方法中绘制。通过调用BuffereImage上的super.paintComponent(g)
,从BuffereImage中获取图形对象,将轨迹绘制到此BuffereImage中getGraphics()