如何创建一个LinkedList,每10秒添加一个圆圈,并每15秒删除一个第一个元素(圆圈)

时间:2019-04-26 10:01:18

标签: java swing canvas

我已经完成了将圆随机化的工作,现在我的挑战是将圆添加到像实际队列一样的直线队列中(我希望圆最好在框架的顶部从左到右排队。当我调用removeCircle时(),我希望圈子离开队列并向下移动框架。您能帮我使用addCircle()和removeCircle()方法吗?谢谢您。

public class AirTrafficLanding
{
private static void createAndShowUI()
{
    PlanePanel panel = new PlanePanel(1);

    JFrame frame = new JFrame("Air traffic Landing System");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.add( panel );
    frame.pack();
    frame.setVisible( true );

    panel.startAnimation();
}

public static void main(String[] args)
{
    EventQueue.invokeLater(new Runnable()
    {
        public void run()
        {
            createAndShowUI();
        }
    });

}

static class PlanePanel extends JPanel implements ActionListener
{
    private ArrayList<Plane> planes = new ArrayList<Plane>();

    public PlanePanel(int planeCount)
    {
        Dimension screenSize =  Toolkit.getDefaultToolkit().getScreenSize();

        setLayout( null );
        setBackground( Color.BLACK );

        Random random = new Random();

        for (int i = 0; i < planeCount; i++)
        {
            Plane plane = new Plane();
            plane.setRandomColor(true);
            plane.setLocation(0, 700);
            //plane.setLocation(random.nextInt(screenSize.width), random.nextInt(screenSize.height));
            plane.setMoveRate(32, 32, 1, 1, true);
            plane.setSize(32, 32);
            planes.add( plane );
        }
    }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        for (Plane plane: planes)
        {
            plane.draw(g);
        }
    }

    public void startAnimation()
    {
        Timer timer = new Timer(55, this);
        timer.start();
    }

    public void actionPerformed(ActionEvent e)
    {
        move();
        repaint();
    }

    private void move()
    {
        for (Plane plane : planes)
        {
            plane.move(this);
        }
    }
}

static class Plane
{
    public Color color = Color.BLACK;

    public int x = 0;
    public int y = 0;
    public int width  = 1;
    public int height = 1;

    private int moveX = 1;
    private int moveY = 1;
    private int directionX = 1;
    private int directionY = 1;
    private int xScale = moveX;
    private int yScale = moveY;

    private boolean randomMove = false;
    private boolean randomColor = false;
    private Random myRand = null;

    public Plane()
    {
        myRand = new Random();
        setRandomColor(randomColor);
    }

    public void move(JPanel parent)
    {
        int iRight = parent.getSize().width;
        int iBottom = parent.getSize().height;

        x += 5 + (xScale * directionX);
        y += 5 + (yScale * directionY);

        if (x <= 0)
        {
            x = 0;
            directionX *= (-1);
            xScale = randomMove ? myRand.nextInt(moveX) : moveX;
            if (randomColor) setRandomColor(randomColor);
        }

        if (x >= iRight - width)
        {
            x = iRight - width;
            directionX *= (-1);
            xScale = randomMove ? myRand.nextInt(moveX) : moveX;
            if (randomColor) setRandomColor(randomColor);
        }

        if (y <= 0)
        {
            y = 0;
            directionY *= (-1);
            yScale = randomMove ? myRand.nextInt(moveY) : moveY;
            if (randomColor) setRandomColor(randomColor);
        }

        if (y >= iBottom - height)
        {
            y = iBottom - height;
            directionY *= (-1);
            yScale = randomMove ? myRand.nextInt(moveY) : moveY;
            if (randomColor) setRandomColor(randomColor);
        }
    }

    public void draw(Graphics g)
    {
        g.setColor(color);
        g.fillOval(x, y, width, height);
    }

    public void setColor(Color c)
    {
        color = c;
    }

    public void setLocation(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public void setMoveRate(int xMove, int yMove, int xDir, int yDir, boolean randMove)
    {
        this.moveX = xMove;
        this.moveY = yMove;
        directionX  = xDir;
        directionY  = yDir;
        randomMove  = randMove;
    }

    public void setRandomColor(boolean randomColor)
    {
        this.randomColor = randomColor;

        switch (myRand.nextInt(3))
        {
            case 0:  color = Color.ORANGE;
                     break;
            case 1:  color = Color.GREEN;
                     break;
            case 2:  color = Color.RED;
                     break;
            default: color = Color.BLACK;
                     break;
        }
    }

    public void setSize(int width, int height)
    {
        this.width  = width;
        this.height = height;
    }
}

}

我希望从队列中的零个圆圈开始,并以10秒的间隔添加一个圆圈。我希望每15秒将一个圆圈从队列移到队列底部。我已经完成了将圆随机化的工作,现在我的挑战是将圆添加到像实际队列一样的直线队列中(我希望圆最好在帧的顶部从左到右排队。当我调用removeCircle()时,我希望圆离开队列并向下移动框架。您能通过addCircle()和removeCircle()方法来帮助我吗?

1 个答案:

答案 0 :(得分:1)

解决问题应该一次完成一个问题。在开始测试之前,请勿尝试编写整个程序。

因此,请分解程序的基本知识:

  1. 您需要一个Timer来使动画移动每个对象。因此,首先向ArrayList添加一个对象,然后在Timer触发时,您遍历ArrayList并移动每个对象。没关系,在ArrayList中只有一个对象可以开始。

  2. 然后创建另一个Timer,每15秒触发一次,以将另一个对象添加到ArrayList。

  3. 然后您添加逻辑以使该对象具有随机颜色

  4. 然后添加逻辑以赋予该对象优先级。

  5. 完成上述所有操作后,您将添加另一个Timer并将其从ArrayList中移除。

代码的基本结构需要更改。

  1. 您不应使用静态变量。因此,您需要重新设计类的结构。
  2. 您应该有一个CirclePanel类。此类将包含绘制对象所需的属性,因此它将包含ArrayList。它还需要“ addCircle()”和“ removeCircle()”之类的方法。这些方法将由适当的Timer调用。
  3. 您需要为所有计时器使用Swing计时器,而不是util计时器。当Swing Timer触发时,代码将在事件调度线程上执行单线程,这应防止ConcurrentModificationException发生。

签出:How do I paint multiple objetcs that move at different speeds in Java?来帮助重组的示例。

它不能满足您的所有需求,但这是一个好的开始。它将为对象的ArrayList设置动画。因此,您将需要修改代码以一次在ArrayList中填充一个对象,并一次移除一个对象。

编辑:

如果您想添加更多圈子,则需要另一个计时器。使用我提供的原始代码,您可以执行以下操作:

public void startAnimation()
{
    //Timer timer = new Timer(75, this);
    //timer.start();

    Timer timer = new Timer(1000, new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            move();
            repaint();
        }
    });
    timer.start();

    Timer timer2 = new Timer(3000, new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            addBalls(1);
        }
    });
    timer2.start();
}

因此,第一个Timer对ArrayList中已经存在的球进行动画处理。第二个Timer向ArrayList添加一个新球。

我将让您编写Timer以便从ArrayList中删除一个球。我已经建议过,这是ActionListener中的一条语句。