Итак, у меня есть класс 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();
//...
}




Вы нигде не запускали прослушиватель действий. Вы должны добавить строку
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
}
}
Когда я инициализировал свой Timer этим, он эффективно выполнял t.addActionObject (this), и поскольку каждый раз, когда происходит событие Timer, Game выполняет actionPerformed, который выполняет actionPerformed каждого GameObject, и это фактически то же самое, что и выполнение t.addActionObject (things .get (i)).
Мне кажется, что моя настоящая проблема в том, что в мой JFrame добавляется несколько JPanel. Я попытался просто добавить основную панель в свой JFrame и добавить свои панели GameObject на главную панель, но это не сработало.
Так как мой GameObject расширяет JPanel, я не могу использовать на них addActionObject, но могу использовать его на таймере. Итак, я попробовал оба цикла с t.addActionObject (things.get (i)); и t.addActionObject (this) ;. Естественно, это не сработало.