Я пытаюсь расширить программу Java, данную нам в Uni, и не могу заставить программу использовать методы в новом классе - PullRequest
0 голосов
/ 29 апреля 2020

Итак, во-первых, я довольно любитель Java программист, и это всего лишь один модуль, а потом все кончено.

Критерием является переопределение предопределенной команды about () в нашей программе TurtleGraphics.

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

Это расширенный класс и содержимое

public class ExtendedTurtleGraphics extends TurtleGraphics {
TurtleGraphics TG = new TurtleGraphics();
theTurtle turtle = new theTurtle();
String Command;
@Override
public void about() {
    super.about();
    System.out.print("Testing..."); //Working!
    Command = "backward 100";
    turtle.getCommand(Command, this);
    Command = "penDown";
    turtle.getCommand(Command, this);
    Command = "forward 200";
    turtle.getCommand(Command, this);
    Command = "turnright 120";
    turtle.getCommand(Command, this);
    Command = "forward 50";
    turtle.getCommand(Command, this);
}

/*@Override
public void circle(int radius) {
    super.circle(radius);

    }*/
}

Это целое GUI класс, следующий раздел о

public class myGUI extends JPanel{

    static JTextField commandbox;
    boolean isSaved = false;
    TurtleGraphics TG = new TurtleGraphics();
    theTurtle turtle = new theTurtle();
    TurtleGraphics ETG = new ExtendedTurtleGraphics();
    public myGUI()
    {
        JFrame MFrame = new JFrame();
        setLayout(new BorderLayout());
        setBackground(Color.white);
        commandbox = new JTextField(5);
        MenuBr mb = new MenuBr();
        MFrame.setJMenuBar(mb);
        MFrame.add(commandbox, BorderLayout.SOUTH);
        commandbox.addActionListener(new MyActionListener());
        MFrame.add(TG);
        MFrame.setSize(640, 480);
        MFrame.setVisible(true);
        MFrame.validate();
        MFrame.repaint();
        ExtendedTurtleGraphics ETG;

    }
    public static void infoBox(String infoMessage, String titleBar)
    {
        JOptionPane.showMessageDialog(null, infoMessage, titleBar, JOptionPane.INFORMATION_MESSAGE);
    }
    class MenuBr extends JMenuBar implements ActionListener {
        JMenu fileMnu = new JMenu("File");
        JMenuItem newMnuI = new JMenuItem("New");
        JMenuItem openMnuI = new JMenuItem("Load");
        JMenuItem saveMnuI = new JMenuItem("Save");
        JMenuItem closeMnuI = new JMenuItem("Exit");
        JMenu helpMnu = new JMenu("Help");
        JMenuItem aboutMnuI = new JMenuItem("About");


