我如何遍历对象列表来绘制他们的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
方法。说Cars
下gameObj
的{{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()方法设置正确吗?
不确定你在这里问的是什么。