paintComponent通过对象列表

时间:2014-04-23 02:30:54

标签: java swing paintcomponent

我如何遍历对象列表来绘制他们的draw()方法?如果我已正确设置,我该如何正确实现?

I类希望借鉴:

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。根据我的理解,我应该在draw()中使用GameObject方法。说CarsgameObj的{​​{1}}列表,我将如何绘制它们?我不确定我是否完全理解如何遍历列表以在面板上绘制它。

1 个答案:

答案 0 :(得分:2)

评论中暗示的解决方案是在paintComponent方法中遍历您的Cars列表,并使用JVM为您提供的Graphics对象在那里绘制它们。在该方法中使用for循环,并在循环中调用每个Car的绘图方法。如上所述,Swing Timer永远不应该在绘制方法中启动,也不应该更改任何对象的行为或状态,除了绘制它们之外就是这样。

如,

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

修改
你在评论中提问:

  

你是正确的draw()方法需要x和y,因为我把它放在。

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

  

它还需要长度和宽度吗?

不知道这个问题与这个问题中的问题完全正交。也许你需要为此提出一个不同的问题。

  

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

不确定你在这里问的是什么。