Programming/JAVA2011. 6. 17. 09:56
CalculTest.java
public class CalculTest {
    public static void main(String args[]){
        //calculTest ct= new calculTest();
        CalculModel calModel = new CalculModel();
        CalculControler calCon = new CalculControler(calModel);
    }
}

CalculModel.java
public class CalculModel {
    CalculControler calCon;

    String num1; //기존의 수
    String num2; //새로 받은 수
    String oper; //연산자

    boolean inputNumberAbleStatus;  // 화면에 숫자가 새로 받아지는걸 허용/비허용
    boolean selectedOperStatus;     // 연산자 버튼을 눌럿는지 안 눌렀는지
    boolean pointExist;             // .을 눌럿는지 안 눌럿는지
    //생성자
    CalculModel(){
        num1="0";
        num2="0";
        oper="";
        inputNumberAbleStatus=true;
        selectedOperStatus=false;
        pointExist=false;
    }
    //숫자 입력 받앗을때
    public void inputNumber(String num){
        if(!num.equals("Number not divide 0")){
            if(num.equals(".")){
                if(pointExist) num="";
                if(inputNumberAbleStatus){
                    inputNumberAbleStatus=false;
                    calCon.setView("0"+num);
                }else{
                    calCon.setView(getView()+num);
                }
                pointExist=true;
            }else{
                if(inputNumberAbleStatus){
                    inputNumberAbleStatus=false;
                    setView(num);
                }else{
                    setView(getView()+num);
                }
            }
        }
    }
    //기호 입력 받앗을때
    public void inputOper(String oper){
        if(selectedOperStatus){
            num2=getView();
            if(!num2.equals("Number not divide 0")){
                num1=operation(this.oper, num1, num2);
                this.oper=oper;
                setView(num1);
                inputNumberAbleStatus=true;
                pointExist=false;
            }
        }else{
            this.oper=oper;
            num2=getView();
            num1=operation(oper, num2, num1);
            selectedOperStatus=true;
            inputNumberAbleStatus=true;
            pointExist=false;
        }
    }
    // Clear버튼  눌럿을때
    public void inputClear(){
        num1="0";
        num2="0";
        oper="";
        setView("0");
        inputNumberAbleStatus=true;
        selectedOperStatus=false;

    }
    // 연산자 처리 부분 로직
    public String operation(String oper, String num1, String num2){
        switch(oper.charAt(0)){
        case '+': 
            num1=""+(Double.parseDouble(num1)+Double.parseDouble(num2));
            return num1;
        case '-': 
            num1=""+(Double.parseDouble(num1)-Double.parseDouble(num2));
            return num1;
        case '*':
            if(selectedOperStatus)
                num1=""+(Double.parseDouble(num1)*Double.parseDouble(num2));
            return num1;
        case '/':
            if(selectedOperStatus&&num2.equals("0")){
                num1="Number not divide 0";
                oper="";
            }
            if(!num2.equals("0"))
                num1=""+(Double.parseDouble(num1)/Double.parseDouble(num2));
            return num1;
        case '=':
            num1=num2;
            oper="";
            return num1;
        default:
            return num1;
        }
    }
    //소수점이 .0일때 뒤에 .0을 제거하여 정수형으로 나타냄
    public String removePointZero(String numWithPoint){
        String newNum="";
        int pointIdx=0;
        int zeroIdx=0;
        if(numWithPoint.equals("-0")) return "0";
        if(numWithPoint.length()<3) return numWithPoint;
        if(numWithPoint.charAt(numWithPoint.length()-2)
                =='.'&&numWithPoint.charAt(numWithPoint.length()-1)=='0'){
            for(int i=0;i<numWithPoint.length()-2;i++){
                newNum+=numWithPoint.charAt(i);
            }
            return newNum;
        }else
            return numWithPoint;


    }
    //뷰의 필드값 세팅/게팅
    public void setView(String s){calCon.setView(removePointZero(s));}
    public String getView(){return calCon.getView();}
}

CalculControler.java
public class CalculControler {
    CalculView calView;
    CalculModel calModel;
    public CalculControler(CalculModel calModel) {
        this.calModel=calModel;
        calModel.calCon=this;
        calView = new CalculView(this);
        calView.setBounds(600,400,300,200);
        calView.setResizable(false);
        calView.setVisible(true);
    }
    // 숫자버튼.기호버튼,Clear버튼을 구분
    public void inputNumber(String num){calModel.inputNumber(num);}
    public void inputOper(String oper){calModel.inputOper(oper);}
    public void inputClear(){calModel.inputClear();}
    // 계산기창 필드의 값을 setting / getting
    public void setView(String s){calView.setView(s);}
    public String getView(){return calView.getView();}
}

