【问题标题】:How to add objects to an ArrayList?如何将对象添加到 ArrayList?
【发布时间】:2019-02-18 12:00:47
【问题描述】:

我对编程很陌生,我正在尝试构建一个小游戏,这样我就可以自学 OOP,但是我有一个根本无法解决的问题。

我有一个类 ComponentsPanel,我从中调用另一个 (JavaFish) 作为 ArrayList。 addFish() 方法将JavaFish 添加到ArrayList。当我从构造函数调用 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);

            }

        }

组件面板

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

        }

【问题讨论】:

    标签: oop arraylist jframe jpanel


    【解决方案1】:
    ComponentsPanel 中的

    start() 方法不是生命周期方法。因此,除非您手动调用 start() 方法,否则它不会被调用。您可以添加打印语句来跟踪调用。

    【讨论】:

    • 好吧,我不得不说@Geetha 我试图简化这里的代码。但实际上我从另一个类调用了 start() 方法。我刚刚添加了我从中调用方法的类。
    【解决方案2】:

    @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() 方法。此 start() 方法在 panel-1 上调用。

            // 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 不可用。

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      相关资源
      最近更新 更多