将一个完整的计算器代码改成MVC结构后,出现了错误


package sa;
public class CalculateMain {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Calculate calcluate=new Calculate();
    }
}
Calculate.java:
package sa;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import javax.swing.*;
import java.math.*;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Stack;
import java.util.Queue;
public class Calculate extends JFrame{
    public JTextField resulttext;
    public JTextField textField1;
    public JTextField textField;
    public JTextField textField2;
    public JTextArea textArea;
    double num=0.0;
    public Calculate() {
        super("swing");
        CalculateController calculate=new CalculateController();
        textField = new JTextField("0", 13);
        textField.setBackground(Color.WHITE);
        textField.setHorizontalAlignment(JTextField.RIGHT);
        textField.setEditable(false);
        textField1 = new JTextField("0", 6);
        textField1.setBackground(Color.WHITE);
        textField1.setHorizontalAlignment(JTextField.RIGHT);
        textField1.setEditable(false);
        textField2 = new JTextField("0", 13);
        textField2.setBackground(Color.WHITE);
        textField2.setHorizontalAlignment(JTextField.RIGHT);
        textField2.setEditable(false);
        JPanel viewPanel = new JPanel();
        viewPanel.add(textField);
        viewPanel.add(textField1);
        viewPanel.add(textField2);
     
        JPanel panel = new JPanel();

        String[][] names = {{"1", "2", "3", "/", "c"}, {"4", "5", "6", "*", "�˸�"}, {"7", "8", "9", "-", "sqrt"}, {"0", "+/-", ".", "+", "="}};
        JPanel buttonPanel = new JPanel();
        JButton[][] buttons = new JButton[4][5];
        final GridLayout gridLayout = new GridLayout(4, 0);
        gridLayout.setHgap(10);
        gridLayout.setVgap(10);
        buttonPanel.setLayout(gridLayout);
        //һ�� ѭ���ź��������ֺ���������
        for (int row = 0; row < names.length; row++) {
            for (int col = 0; col < names.length + 1; col++) {
                buttons[row][col] = new JButton(names[row][col]);
                buttonPanel.add(buttons[row][col]);
                buttons[row][col].addActionListener(calculate);
            }
        }
        panel.setLayout(new BorderLayout());
        panel.add(viewPanel, BorderLayout.NORTH);
        panel.add(buttonPanel, BorderLayout.CENTER);
        final JLabel leftLabel = new JLabel();
        leftLabel.setPreferredSize(new Dimension(10, 0));
        panel.add(leftLabel, BorderLayout.WEST);
        final JLabel rightLabel = new JLabel();
        rightLabel.setPreferredSize(new Dimension(10, 0));
        panel.add(rightLabel, BorderLayout.EAST);
        getContentPane().add(panel, BorderLayout.WEST);
        final JPanel panelx = new JPanel();
        panelx.setLayout(new BorderLayout());
        getContentPane().add(panelx, BorderLayout.CENTER);
        final JPanel viewPanel1 = new JPanel();
        panelx.add(viewPanel1, BorderLayout.NORTH);
        this.resulttext = new JTextField("0");
        resulttext.setEditable(false);
        resulttext.setHorizontalAlignment(SwingConstants.CENTER);
        resulttext.setColumns(18);
        viewPanel1.add(resulttext);
        this.textArea = new JTextArea();
        textArea.setColumns(15);
        textArea.setRows(4);
        textArea.setLineWrap(true);
        final JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(textArea);
        panelx.add(scrollPane, BorderLayout.CENTER);
        final JPanel buttonPanel1 = new JPanel();
        panelx.add(buttonPanel1, BorderLayout.SOUTH);
        final JButton aButton = new JButton();
        aButton.setText("保存");
        aButton.addActionListener(calculate);
        buttonPanel1.add(aButton);
        final JButton bButton = new JButton();
        bButton.setText("查看");
        bButton.addActionListener(calculate);
        buttonPanel1.add(bButton);
        final JButton cButton = new JButton();
        cButton.setText("清除");
        cButton.addActionListener(calculate);
        buttonPanel1.add(cButton);
        pack();
        setVisible(true);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }  
    }