CalculView.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CalculView extends JFrame {
    CalculControler calCon;
    JPanel pCalView, pCalButton;
    JLabel vCalView;
    JButton numButton[], operButton[];
    JButton bZero, bOne, bTwo, bThree, bFour, bFive, bSix, bSeven, bEight, bNine, bPoint; 
    JButton bPlus, bMinus, bMultiply, bDivide, bEquals; 
    JButton bClear;

    GridBagConstraints gbc;
    GridBagLayout gbl;

    CalculView(CalculControler calCon){
        this.calCon=calCon;
        //this.calModel=calModel;
        

        //타이틀과 배치관리자를 설정
        Container con = getContentPane(); 
        this.setTitle("이상한 계산기");
        con.setLayout(new BorderLayout());
        //뷰 패널 생성 및 배치관리자 설정
        pCalView = new JPanel();
        pCalView.setLayout(new BorderLayout());
        //계산 뷰 텍스트창 생성
        vCalView = new JLabel("0");
        vCalView.setHorizontalAlignment(JLabel.RIGHT);
        vCalView.setBackground(Color.WHITE);
        vCalView.setFocusable(false);
        //뷰 패널에 계산 텍스트 창 합치기
        pCalView.add(vCalView);

        //프레임에 부착
        this.add(pCalView, "North");

        //계산 패널 생성
        pCalButton = new JPanel();
        //숫자 버튼 생성
        bZero = new JButton("0");
        bOne = new JButton("1");
        bTwo = new JButton("2");
        bThree = new JButton("3");
        bFour = new JButton("4");
        bFive = new JButton("5");
        bSix = new JButton("6");
        bSeven = new JButton("7");
        bEight = new JButton("8");
        bNine = new JButton("9");
        bPoint = new JButton(".");
        //리스너 부착
        setNumberButton(bZero, bOne, bTwo, bThree, bFour, bFive, bSix, bSeven, bEight, bNine, bPoint);

        //연산자 버튼 생성
        bPlus = new JButton("+");
        bMinus = new JButton("-");
        bMultiply = new JButton("*");
        bDivide = new JButton("/");
        bEquals = new JButton("=");
        //리스너 부착
        setOperButton(bPlus, bMinus, bMultiply, bDivide, bEquals);
        
        //Clear버튼 생성
        bClear = new JButton("C");
        setClearButton(bClear);
        //리스너부착
        setPanelButton();
        
        //배치관리자 버튼 부착
        this.add(pCalButton, "Center");

        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent evt){
                dispose();
                System.exit(0);
            }
        });
    }
    //리스너 부착 메소드
    public void setNumberButton(JButton ...numButtonArr){
        numButton=numButtonArr;
        for(JButton numB : numButton)
            numB.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae) {
                    calCon.inputNumber(ae.getActionCommand());
                }
            });

    }
    //    리스너 부착 메소드
    public void setOperButton(JButton ...operButtonArr){
        operButton=operButtonArr;
        for(JButton operB : operButton)
            operB.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae) {
                    calCon.inputOper(ae.getActionCommand());
                }
            });
    }
    //    리스너 부착 메소드
    public void setClearButton(JButton clearButton){
        clearButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                calCon.inputClear();
                
            }
        });        
    }
    // 레이아웃 메소드    
    public void setPanelButton(){
        gbl = new GridBagLayout();
        pCalButton.setLayout(gbl);
        gbc=new GridBagConstraints();
        gbc.weightx=1.0;
        gbc.weighty=1.0;
        gbc.fill=GridBagConstraints.BOTH;

        layout(bClear, 0, 0, 1, 1);
        layout(bDivide, 1, 0, 1, 1);
        layout(bMultiply, 2, 0, 1, 1);
        layout(bMinus, 3, 0, 1, 1);

        layout(bSeven, 0, 1, 1, 1);
        layout(bEight, 1, 1, 1, 1);
        layout(bNine, 2, 1, 1, 1);
        layout(bPlus, 3, 1, 1, 2);

        layout(bFour, 0, 2, 1, 1);
        layout(bFive, 1, 2, 1, 1);
        layout(bSix, 2, 2, 1, 1);

        layout(bOne, 0, 3, 1, 1);
        layout(bTwo, 1, 3, 1, 1);
        layout(bThree, 2, 3, 1, 1);
        layout(bEquals, 3, 3, 1, 2);

        layout(bZero, 0, 4, 2, 1);
        layout(bPoint, 2, 4, 1, 1);

    }
    public void layout(Component obj, int x, int y, int width, int height){
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        pCalButton.add(obj, gbc);
    }
    //필드값을 세팅,게팅
    public void setView(String s){vCalView.setText(s);}
    public String getView(){return vCalView.getText();}
}

//분석하자!! 
Posted by 신의물방울