如何将对象添加到ArrayList?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将对象添加到ArrayList?相关的知识,希望对你有一定的参考价值。
我是一个非常新的编程,我正在尝试建立一个小游戏,所以我可以自学OOP,但是我有一个问题,我根本无法解决它。
我有一个类ComponentsPanel,我从中调用另一个(JavaFish)作为ArrayList。 addFish()方法向ArrayList添加了一个JavaFish。当我从构造函数调用addFish()方法时工作完全正常。
问题是,当我从start(),从另一个类和包调用它时,它不会向ArrayList添加任何元素。
主要课程
package framework;
public class Core {
JFrame window;
ComponentsPanel panel;
int width = 600;
int height = 400;
public void start() {
window = new JFrame();
window.setTitle("Java Game");
window.setPreferredSize(new Dimension(width, height));
window.setMinimumSize(new Dimension(width, height));
window.setMaximumSize(new Dimension(width, height));
window.setResizable(false);
panel = new ComponentsPanel();
window.add(panel, BorderLayout.CENTER);
window.setVisible(true);
window.pack();
}
public void stop() {
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
ComponentsPanel
package framework;
public class ComponentsPanel extends JPanel {
ArrayList<JavaFish> javaFishes = new ArrayList<JavaFish>();
public ComponentsPanel() {
javaFishes = new ArrayList<JavaFish>();
//addFish(new JavaFish(100, 100, 25, 25));
}
public void addFish(JavaFish javaFish) {
javaFishes.add(javaFish);
repaint();
}
public void start() {
addFish(new JavaFish(100, 100, 25, 25));
}
@Override
public void paint(Graphics g) {
for (JavaFish jFish : javaFishes) {
jFish.draw(g);
}
}
}
鱼类
package framework;
public class JavaFish {
BufferedImage img;
private int x_pos;
private int y_pos;
private int sizeX;
private int sizeY;
public JavaFish(int x_pos, int y_pos, int sizeX, int sizeY) {
this.x_pos = x_pos;
this.y_pos = y_pos;
this.sizeX = sizeX;
this.sizeY = sizeY;
}
public void draw(Graphics g) {
BufferedImage JavaFish = LoadImage("img/JavaFish.png");
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(JavaFish, x_pos, y_pos, sizeX, sizeY, null);
}
BufferedImage LoadImage(String FileName) {
img = null;
try {
img = ImageIO.read(new File (FileName));
} catch (IOException e) {
e.printStackTrace();
}
return img;
}
}
模拟课
package user;
import framework.ComponentsPanel;
import framework.Core;
public class Simulation {
Core c;
ComponentsPanel panel;
boolean endSim = false;
public Simulation() {
c = new Core();
panel = new ComponentsPanel();
}
private void populate() {
panel.start()
}
private void updateWorld() {
while (!endSim) {
c.start();
break;
}
c.stop();
}
public static void main(String[] args) {
Simulation simulation = new Simulation();
simulation.populate();
simulation.updateWorld();
}
}
ComponentsPanel中存在的start()方法不是生命周期方法。因此,除非您手动调用start()方法,否则不会调用它。您可以添加用于跟踪呼叫的打印语句。
@Cristea感谢您提供更新的代码。
如果您在Core类的start()方法中创建的ComponentsPanel实例上调用addFish()方法,则此方法将起作用,如下所示。
public void start() {
window = new JFrame();
window.setTitle("Java Game");
window.setPreferredSize(new Dimension(width, height));
window.setMinimumSize(new Dimension(width, height));
window.setMaximumSize(new Dimension(width, height));
window.setResizable(false);
panel = new ComponentsPanel(); // This panel is passed to the JFrame
panel.addFish(new JavaFish(100, 100, 25, 25)); // so do addFish() here.
window.add(panel, BorderLayout.CENTER);
window.setVisible(true);
window.pack();
}
您的代码的问题是,您正在创建两个ComponentsPanel类的实例。在您创建的第一个实例(我们称之为panel-1)上,您通过以下方法调用addFish()方法。在panel-1上调用此start()方法。
// panel you used to call this start() method was not used in JFrame
public void start() {
addFish(new JavaFish(100, 100, 25, 25));
}
然后,您将从Core类的start()方法创建ComponentsPanel类的第二个实例(让我们称之为panel-2),而panel-2不执行addFish()。但是这个实例(panel-2)是添加到JFrame的实例,它将用于paint()。由于panel-2不执行addFish(),因此paint()找不到任何JavaFishes。
请记住,实例变量javaFishes特定于ComponentsPanel的每个实例。由panel-1添加的javaFishes不适用于panel-2。
以上是关于如何将对象添加到ArrayList?的主要内容,如果未能解决你的问题,请参考以下文章