Не могу понять, как закодировать мой калькулятор - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь написать простой калькулятор, похожий на тот, который вы видите в Windows (ненаучный).Я не могу на всю жизнь понять, как правильно изменить текст после нажатия оператора, но все еще вижу исходную запись, которая не изменится до тех пор, пока не будет нажата следующая цифра, при этом кнопка равенства выполняет ту же операцию, если используется несколько раз (ie: 5+5 = 10 +5 = 15) и когда я введу такую ​​же цифру (5+5), она не примет вторую цифру.Я знаю, что я очень близок и, возможно, мне не хватает определенного boolean, который мог бы позволить моему коду работать должным образом, но я не уверен, где искать.Спасибо за любую помощь.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JCalculator extends JFrame implements ActionListener {

/** intialize the jlabel, jbutton, string that makes the buttons and jpanel that will hold the buttons
 *
 */
private JTextField display = new JTextField("0", SwingConstants.RIGHT);
private JPanel buttonPanel = new JPanel();
private JPanel displayPanel = new JPanel();
private JButton newButton, divButton, multiButton, equalsButton, clearButton, plusButton, minusButton;
private String[] arrayButtons = {"7","8", "9", "/", "4", "5", "6", "x", "1", "2", "3", "-", "0","C", "=", "+"};
private int operand = 0;
private int firstInput = 0, secondInput = 0, answer = 0;




    JCalculator() {

        /** creates the jframe */
        JFrame jfrm = new JFrame("Calculator");

        /** sets the size of the jfrm and then positions it in the center of screen */
        jfrm.setSize(480, 300);
        jfrm.setLocationRelativeTo(null);

        /** sets the program to close on exit */
        jfrm.setDefaultCloseOperation(jfrm.EXIT_ON_CLOSE);
        /** ImageIcon img = new ImageIcon(JCalculator.png);
         *
         */

        /**sets initial layout to border */

        jfrm.setLayout(new BorderLayout());

        /** makes a panel named display that holds the Jtext display
         * enables it and justifies it right
         */
        displayPanel.setLayout(new BorderLayout());
        displayPanel.add(display, BorderLayout.CENTER);
        display.setHorizontalAlignment(JTextField.RIGHT);
        display.setEnabled(false);

        /** makes a panel for buttons that is a grid layout
         *
         */
        buttonPanel.setLayout(new GridLayout(4,4));

        /** makes a loop to make all of the 16 buttons for the calculator
         * the operands all have their own specific buttons
         */

        for (int i = 0; i < arrayButtons.length; i++) {

            if (arrayButtons[i].equals("/")) {

                divButton = new JButton(arrayButtons[i]);
                divButton.addActionListener(this);
                buttonPanel.add(divButton);

            } else if (arrayButtons[i].equals("x")) {

                multiButton = new JButton(arrayButtons[i]);
                multiButton.addActionListener(this);
                buttonPanel.add(multiButton);

            } else if (arrayButtons[i].equals("=")) {

                equalsButton = new JButton(arrayButtons[i]);
                equalsButton.addActionListener(this);
                buttonPanel.add(equalsButton);

            } else if (arrayButtons[i].equals("C")) {

                clearButton = new JButton(arrayButtons[i]);
                clearButton.addActionListener(this);
                buttonPanel.add(clearButton);

            } else if (arrayButtons[i].equals("+")) {

                plusButton = new JButton(arrayButtons[i]);
                plusButton.addActionListener(this);
                buttonPanel.add(plusButton);

            } else if (arrayButtons[i].equals("-")) {

                minusButton = new JButton(arrayButtons[i]);
                minusButton.addActionListener(this);
                buttonPanel.add(minusButton);

            } else {

                newButton = new JButton(arrayButtons[i]);
                newButton.addActionListener(this);
                buttonPanel.add(newButton);

            }
        }

        /** adds the two panels to the jfrm
         * sets jfrm visibility to true
         * sets equalsButton to the default button
         */
        jfrm.add(displayPanel, BorderLayout.NORTH);
        jfrm.add(buttonPanel, BorderLayout.CENTER);
        jfrm.getRootPane().setDefaultButton(equalsButton);
        jfrm.setVisible(true);
    }

public void actionPerformed(ActionEvent ae) {

    String s = ae.getActionCommand();
    char stringCheck = s.charAt(0);

    if (answer == Integer.parseInt(display.getText())) {

        display.setText("0");

    }

    if (Character.isDigit(stringCheck) && display.getText().length() < 8) {

        if (display.getText().equals("0")) {

            display.setText(s);

        } else {

        display.setText(display.getText().concat(s));

    }

    } if (s.equals("+")){

        answer = Integer.parseInt(display.getText());
        operand = 1;

    } if (s.equals( "-")){

        answer = Integer.parseInt(display.getText());
        operand = 2;

    } if (s.equals("x")){

        answer = Integer.parseInt(display.getText());
        operand = 3;

    } if (s.equals("/")){

        answer = Integer.parseInt(display.getText());
        operand = 4;

    } if (s.equals("C")){

        firstInput = 0;
        secondInput = 0;
        answer = 0;
        operand = 0;
        display.setText("0");

    } if (s.equals("=")){


        switch(operand){

            case 1:

            answer += Integer.parseInt(display.getText());
                display.setText(Integer.toString(answer));
            break;

            case 2:

            answer -= Integer.parseInt(display.getText());
                display.setText(Integer.toString(answer));
            break;

            case 3:

            answer *= Integer.parseInt(display.getText());
                display.setText(Integer.toString(answer));
            break;

            case 4:

                if(Integer.parseInt(display.getText()) > 0 || Integer.parseInt(display.getText()) < 0) {

                    answer /= Integer.parseInt(display.getText());
                    display.setText(Integer.toString(answer));
                    break;

                } else {

                    display.setText("Div by 0");

                }


        }

        if(answer > 100000000 || answer < -100000000){

            display.setText("Overlow");
        }

    }


}

public static void main (String [] args){

    /**
     * run program
     */
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new JCalculator();

        }
    });

 }
}
...