Как создать LinkedList, который добавляет круг через каждые 10 секунд и удаляет первый элемент (круг) через каждые 15 секунд - PullRequest
0 голосов
/ 26 апреля 2019

Я закончил со случайными кругами, теперь моя задача состоит в том, чтобы добавить круги в очередь с прямыми линиями, как настоящая очередь (я хочу, чтобы круги стояли в очереди слева направо, предпочтительно в верхней части фрейма. Когда я вызываю 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 Ответ

1 голос
/ 27 апреля 2019

Решение проблем должно выполняться по одной проблеме за раз. Не пытайтесь писать всю программу до начала тестирования.

Итак, разбейте вашу программу на основы:

  1. Вам необходим таймер для анимации для перемещения каждого объекта. Поэтому начните с добавления одного объекта в ArrayList, а затем, когда сработает таймер, вы перебираете ArrayList и перемещаете каждый объект. Неважно, что в ArrayList есть только один объект для запуска.

  2. Затем вы создаете еще один таймер, который срабатывает каждые 15 секунд, чтобы добавить еще один объект в ArrayList.

  3. Затем вы добавляете логику, чтобы придать этому объекту случайный цвет

  4. Затем вы добавляете логику, чтобы дать этому объекту приоритет.

  5. Как только все вышеперечисленное сделано, вы добавляете еще один таймер для удаления и возражения из ArrayList.

Базовая структура вашего кода должна быть изменена.

  1. Вы НЕ должны использовать статические переменные. Поэтому вам нужно изменить структуру ваших классов.
  2. У вас должен быть класс CirclePanel. Этот класс будет содержать свойства, необходимые для рисования объектов, поэтому он будет содержать ArrayList. Ему также понадобятся такие методы, как «addCircle ()» и «removeCircle ()». Эти методы будут вызываться соответствующим таймером.
  3. Вам нужно использовать таймер качания для всех таймеров, а не утилитарный таймер. Когда срабатывает таймер Swing, код будет выполняться однопоточным в потоке диспетчеризации событий, что должно предотвратить возникновение исключения ConcurrentModificationException.

Проверьте: Как нарисовать несколько объектов, которые движутся с разными скоростями в Java? для примера, чтобы помочь с реструктуризацией.

Он не делает все, что вам нужно, но это хорошее начало. Он будет анимировать ArrayList объекта. Таким образом, вам нужно будет изменить код для заполнения ArrayList по одному объекту за раз и удаления одного объекта за раз.

Edit:

Если вы хотите добавить больше кругов, вам нужен еще один таймер. Используя исходный код, который я вам предоставляю, вы можете сделать что-то вроде:

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();
}

Итак, первый таймер оживляет шары, уже находящиеся в ArrayList. Второй таймер добавляет новый шар в ArrayList.

Я позволю вам написать таймер для удаления шара из ArrayList. Я уже предположил, что это единственный оператор в ActionListener.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...