        MenuBr() {
            add(fileMnu);
            fileMnu.add(newMnuI);
            fileMnu.add(openMnuI);
            fileMnu.add(saveMnuI);
            fileMnu.add(closeMnuI);
            newMnuI.addActionListener(this);
            openMnuI.addActionListener(this);
            saveMnuI.addActionListener(this);
            closeMnuI.addActionListener(this);
            add(helpMnu);
            helpMnu.add(aboutMnuI);
            aboutMnuI.addActionListener(this);
        }

        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == newMnuI) {
                TG.reset();
                TG.turnLeft(90);
                TG.clear();
                TG.penDown();
            }
            if (e.getSource() == openMnuI) {
                if (isSaved == true) {
                    String loadName = JOptionPane.showInputDialog("Enter Load File Path (Excluding .png) :");
                    loadName = loadName + ".png";
                    try {
                        BufferedImage loadedImage = ImageIO.read(new File(loadName));
                        TG.setBufferedImage(loadedImage);
                    } catch (IOException exception) {
                        System.out.println(exception.getMessage());
                    }
                } else if (isSaved == false) {
                    int n = JOptionPane.showConfirmDialog(null, "Save before loading?", "Are you sure?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
                    System.out.println(n);
                    if (n == 0) {
                        Graphics g = TG.getGraphicsConext();
                        BufferedImage i = TG.getBufferedImage();
                        String fileName = JOptionPane.showInputDialog("Enter Save File Path (Excluding .png): ");
                        fileName = fileName + ".png";
                        File file = new File(fileName);
                        try {
                            ImageIO.write(i, "png", file);
                        } catch (IOException el) {
                            el.printStackTrace();
                        }
                        String loadName = JOptionPane.showInputDialog("Enter Load File Path (Excluding .png) :");
                        loadName = loadName + ".png";
                        try {
                            BufferedImage loadedImage = ImageIO.read(new File(loadName));
                            TG.setBufferedImage(loadedImage);
                        } catch (IOException exception) {
                            System.out.println(exception.getMessage());
                        }
                    } else if (n == 1) {
                        String loadName = JOptionPane.showInputDialog("Enter Load File Path (Excluding .png) :");
                        loadName = loadName + ".png";
                        try {
                            BufferedImage loadedImage = ImageIO.read(new File(loadName));
                            TG.setBufferedImage(loadedImage);
                        } catch (IOException exception) {
                            System.out.println(exception.getMessage());
                        }
                    }
                }
            }
            if (e.getSource() == saveMnuI) {
                isSaved = true;
                Graphics g = TG.getGraphicsConext();
                BufferedImage i = TG.getBufferedImage();
                String fileName = JOptionPane.showInputDialog("Enter File Path (Excluding .png): ");
                fileName = fileName + ".png";
                File file = new File (fileName);
                try{
                    ImageIO.write(i, "png", file);
                } catch (IOException el) {
                    el.printStackTrace();
                }
            }
            if (e.getSource() == closeMnuI) {
                if (isSaved == true)
                {
                    System.exit(0);
                }
                else
                {
                    int n = JOptionPane.showConfirmDialog(null, "Save before quitting?", "Are you sure?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
                    System.out.println(n);
                    if (n == 0)
                    {
                        Graphics g = TG.getGraphicsConext();
                        BufferedImage i = TG.getBufferedImage();
                        String fileName = JOptionPane.showInputDialog("Enter File Path (Excluding .png): ");
                        fileName = fileName + ".png";
                        File file = new File (fileName);
                        try{
                            ImageIO.write(i, "png", file);
                        } catch (IOException el) {
                            el.printStackTrace();
                        }
                        System.exit(0);
                    }
                    else if (n == 1)
                    {
                        System.exit(0);
                    }
                }
            }

Это раздел о

        if (e.getSource() == aboutMnuI) {
            ETG.clear();
            ETG.about();
            ImageIcon icon = new ImageIcon("FilePath");
            JOptionPane.showMessageDialog(null, "Turtle Graphics\nJoe Bloggs\n4FS1\nOOP Assessment 2020", "About", JOptionPane.INFORMATION_MESSAGE, icon);
            }
        }
    }
    class MyActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            if (e.getSource() == commandbox) {

                String command = commandbox.getText();
                isSaved = false;
                turtle.getCommand(command, TG);
                commandbox.setText("");

            }
        }
    }

}

theTurtle Java Class.

public class theTurtle {
    //ArrayList<String> oldCommands = new ArrayList<>();

    public void getCommand(String command, TurtleGraphics TG)
    {
        String[]entries = command.split(" ");
        int var = -1;
        String norm = entries[0];
        if (entries.length == 2)
        {
            var = Integer.parseInt(entries[1]);
        }
        getMethod(norm, var, TG);
    }
    private void getMethod(String command, int var, TurtleGraphics TG)
    {
        if (command.toLowerCase().equals("penup"))
        {
            TG.penUp();
        }
        else if (command.toLowerCase().equals("pendown"))
        {
            TG.penDown();
        }
        else if (command.toLowerCase().equals("turnleft"))
        {
            if (var==-1)
            {
                TG.turnLeft();
            }
            else{
                TG.turnLeft(var);
            }
        }
        else if (command.toLowerCase().equals("turnright"))
        {
            if (var==-1)
            {
                TG.turnRight();
            }
            else{
                TG.turnRight(var);
            }
        }
        else if (command.toLowerCase().equals("forward"))
        {
            if (var == -1 || var <= 0)
            {
                errorEcho(1);
            }
            else{
                TG.forward(var);
            }
        }
        else if (command.toLowerCase().equals("backward"))
        {
            if (var == -1 || var <= 0)
            {
                errorEcho(1);
            }
            else{
                TG.turnRight(180);
                TG.forward(var);
                TG.turnRight(180);
            }
        }
        else if (command.toLowerCase().equals("black"))
        {
            TG.setPenColour(Color.black);
        }
        else if (command.toLowerCase().equals("red"))
        {
            TG.setPenColour(Color.red);
        }
        else if (command.toLowerCase().equals("green"))
        {
            TG.setPenColour(Color.green);
        }
        else if (command.toLowerCase().equals("reset"))
        {
            TG.reset();
            TG.turnLeft(90);
            TG.clear();
            TG.penDown();
        }
        else if (command.toLowerCase().equals("circle"))
        {
            if (var == -1 || var <= 0)
            {
                errorEcho(1);
            }
            else{
                TG.circle(var);
            }
        }
        else{
           myGUI.infoBox("Invalid Command", "ERROR!");
        }

    }
    private void errorEcho(int errorCode)
    {

        myGUI.infoBox("Missing Parameters", "ERROR!");
    }

}

