如何将对象添加到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?的主要内容,如果未能解决你的问题,请参考以下文章

如何将本地存储中的 JSON 对象添加到 Android Studio 上的片段列表

如何正确地将多个片段添加到片段过渡?

如何在 Java 中将对象添加到 ArrayList

在ArrayList中搜索相同的对象并合并价格值而不是添加

如何在java中将对象添加到ArrayList中

如何将回收器视图添加到片段