Java 通过对象列表绘制组件

Java 通过对象列表绘制组件,java,swing,paintcomponent,Java,Swing,Paintcomponent,如何遍历对象列表来绘制它们的draw()方法?如果设置正确,如何正确实施 我想利用的类: public class Window extends JPanel implements IObserver, ActionListener{ private Timer timer = new Timer(5, this); public Window(){ super.setBorder(BorderFactory.createTitledBorder("Window:

如何遍历对象列表来绘制它们的
draw()
方法?如果设置正确,如何正确实施

我想利用的类:

public class Window extends JPanel implements IObserver, ActionListener{
    private Timer timer = new Timer(5, this);
    public Window(){
        super.setBorder(BorderFactory.createTitledBorder("Window:"));
        timer.start();
    }
    public void update(IObservable o, Object arg){
        GameWorldProxy gwp = (GameWorldProxy) o;
        Iterator gameObjects = gwp.getCollection().getIterator();
        while(gameObjects.hasNext()){
            GameObject gameObj = (GameObject) gameObjects.getNext();
            System.out.println(gameObj);
        }
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
    }
    public void actionPerformed(ActionEvent e){
        repaint();
    }
}
车辆等级:

public class Car extends MoveableObject implements ISteerable, IDrawable{
    public void draw(Graphics g, int x, int y) {
        g.setColor(Color.RED);
        g.fillRect(x, y, 25, 10);
    }

}

例如,除了
Car
类之外,我还有一些不同的类。它有一个
draw()
方法,而
GameObject
类是从
Car
扩展而来的。据我所知,我在
GameObject
中也应该有一个
draw()
方法。假设在
gameObj
下有两个
汽车的列表,我如何绘制它们?我不太清楚如何迭代列表以在面板上绘制它。

注释中提到的解决方案是在paintComponent方法中迭代汽车列表,并使用JVM提供给您的图形对象将它们绘制到那里。在该方法中使用for循环,并在循环中调用每辆车的绘图方法。如前所述,在绘制方法中不应启动摆动计时器,也不应更改对象的任何行为或状态,除非绘制它们,仅此而已

e、 g


编辑
你在评论中问:

你是对的,draw()方法需要x和y,因为我刚刚把它放进去了

我不会在绘图方法中包含x和y。我将有一个单独的setter方法来移动组成对象,并将draw方法用于draw和draw

它是否也需要长度和宽度

不知道,因为这个问题似乎与这个问题中的问题完全正交。也许你需要问一个不同的问题

另一个问题是,for循环应该迭代并绘制每个类,它应该如何显示正确?只要类下的draw()方法设置正确


不确定您在问什么。

不要调用
计时器。在
paintComponent
方法中启动
。\n请遵守上面@MadProgrammer的说明。
paintComponent
方法仅用于绘制和绘制。您无法完全或部分控制何时或是否调用它。所有程序逻辑都属于其他地方。解决方法是用这种方法绘制图形。句号。注意并固定,我将其放入
窗口()
方法中。这应该是正确的,对吗?我想你已经为我澄清了很多,你是正确的
draw()
方法需要x和y,因为我刚刚把它放进去了。它是否也需要长度和宽度?另一个问题是,for循环应该迭代并绘制每个类,它应该如何显示正确?只要类下的
draw()
方法设置正确?谢谢,对于第三个问题,我想知道当有许多类使用不同形状的
draw()
方法时,遍历列表不会给它带来任何问题,正确绘制不同的形状?我确信答案是肯定的,但我只是想确认我理解它。
// don't like class name of Window as this name shadows an important
// core Java Swing class.
public class Window extends JPanel implements IObserver, ActionListener{
    private Timer timer = new Timer(5, this);
    private GameWorldProxy gwp;

    public Window(){
        super.setBorder(BorderFactory.createTitledBorder("Window:"));
        timer.start();
    }
    public void update(IObservable o, Object arg){
        gwp = (GameWorldProxy) o;
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        for (GameObject gameObject : gwp.getCollection()) {
          gameObject.draw(g); // may need x and y here, but not sure where this data is held
        }        
    }
    public void actionPerformed(ActionEvent e){
      // some method to move components here
      repaint();
    }
}