Переменные, которые показывают пошаговое прохождение около

1 Ответ

0 голосов
/ 30 апреля 2020
  1. Удалить TurtleGraphics TG = new TurtleGraphics();
  2. Заменить TG на this

Это должно привести вас в правильном направлении.

@ Редактировать

Хорошо, у нас нет кода для TurtleGraphics, поэтому мы не можем сказать 100%, но:

Первое: в вашем gui задании вы определяете

TurtleGraphics TG = new TurtleGraphics();
theTurtle turtle = new theTurtle();
TurtleGraphics ETG = new ExtendedTurtleGraphics();

Итак то, что вы создали здесь, имеет такую ​​структуру

TurtleGraphics TG
theTurtle turtle
ExtendedTurtleGraphics ETG {
    TurtleGraphics TG      // You define a new instanct of TurtleGraphics called TG in the ETG object
    theTurle turtle  // You defined a new instance of theTurtle called turtle in the ETG object
}

Обратите внимание, что теперь у вас есть два объекта turtle и два объекта TurtleGraphicsObject (или фактически три, потому что ETG также является TurtleGraphics, как только он расширяет TurtleGraphics)

Хорошо, тогда в функции «about» ExtendedTurtleGraphics вы запускаете команды для «черепахи», но имейте в виду, что команды выполняются для следующей черепахи:

TurtleGraphics TG
theTurtle turtle
ExtendedTurtleGraphics ETG {
    TurtleGraphics TG    
    theTurle turtle     //  <- this one 
}

Так что в основном «черепаха» Вы определили в классе "мой GUI" не меняется, когда вы запускаете метод "о" в ETG. Это объясняет, почему вывод консоли работает в методе about, но вы ничего не увидите.

Исправление было бы удалить две строки при инициализации My Gui:

TurtleGraphics TG = new TurtleGraphics(); // remove this one
theTurtle turtle = new theTurtle();  // remove this one
TurtleGraphics ETG = new ExtendedTurtleGraphics();

Затем удалите эту строку из ExtendedTurtleGraphics:

TurtleGraphics TG = new TurtleGraphics(); // Remove this one

В ExtendedTurtleGraphics заставьте theTurtle опубликовать c. После этого ваша структура будет выглядеть следующим образом:

My Gui: ExtendedTurtleGraphi c ETG {// Объект ExtendedTurtleGraphics представляет собой TurtleGraphi c
the Turle Turtle}

И теперь в моем классе Gui замените все вхождения "TG" на "ETG" и все вхождения "turtle" на "ETG.turtle"

Это означает, что каждый раз, когда вы хотите что-то с turtle ваш доступ к экземпляру turtle из ETG, а затем, когда вы вызываете метод about в ExtendedTurtleGraphics, вы изменяете тот же объект.

@ Второе редактирование:

Добавление конструктора в MyActionListener с аргументом ETG, например:

class MyActionListener implements ActionListener {

    private ExtendedTurtleGraphics ETG;

    public MyActionListener(ExtendedTurtleGraphics ETG){
        this.ETG = ETG;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == commandbox) {

            String command = commandbox.getText();
            isSaved = false;
            ETG.turtle.getCommand(command, ETG);
            commandbox.setText("");

        }
    }
}

В My Gui измените регистрацию слушателя Action следующим образом:

commandbox.addActionListener(new MyActionListener(ETG));
...