Как добавить объекты в ArrayList? - PullRequest
0 голосов
/ 13 сентября 2018

Я очень новичок в программировании, и я пытаюсь создать небольшую игру, чтобы я мог учить себя ООП, однако у меня есть проблема, которую я вообще не могу решить.

У меня есть класс 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();
            }

        }

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

@ Cristea Спасибо за обновленный код.

Это будет работать, если вы вызовете метод addFish () для экземпляра ComponentsPanel, созданного в методе start () базового класса, как показано ниже.

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

Затем вы создаете 2-й экземпляр класса ComponentsPanel (назовем его panel-2) из ​​метода start () базового класса и panel-2.не делает addFish ().Но этот экземпляр (панель-2) - это то, что добавлено в JFrame, который будет использоваться с целью paint ().Так как панель-2 не выполняет addFish (), paint () не находит никаких JavaFishes.

Помните, переменная экземпляра javaFishes специфична для каждого экземпляра ComponentsPanel .javaFishes, добавленные Panel-1, не будут доступны для Panel-2.

0 голосов
/ 13 сентября 2018

метод start (), представленный в ComponentsPanel, не является методом жизненного цикла.Поэтому, если вы не вызовете метод start () вручную, он не будет вызван.Вы можете добавить выписку для отслеживания звонков.

...