CalculateController.java:
package sa;
import java.awt.event.ActionEvent;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class CalculateController implements java.awt.event.ActionListener{
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        /*��������*/
            String s = (e.getActionCommand());
            JButton str = (JButton) e.getSource();
            CalculateModel model=new CalculateModel();
            Calculate cal=new Calculate();
            /*���˼�*/
            if(s.equals("退格")) {
                if (cal.textField2.getText().equals(""))
                    model.pressBackspace1();
                else model.pressBackspace2();
            }
            /*清0键*/
            if(s.equals("C")) {
                cal.resulttext.setText("0");
                cal.textField.setText("0");
                cal.textField1.setText("0");
                cal.textField2.setText("0");
                model.optionValue=0;//表示运算符的变量设置为0
                model.newDigital=true;//表示是否新输入的数的标志设置为true
            }
            /*数字键*/
            if("0123456789.".contains(s)) {
                if(cal.textField1.getText().equals("0")) {
                    if(model.newDigital) {
                        cal.textField.setText(s);
                    }else if(s.equals(".")&&(!cal.textField.getText().contains("."))) {
                        cal.textField.setText(cal.textField.getText()+".");
                    }else if(!s.equals(".")) {
                        cal.textField.setText(cal.textField.getText()+s);
                    }
                    model.newDigital=false;
                }
                else {
                    if(model.newDigital) {
                        cal.textField2.setText(s);
                    }else if(s.equals(".")&&(!cal.textField2.getText().contains("."))) {
                        cal.textField2.setText(cal.textField2.getText()+".");
                    }else if(!s.equals(".")) {
                        cal.textField2.setText(cal.textField2.getText()+s);
                    }
                    model.newDigital=false;
                }
            }
            /* 表示数字正负符号+/- */
            if(s.equals("+/-")) {
                Double d=Double.parseDouble(s.trim());//获取输入的数字
                cal.resulttext.setText(String.valueOf(-d));//取得获取输入数字的相反数
            }
            //////////////////////////////////////////////////////加减乘除运算的实现/////////////////////////////////////////////////////////
            if(s.equals("+")) {
                model.d1=Double.parseDouble(cal.textField.getText());//立刻获取前操作数的值
                cal.textField1.setText("+");
                model.optionValue=1;//设置运算符标志
            }
            if(s.equals("-")) {
                model.d1=Double.parseDouble(cal.textField.getText());
                cal.textField1.setText("-");
                model.optionValue=2;
            }
            if(s.equals("*")) {
                model.d1=Double.parseDouble(cal.textField.getText());
                cal.textField1.setText("*");
                model.optionValue=3;
            }
            if(s.equals("/")) {
                model.d1=Double.parseDouble(cal.textField.getText());
                cal.textField1.setText("/");
                model.optionValue=4;
            }
            if(s.equals("=")) {
                model.sx();
                /*根据运算符标志的不同值确定计算结果*/
            }
            ////////////////////////////////求平方根/////////////////////////////////
            if(s.equals("sqrt")) {
                double e1=Double.parseDouble(cal.textField.getText().trim());//获取操作数的值
                if(e1>0) {
                    cal.resulttext.setText(String.valueOf(Math.sqrt(e1)));//计算该值的平方根
                }else {
                    cal.resulttext.setText("负数不能计算平方根");
                }
            }
            if(s.equals("清除")) {                                 //点击“清除”按键*******
                cal.textArea.setText("");
            }else if(s.equals("保存")){                            //点击“保存”**********
                String stx=cal.textArea.getText();
                try {
                    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\Users\\result.txt"));
                    osw.write(s);
                    osw.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }else if(s.equals("查看")){                             //点击“查看”*********
                char[] chs = new char[2048];
                try {
                    InputStreamReader isr = new InputStreamReader(new FileInputStream("C:\\Users\\result.txt"));
                    int len;
                    while ((len = isr.read(chs))!=-1){
                        cal.textArea.append(String.valueOf(chs));
                    }
                    isr.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
}
CalculateModel.java:
package sa;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class CalculateModel {
    public boolean newDigital = true;//����ȫ��boolean���� ���ڱ�ʾ�Ƿ����������ı�־
    public String operation = "";//��ʾ��������ַ���
    public double d1;//��Ԫ����ǰ����
    public double d2;//��Ԫ����������
    public int optionValue;
    public double num=0.0;
    Calculate cal=new Calculate();
        public void pressBackspace1() {//处理当按下C键时,第一个文本框输入的数字回退一位//
            String text=cal.textField.getText();
            int i=text.length();
            if(i>0) {
                text=text.substring(0, i-1);
                if(text.length()==0) {
                    cal.textField.setText("");
                    newDigital=true;
                }else cal.textField.setText(text);
            }
        }
        public void pressBackspace2() {//处理当按下C键时,第二个文本框输入的数字回退一位//
            String text=cal.textField2.getText();
            int i=text.length();
            if(i>0) {
                text=text.substring(0, i-1);
                if(text.length()==0) {
                    cal.textField2.setText("");
                    newDigital=true;
                }else cal.textField2.setText(text);
            }
        }
        public void sx() {
            d2=Double.parseDouble(cal.textField2.getText());//获取后操作数的值
            
            /*根据运算符标志的不同值确定计算结果*/
            switch(optionValue) {
                case 1:
                    num=d1+d2;
                    break;
                case 2:
                    cal.resulttext.setText(String.valueOf(d1-d2));
                    break;
                case 3:
                    cal.resulttext.setText(String.valueOf(d1*d2));
                    break;
                case 4:
                    if(d2!=0) {
                        cal.resulttext.setText(String.valueOf(d1/d2));
                    }else {
                        cal.resulttext.setText("除数不能为0");
                    }
                    break;
            }
            operation="";//运算结束 清空运算符
            cal.resulttext.setText(String.valueOf(num));
            String a=cal.textField.getText();
            String b=cal.textField1.getText();
            String c=cal.textField2.getText();
            String str1=a+b+c+"="+String.valueOf(num);
            cal.textArea.append(str1);
        }
}

运行后,点一个按钮,界面就会跳一下,并且第二个文本框的数字直接覆盖第一个文本框的数字