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