miercuri, 6 iunie 2012

Calculator

package pack;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class Calc extends JFrame implements ActionListener{
    private JTextField txtDisplay;
    private CalcModel model;
   
    public Calc(){
        super("Calculator");
       
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
        initComponents();
       
        setResizable(false);
       
        setLocationRelativeTo(null);
       
        setVisible(true);
        pack();
        model = new DefaultCalcModel();
    }
   
    private void initComponents(){
       
        JPanel contentPane = new JPanel(new BorderLayout());
        contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
       
        txtDisplay = new JTextField();
        txtDisplay.setEditable(false);
        txtDisplay.setBackground(Color.WHITE);
        txtDisplay.setHorizontalAlignment(JTextField.RIGHT);
        add(txtDisplay,BorderLayout.NORTH);
       
        Commands[] cmdButtons = Commands.values();
       
        // group 1
        JPanel pnlGroup1 = new JPanel();
        for (int btnIndex = 0; btnIndex < 3; btnIndex++) {
        CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
        btn.addActionListener(this);
        pnlGroup1.add(btn);
        }
        add(pnlGroup1, BorderLayout.EAST);
       
        // group2
        JPanel pnlGroup2 = new JPanel(new GridLayout(4, 5, 5, 5));
        for (int btnIndex = 3; btnIndex < cmdButtons.length; btnIndex++) {
        CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
        btn.addActionListener(this);
        pnlGroup2.add(btn);
        }
        add(pnlGroup2, BorderLayout.SOUTH);
    }
   
    public void actionPerformed(ActionEvent e){
        CommandButton btn = (CommandButton) e.getSource();
        model.processCommand(btn.getCommand());
        txtDisplay.setText(model.getDisplayText());
    }
}

package pack;


public interface CalcModel {
    void processCommand(Commands cmd);
    String getDisplayText();
}
 package pack;

import javax.swing.JButton;


@SuppressWarnings("serial")
public class CommandButton extends JButton {
    private Commands cmd;
    public Commands getCommand() {
        return cmd;
    }
    public CommandButton(Commands cmd) {
        super(cmd.displayText());
        this.cmd = cmd;
    }
   
}
package pack;



public enum Commands {
   
    BACKSPACE("Backspace"),
    CE("CE"),
    C("C"),
    NR_7("7", 7),
    NR_8("8", 8),
    NR_9("9", 9),
    DIV("/"),
    SQRT("sqrt"),
    NR_4("4", 4),
    NR_5("5", 5),
    NR_6("6", 6),
    MUL("*"),
    MOD("%"),
    NR_1("1", 1),
    NR_2("2", 2),
    NR_3("3", 3),
    MINUS("-"),
    DIV_BY("1/x"),
    NR_0("0", 0),
    PLUS_MINUS("+/-"),
    PERIOD("."),
    PLUS("+"), EQUALS("=");
    private int number;
    private String displayText;
   
    int number() {
        return number;
    }
    String displayText() {
        return displayText;
    }
    Commands(String displayText) {
        this(displayText, -1);
    }
    Commands(String displayText, int number) {
        this.displayText = displayText;
        this.number = number;
    }
}
package pack;


public class DefaultCalcModel implements CalcModel {

    private double currentRezult;
    private double currentValue;
    private String operatie;
    private int flag;
    private double k;
   
    public DefaultCalcModel() {
        currentRezult = 0;
        currentValue = 0;
    }
    public void processCommand(Commands cmd) {
        if (cmd.number() != -1) {
            addCifre(cmd.number());
        }
        else {
            switch (cmd) {
            case BACKSPACE:
                break;
            case CE:
                currentValue = 0;
                break;
            case C:
                currentValue = 0;
                currentRezult = 0;
                break;
            case MUL:
                flag=0;
                currentRezult=currentValue;
                currentValue=0;
                operatie="*";
                break;
            case DIV:
                flag=0;
                currentRezult=currentValue;
                currentValue=0;
                operatie="/";
                break;
            case MINUS:
                flag=0;
                currentRezult=currentValue-currentRezult;
                currentValue=0;
                operatie="-";
                break;
            case PLUS:
                flag=0;
                System.out.println(currentValue);
                currentRezult=currentValue+currentRezult;
                System.out.println(currentRezult);
                currentValue=0;       
                operatie="+";
                break;
            case MOD:
                flag=0;
                currentRezult=currentValue;
                currentValue=0;
                operatie="%";
                break;
            case DIV_BY:
                flag=0;
                currentRezult=currentValue;
                currentValue=1/currentRezult;
                break;
            case PLUS_MINUS:
                flag=0;
                currentRezult=currentValue;
                currentRezult=(-1)*currentRezult;
                currentValue=currentRezult;
                System.out.println(currentValue);
                break;
            case SQRT:
                flag=0;
                currentRezult=currentValue;
                currentValue=Math.sqrt(currentRezult);
                break;
            case PERIOD:
                k=0;
                flag=1;
                break;
            case EQUALS:
                if(operatie.compareTo("*")==0)
                {
                currentValue*=currentRezult;
                }
                else
                {
                    if(operatie.compareTo("/")==0)
                    {
                        currentRezult/=currentValue;
                        currentValue=currentRezult;
                    }
                    else
                    {
                        if(operatie.compareTo("-")==0)
                        {
                            currentRezult-=currentValue;
                            currentValue=currentRezult;
                        }
                        else
                            if(operatie.compareTo("+")==0)
                            {
                                currentValue+=currentRezult;
                            }
                            else
                            {
                                if(operatie.compareTo("%")==0)
                                {
                                    currentRezult%=currentValue;
                                    currentValue=currentRezult;
                                }
                                else
                                {
                                    currentValue=Math.sqrt(currentRezult);
                                }
                            }
                    }
                }
                break;
            }
        }
        }
   
   
    public String getDisplayText() {
        return ""+currentValue;
    }
    private void addCifre(int cifre) {
        if(flag==0)
        {
            currentValue=currentValue*10+cifre;
        }
        else
        {
            k++;
            double r=Math.pow(10, k);
            currentValue=(currentValue*r+cifre)/r;
        }
    }
}
package pack;



public class Main {
    public static void main(String[] args) {
        new Calc();
        }

}


Niciun comentariu:

Trimiteți un comentariu