从图像中可以看到,我需要删除旧行,但是我不确定如何删除。坚持了几天。我很确定问题是我错了直线和圆(分别使用setLine和setFrame),因为我将汽车替换为矩形并使用了translate(),并且工作正常。下面是一些复制此代码的最小代码。非常感谢您的帮助。 (第1部分是组件,第2部分是汽车类,并且主程序仅设置Jframe和第1部分组件)。
import java.awt.*;
import javax.swing.JComponent;
import java.util.*;
import javax.swing.JFrame;
import java.awt.event.*;
import javax.swing.Timer;
public class VehicleComponent extends JComponent
{
//Car class which is an arraylist of line segments and a couple circles
Car car;
// The constructor initializes the car to the location 300, 300 on a Jframe
public VehicleComponent()
{
car = new Car(300, 300);
drive();
}
//to be painted on a jframe
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
car.draw(g2);
}
//this function will be called in timer triggered actionListener. will move the car forward by certain pixels per given seconds
public void drive()
{
car.move();
repaint();
}
}
public class Car extends Vehicle
{
ArrayList<Line2D.Double> detailLines;
ArrayList<Ellipse2D.Double> tires;
private int height;
private int length;
private int velocity;
public Car(int xStartingPosition, int yStartingPosition)
{
super(xStartingPosition, yStartingPosition);
detailLines = new ArrayList<Line2D.Double>();
tires = new ArrayList<Ellipse2D.Double>();
setVelocity();
height = 5;
length = 14;
}
/** draws the car */
public void draw(Graphics2D g2){
BasicStroke tireStroke = new BasicStroke(3);
BasicStroke vehicleStroke = new BasicStroke(2);
initializeLines();
initializeTires();
g2.setStroke(vehicleStroke);
for (Line2D.Double e : detailLines){
g2.draw(e);
}
g2.setStroke(tireStroke);
for (Ellipse2D.Double e: tires){
g2.draw(e);
}
}
private void initializeLines()
{
detailLines.add(new Line2D.Double((getX()-10), (getY()+10), (getX()+50), (getY()+10)));//hood
detailLines.add(new Line2D.Double((getX() + 60), getY(), (getX()+50), (getY()+10)));//hoodtwo
detailLines.add(new Line2D.Double((getX()+50), (getY()+10), (getX()+70), (getY()+30)));//Passengerwindshield
detailLines.add(new Line2D.Double((getX()+70), (getY()+30), (getX() + 80), (getY() + 20)));//hood three
detailLines.add(new Line2D.Double((getX() + 70), (getY() + 30), (getX()+100), (getY()+30)));//front
detailLines.add(new Line2D.Double((getX()+100), (getY()+30), (getX()+100), (getY()+40)));//front two
detailLines.add(new Line2D.Double((getX()+100), (getY()+30), (getX() + 110), (getY() + 20)));//sideLine horizontal
detailLines.add(new Line2D.Double((getX() + 60), (getY()+20), (getX()-20), (getY() + 20)));//windowsperator
detailLines.add(new Line2D.Double((getX()+30), (getY()+10), (getX() +30), (getY() +20)));//striketrhough
detailLines.add(new Line2D.Double((getX()), (getY()), (getX() +60), (getY())));//roof
detailLines.add(new Line2D.Double((getX()+60), (getY()), (getX() +80), (getY() +20)));//border top
detailLines.add(new Line2D.Double((getX()+80), (getY()+20), (getX() +110), (getY() +20)));//border 3
detailLines.add(new Line2D.Double((getX()+110), (getY()+20), (getX() +110), (getY() +30)));//border4
detailLines.add(new Line2D.Double((getX()+110), (getY()+30), (getX() +100), (getY() +40)));//border5
detailLines.add(new Line2D.Double((getX()+100), (getY()+40), (getX() - 30), (getY() +40)));//border6
detailLines.add(new Line2D.Double((getX()-30), (getY()+40), (getX() - 30), (getY() +30)));//border7
detailLines.add(new Line2D.Double((getX()-30), (getY()+30), (getX()), (getY())));//border8
}
private void initializeTires()
{
tires.add(new Ellipse2D.Double((getX()-10), getY()+30, 20, 20));
tires.add(new Ellipse2D.Double((getX()+65), getY()+30, 20, 20));
}
public void move()
{
for(Line2D.Double e : detailLines){
e.setLine((e.getX1()+velocity), (e.getY1()), (e.getX2()+velocity), (e.getY2()));
}
for(Ellipse2D.Double e : tires)
{
e.setFrame((e.getX()+velocity), (e.getY()), e.getWidth(), e.getHeight());
}
}
最佳答案
原因是每次绘制时都需要通过调用clearRect
来清除图形表面:
g2.clearRect(0, 0, getWidth(), getHeight() );
尽管
Line2D
对象在两次draw
调用之间保持不变,但它们实际上并没有从缓冲区中拉出自己-它们会在下次要绘制它们时简单地记住它们的状态。关于java - 尝试在Jframe(形成汽车)上对线/圆的ArrayList进行动画处理,但是我似乎无法消除绘制的旧线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13143564/