Попытка нарисовать несколько объектов на Java

Итак, у меня есть класс Game, который содержит ArrayList объектов, которые я хотел бы раскрасить, и таймер. Все они реализуют ActionListener. У меня есть actionPerformed в игровом цикле через ArrayList и вызвать actionPerformed для каждого элемента. Затем метод actionPerformed каждого объекта вызывает repaint. Однако это только кажется, что рисует последний объект в ArrayList.

Я помещаю несколько тестовых отпечатков в метод actionPerformed каждого объекта, и программа действительно переходит к строке перерисовки для всех объектов.

Это выглядит примерно так:

public class Game extends JFrame implements ActionListener
{
    public ArrayList<GameObject> things = new ArrayList<GameObject>();
    public Timer t = new Timer(5, this);
    public Game ()
    {
        super();
        this.setSize(620, 440);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        this.setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);

        this.setTitle("Moving Ball");
        GameObject b = new Ball(this);
        GameObject p = new Paddle(this);
        things.add(b);
        things.add(p);


        for (int i = 0; i < things.size(); i++)
        {
            this.add(things.get(i));
        }

        t.start();
        this.setVisible(true);
    }

    public void actionPerformed (ActionEvent e)
    {
        for (int i = 0; i < things.size(); i++)
        {
            things.get(i).actionPerformed(e);
        }
    }
}

А игровые объекты перезаписали paintComponent и содержат:

public void actionPerformed (ActionEvent e)
{
    //...
    repaint();
    //...
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
30
1

Ответы 1

Вы нигде не запускали прослушиватель действий. Вы должны добавить строку

things.get(i).addActionListener(this);

в нужном месте. Выглядит так:

public class Game extends JFrame implements ActionListener
{
    public ArrayList<GameObject> things = new ArrayList<GameObject>();
    public Timer t = new Timer(5, this);
    public Game ()
    {
        super();
        this.setSize(620, 440);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        this.setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);

        this.setTitle("Moving Ball");
        GameObject b = new Ball(this);
        GameObject p = new Paddle(this);
        things.add(b);
        things.add(p);


        for (int i = 0; i < things.size(); i++)
        {
            this.add(things.get(i));
        }
        for (int i = 0; i < things.size(); i++)
        {
            things.get(i).addActionListener(this);
        }

        t.start();
        this.setVisible(true);
    }

    public void actionPerformed (ActionEvent e)
    {
        //repaint your gameobject
    }
}

Так как мой GameObject расширяет JPanel, я не могу использовать на них addActionObject, но могу использовать его на таймере. Итак, я попробовал оба цикла с t.addActionObject (things.get (i)); и t.addActionObject (this) ;. Естественно, это не сработало.

Cobalt _000 31.03.2018 07:57

Когда я инициализировал свой Timer этим, он эффективно выполнял t.addActionObject (this), и поскольку каждый раз, когда происходит событие Timer, Game выполняет actionPerformed, который выполняет actionPerformed каждого GameObject, и это фактически то же самое, что и выполнение t.addActionObject (things .get (i)).

Cobalt _000 31.03.2018 08:15

Мне кажется, что моя настоящая проблема в том, что в мой JFrame добавляется несколько JPanel. Я попытался просто добавить основную панель в свой JFrame и добавить свои панели GameObject на главную панель, но это не сработало.

Cobalt _000 31.03.2018 09:02

Другие вопросы по теме