Untitled

 avatar
unknown
plain_text
2 years ago
14 kB
5
Indexable
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;

/*
 * Fix:
 */

public class Calculator {
    public static void main(String[] args) {
        JFrame cw = new JFrame();
        cw.setTitle("Calculator");
        cw.setPreferredSize(new Dimension(455, 638));
        cw.setVisible(true);
        cw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        cw.getContentPane().setBackground(Color.BLUE);
        cw.setResizable(false);
        Container C = cw.getContentPane();
        C.setLayout(null);
        int counter = 1;

        // JPanel backgroundJPanel = new JPanel();
        // backgroundJPanel.setBackground(Color.BLUE);
        // backgroundJPanel.setBounds(0, 0, 440, 600);

        JTextArea screen = new JTextArea("0");
        screen.setBounds(20, 420 - 210 - 190, 400, 160);
        screen.setBackground(Color.YELLOW);
        screen.setFont(new Font("Arial", Font.BOLD, 22));
        screen.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        screen.setLineWrap(true);
        screen.setWrapStyleWord(false);
        screen.setOpaque(true);
        screen.setEditable(false);
        screen.setHighlighter(null);
        screen.setAlignmentX(JTextArea.LEFT_ALIGNMENT);
        screen.setAlignmentY(JTextArea.BOTTOM_ALIGNMENT);
        cw.add(screen);

        CalculatorButton zeroButton = new CalculatorButton(20, 700 - 190, 100, 70, "0", Color.YELLOW);
        cw.add(zeroButton.myButton);
        CalculatorButton periodButton = new CalculatorButton(120, 700 - 190, 100, 70, ".", Color.YELLOW);
        cw.add(periodButton.myButton);
        CalculatorButton equalsButton = new CalculatorButton(220, 700 - 190, 100, 70, "=", Color.YELLOW);
        cw.add(equalsButton.myButton);
        CalculatorButton plusButton = new CalculatorButton(320, 700 - 190, 100, 70, "+", Color.YELLOW);
        cw.add(plusButton.myButton);
        CalculatorButton minusButton = new CalculatorButton(320, 630 - 190, 100, 70, "-", Color.YELLOW);
        cw.add(minusButton.myButton);
        CalculatorButton multiplyButton = new CalculatorButton(320, 560 - 190, 100, 70, "*", Color.YELLOW);
        cw.add(multiplyButton.myButton);
        CalculatorButton divideButton = new CalculatorButton(320, 490 - 190, 100, 70, "/", Color.YELLOW);
        cw.add(divideButton.myButton);
        CalculatorButton clearButton = new CalculatorButton(320, 420 - 190, 100, 70, "CE", Color.YELLOW);
        cw.add(clearButton.myButton);
        CalculatorButton powerButton = new CalculatorButton(220, 420 - 190, 100, 70, "x^y", Color.YELLOW);
        cw.add(powerButton.myButton);
        CalculatorButton RparenthesisButton = new CalculatorButton(120, 420 - 190, 100, 70, ")", Color.YELLOW);
        cw.add(RparenthesisButton.myButton);
        CalculatorButton LparenthesisButton = new CalculatorButton(20, 420 - 190, 100, 70, "(", Color.YELLOW);
        cw.add(LparenthesisButton.myButton);
        for (int row = 1; row <= 3; row++) {
            for (int column = 0; column < 3; column++) {
                CalculatorButton numberButton = new CalculatorButton(20 + (100 * column), 700 - (70 * row) - 190, 100,
                        70,
                        counter + "", Color.YELLOW);
                cw.add(numberButton.myButton);
                final Integer innercounter = new Integer(counter);
                numberButton.myButton.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if ((screen.getText().substring(screen.getText().length() - 1).equals("0"))
                                && screen.getText().length() == 1)
                            screen.setText("");
                        screen.setText(screen.getText() + innercounter);
                    }

                });
                counter++;
            }
        }

        LparenthesisButton.myButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if ((screen.getText().substring(screen.getText().length() - 1).equals("0"))
                        && screen.getText().length() == 1)
                    screen.setText("");
                screen.setText(screen.getText() + "(");
            }

        });
        RparenthesisButton.myButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if ((screen.getText().substring(screen.getText().length() - 1).equals("0"))
                        && screen.getText().length() == 1)
                    screen.setText("");
                screen.setText(screen.getText() + ")");
            }

        });
        powerButton.myButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (isNumber(screen.getText().substring(screen.getText().length() - 1)) ||
                        screen.getText().substring(screen.getText().length() - 1).equals(")"))
                    screen.setText(screen.getText() + "^");
            }

        });
        periodButton.myButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (isNumber(screen.getText().substring(screen.getText().length() - 1)))
                    screen.setText(screen.getText() + ".");
            }

        });
        zeroButton.myButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if ((screen.getText().substring(screen.getText().length() - 1).equals("0"))
                        && screen.getText().length() == 1)
                    return;
                screen.setText(screen.getText() + "0");
            }

        });
        plusButton.myButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (isNumber(screen.getText().substring(screen.getText().length() - 1)) ||
                        screen.getText().substring(screen.getText().length() - 1).equals(")"))
                    screen.setText(screen.getText() + "+");
            }

        });
        minusButton.myButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if ((screen.getText().substring(screen.getText().length() - 1).equals("0"))
                        && screen.getText().length() == 1)
                    screen.setText("");

                if (screen.getText().length() >= 2) {
                    if (screen.getText().substring(screen.getText().length() - 2).equals("--")) {
                        screen.setText(screen.getText());
                        return;
                    }
                }
                if (screen.getText().length() == 0)
                    screen.setText(screen.getText() + "-");
                else {
                    if (!screen.getText().substring(screen.getText().length() - 1).equals("."))
                        screen.setText(screen.getText() + "-");
                }

            }

        });
        multiplyButton.myButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (isNumber(screen.getText().substring(screen.getText().length() - 1)) ||
                        screen.getText().substring(screen.getText().length() - 1).equals(")"))
                    screen.setText(screen.getText() + "*");
            }

        });
        divideButton.myButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (isNumber(screen.getText().substring(screen.getText().length() - 1)) ||
                        screen.getText().substring(screen.getText().length() - 1).equals(")"))
                    screen.setText(screen.getText() + "/");
            }

        });
        clearButton.myButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                screen.setText("0");
            }

        });

        equalsButton.myButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                double ans = eval(screen.getText());
                if ((ans + "").equals("0.0")) {
                    screen.setText("0");
                } else {
                    screen.setText("" + ans);
                }
            }

        });

        KeyListener keyListener = new KeyListener() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
                    if (screen.getText() == null || screen.getText().isEmpty() || screen.getText().length() == 1) {
                        screen.setText("0");
                        return;
                    }

                    screen.setText(screen.getText().substring(0, screen.getText().length() - 1));
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {
                // This method is called when a key is released
            }

            @Override
            public void keyTyped(KeyEvent e) {
                // This method is called when a key is typed (pressed and released)
            }
        };

        // cw.add(backgroundJPanel);
        cw.addKeyListener(keyListener);
        cw.setFocusable(true);
        cw.requestFocus();
        cw.pack();
        cw.setVisible(true);
        cw.validate();

    }

    public static boolean isNumber(String str) {
        try {
            Double.parseDouble(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    public static double eval(final String str) {
        return new Object() {
            int pos = -1, ch;

            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1;
            }

            boolean eat(int charToEat) {
                while (ch == ' ')
                    nextChar();
                if (ch == charToEat) {
                    nextChar();
                    return true;
                }
                return false;
            }

            double parse() {
                nextChar();
                double x = parseExpression();
                if (pos < str.length())
                    throw new RuntimeException("Unexpected: " + (char) ch);
                return x;
            }

            // Grammar:
            // expression = term | expression `+` term | expression `-` term
            // term = factor | term `*` factor | term `/` factor
            // factor = `+` factor | `-` factor | `(` expression `)` | number
            // | functionName `(` expression `)` | functionName factor
            // | factor `^` factor

            double parseExpression() {
                double x = parseTerm();
                for (;;) {
                    if (eat('+'))
                        x += parseTerm(); // addition
                    else if (eat('-'))
                        x -= parseTerm(); // subtraction
                    else
                        return x;
                }
            }

            double parseTerm() {
                double x = parseFactor();
                for (;;) {
                    if (eat('*'))
                        x *= parseFactor(); // multiplication
                    else if (eat('/'))
                        x /= parseFactor(); // division
                    else
                        return x;
                }
            }

            double parseFactor() {
                if (eat('+'))
                    return +parseFactor(); // unary plus
                if (eat('-'))
                    return -parseFactor(); // unary minus

                double x;
                int startPos = this.pos;
                if (eat('(')) { // parentheses
                    x = parseExpression();
                    if (!eat(')'))
                        throw new RuntimeException("Missing ')'");
                } else if ((ch >= '0' && ch <= '9') || ch == '.') { // numbers
                    while ((ch >= '0' && ch <= '9') || ch == '.')
                        nextChar();
                    x = Double.parseDouble(str.substring(startPos, this.pos));
                } else if (ch >= 'a' && ch <= 'z') { // functions
                    while (ch >= 'a' && ch <= 'z')
                        nextChar();
                    String func = str.substring(startPos, this.pos);
                    if (eat('(')) {
                        x = parseExpression();
                        if (!eat(')'))
                            throw new RuntimeException("Missing ')' after argument to " + func);
                    } else {
                        x = parseFactor();
                    }
                    if (func.equals("sqrt"))
                        x = Math.sqrt(x);
                    else if (func.equals("sin"))
                        x = Math.sin(Math.toRadians(x));
                    else if (func.equals("cos"))
                        x = Math.cos(Math.toRadians(x));
                    else if (func.equals("tan"))
                        x = Math.tan(Math.toRadians(x));
                    else
                        throw new RuntimeException("Unknown function: " + func);
                } else {
                    throw new RuntimeException("Unexpected: " + (char) ch);
                }

                if (eat('^'))
                    x = Math.pow(x, parseFactor()); // exponentiation

                return x;
            }
        }.parse();
    }

}
Editor is loading...