科学计算器源代码package two;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.io.*;import java.util.*;public class calculator implements ActionListener { int count = 0;private static int a;JFrame frame = new JFrame("计算器");JTextArea area = new JTextArea();JTextField fieldshow = new JTextField("0");JTextField fieldcalculator = new JTextField();JPanel leftpanel = new JPanel();JPanel rightpanel = new JPanel();JPanel buttonpanel = new JPanel();JPanel motionpanel = new JPanel();JButton button1 = new JButton("1");JButton button2 = new JButton("2");JButton button3 = new JButton("3");JButton button4 = new JButton("+");JButton button5 = new JButton("c");JButton button6 = new JButton("4");JButton button7 = new JButton("5");JButton button8 = new JButton("6");JButton button9 = new JButton("-");JButton button10 = new JButton("退格");JButton button11 = new JButton("7");JButton button12 = new JButton("8");JButton button13 = new JButton("9");JButton button14 = new JButton("*");JButton button15 = new JButton("sin");JButton button16 = new JButton("0");JButton button17 = new JButton("+/-");JButton button18 = new JButton(".");JButton button19 = new JButton("/");JButton button20 = new JButton("=");JButton button21 = new JButton("保存");JButton button22 = new JButton("复制");JButton button23 = new JButton("清除");StringBuffer S = new StringBuffer("");// t用来记录前一个运算符号是+ - * / =中的哪一个char t;// count用来实现运算符号计数,a用来识别退格、正负号操作前一个操作是否是运算符号+ - * / sin =// int count = 0, a = 0;Double x1, x2 = 0d, result;public static void main(String a[]) {calculator that = new calculator();that.go();}void go() {leftpanel.setLayout(new BorderLayout());leftpanel.add(fieldshow, BorderLayout.NORTH);leftpanel.add(buttonpanel, BorderLayout.CENTER);buttonpanel.setLayout(new GridLayout(4, 5));buttonpanel.add(button1);buttonpanel.add(button2);buttonpanel.add(button3);buttonpanel.add(button4);buttonpanel.add(button5);buttonpanel.add(button6);buttonpanel.add(button7);buttonpanel.add(button8);buttonpanel.add(button9);buttonpanel.add(button10);buttonpanel.add(button11);buttonpanel.add(button12);buttonpanel.add(button13);buttonpanel.add(button14);buttonpanel.add(button15);buttonpanel.add(button16);buttonpanel.add(button17);buttonpanel.add(button18);buttonpanel.add(button19);buttonpanel.add(button20);button1.addActionListener(this);// 事件监听button2.addActionListener(this);button3.addActionListener(this);button4.addActionListener(this);button5.addActionListener(this);button6.addActionListener(this);button7.addActionListener(this);button8.addActionListener(this);button9.addActionListener(this);button10.addActionListener(this);button11.addActionListener(this);button12.addActionListener(this);button13.addActionListener(this);button14.addActionListener(this);button15.addActionListener(this);button16.addActionListener(this);button17.addActionListener(this);button18.addActionListener(this);button19.addActionListener(this);button20.addActionListener(this);button21.addActionListener(this);button22.addActionListener(this);button23.addActionListener(this);rightpanel.setLayout(new BorderLayout()); rightpanel.add(fieldcalculator, BorderLayout.NORTH); rightpanel.add(area, BorderLayout.CENTER); rightpanel.add(motionpanel, BorderLayout.SOUTH); motionpanel.add(button21);motionpanel.add(button22);motionpanel.add(button23);Container con = frame.getContentPane();frame.setLayout(new GridLayout(1, 2));con.add(leftpanel);con.add(rightpanel);frame.setBounds(200, 200, 600, 300);frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.addWindowListener(new WindowListener() {// 关闭程序时弹出警告public void windowClosing(WindowEvent e) {int result = JOptionPane.showConfirmDialog(frame, "确实要关闭程序吗?","警告",JOptionPane.OK_CANCEL_OPTION);if (result == JOptionPane.OK_CANCEL_OPTION) {System.exit(0);} else {}}public void windowOpened(WindowEvent e) {}public void windowIconified(WindowEvent e) {}public void windowDeiconified(WindowEvent e) {}public void windowDeactivated(WindowEvent e) {}public void windowClosed(WindowEvent e) {}public void windowActivated(WindowEvent e) {}});}public void actionPerformed(ActionEvent e) {// 0123456789等按钮if (e.getSource() == button1 || e.getSource() == button2|| e.getSource() == button3 || e.getSource() == button6|| e.getSource() == button7 || e.getSource() == button8|| e.getSource() == button11 || e.getSource() == button12|| e.getSource() == button13 || e.getSource() == button16) {a = 0;if (count == 0) {S.append(e.getActionCommand());fieldshow.setText(S.toString());x1 = Double.parseDouble(fieldshow.getText());} else if (count >= 1) {S.append(e.getActionCommand());fieldshow.setText(S.toString());x2 = Double.parseDouble(fieldshow.getText());}}// 小数点的容错性if (e.getSource() == button18)// 单击"."按钮输入小数{a = 0;if (fieldshow.getText().trim().indexOf(".") != -1)// 判断字符串中是否已经包含了小数点{} else// 如果没有小数点{if (fieldshow.getText().trim().equals("0"))// 如果初时显示为0{S.setLength(0);fieldshow.setText((S.append("0" +e.getActionCommand())).toString());} else if (fieldshow.getText().trim().equals(""))// 如果初时显示为空则不做任何操作{} else {fieldshow.setText(S.append(e.getActionCommand()).toString());}}}// 运算符号 + - * /if (e.getSource() == button4 || e.getSource() == button9|| e.getSource() == button14 || e.getSource() ==button19) {count++;a = 1;S.setLength(0);if (e.getSource() == button4)// +法{switch (t) {case '+':result = x1 + x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "+" + x2 + "=" + result);area.append(x1 + "+" + x2 + "=" + result + "\n");break;case '-':result = x1 - x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "+" + x2 + "=" + result);area.append(x1 + "-" + x2 + "=" + result + "\n");break;case '*':result = x1 * x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "+" + x2 + "=" + result);area.append(x1 + "*" + x2 + "=" + result + "\n");break;case '/':if (x2 == 0)fieldshow.setText("除数不能为零");else {result = x1 / x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "+" + x2 + "=" + result);area.append(x1 + "/" + x2 + "=" + result + "\n");}break;case '=':default:}if (count <= 1) {} else if (count >= 2) {x1 = result;}t = '+';}if (e.getSource() == button9)// -法{switch (t) {case '+':result = x1 + x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "+" + x2 + "=" + result);area.append(x1 + "+" + x2 + "=" + result + "\n");break;case '-':result = x1 - x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "-" + x2 + "=" + result);area.append(x1 + "-" + x2 + "=" + result + "\n");break;case '*':result = x1 * x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "*" + x2 + "=" + result);area.append(x1 + "*" + x2 + "=" + result + "\n");break;case '/':if (x2 == 0)fieldshow.setText("除数不能为零");else {result = x1 / x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "/" + x2 + "=" + result);area.append(x1 + "/" + x2 + "=" + result + "\n");}break;case '=':default:}if (count <= 1) {} else if (count >= 2) {x1 = result;}t = '-';}if (e.getSource() == button14)// *法{switch (t) {case '+':result = x1 + x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "+" + x2 + "=" + result);area.append(x1 + "+" + x2 + "=" + result + "\n");break;case '-':result = x1 - x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "-" + x2 + "=" + result);area.append(x1 + "-" + x2 + "=" + result + "\n");break;case '*':result = x1 * x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "*" + x2 + "=" + result);area.append(x1 + "*" + x2 + "=" + result + "\n");break;case '/':if (x2 == 0)fieldshow.setText("除数不能为零");else {result = x1 / x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "/" + x2 + "=" + result);area.append(x1 + "/" + x2 + "=" + result + "\n");}break;case '=':default:}if (count <= 1) {} else if (count >= 2) {x1 = result;}t = '*';}if (e.getSource() == button19)// /法{switch (t) {case '+':result = x1 + x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "+" + x2 + "=" + result);area.append(x1 + "+" + x2 + "=" + result + "\n");break;case '-':result = x1 - x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "-" + x2 + "=" + result);area.append(x1 + "-" + x2 + "=" + result + "\n");break;case '*':result = x1 * x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "*" + x2 + "=" + result);area.append(x1 + "*" + x2 + "=" + result + "\n");break;case '/':if (x2 == 0)fieldshow.setText("除数不能为零");else {result = x1 / x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "/" + x2 + "=" + result);area.append(x1 + "/" + x2 + "=" + result + "\n");}break;case '=':default:}if (count <= 1) {} else if (count >= 2) {x1 = result;}t = '/';}}// 清零操作if (e.getSource() == button5) {fieldshow.setText("0");// 把显示屏清零count = 0;a = 0;t = ' ';x1 = 0d;x2 = 0d;S.setLength(0);// 清空字符串缓冲区以准备接收新的输入运算数}// 退格操作if (e.getSource() == button10) {if (a == 1) {// 判断前一个操作是否是运算符号和等于操作System.out.println("运算符号不能退格!");} else {if (!fieldshow.getText().trim().equals("0"))// 如果显示屏显示的不是零{if (S.length() != 1) {// 可能抛出字符串越界异常fieldshow.setText(S.delete(S.length() - 1, S.length()).toString());} else {fieldshow.setText("0");S.setLength(0);}}}if (count == 0) {x1 = Double.parseDouble(fieldshow.getText().trim());} else if (count >= 1) {x2 = Double.parseDouble(fieldshow.getText().trim());}}// 求正弦值操作实现运算过程中正弦值的优先性if (e.getSource() == button15) {a = 1;if (count == 0) {if (S.length() == 0) {// 第一个按键不能为sinfieldshow.setText("先输入数字");} else {result = Math.sin(x1);fieldshow.setText(result.toString());fieldcalculator.setText("sin(" + x1 + ")" + "=" + result);area.append("sin(" + x1 + ")" + "=" + result + "\n");x1 = result;// 将正弦值求出来赋值给x1}}if (count >= 1) {result = Math.sin(x2);fieldcalculator.setText("sin(" + x2 + ")" + "=" + result);area.append("sin(" + x2 + ")" + "=" + result + "\n");x2 = result;// 将正弦值求出来赋值给x2}S.setLength(0);}// 正负值操作if (e.getSource() == button17) {if (a == 1) {// 判断前一个操作是否是运算符号和等于操作} else {if (count == 0) {x1 =Double.parseDouble(fieldshow.getText().trim());fieldshow.setText("" + (-x1));x1 = -x1;} else if (count >= 1) {x2 =Double.parseDouble(fieldshow.getText().trim());fieldshow.setText("" + (-x2));x2 = -x2;}}}// 等于号操作if (e.getSource() == button20) {switch (t) {case '+':result = x1 + x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "+" + x2 + "=" + result);area.append(x1 + "+" + x2 + "=" + result + "\n");break;case '-':result = x1 - x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "-" + x2 + "=" + result);area.append(x1 + "-" + x2 + "=" + result + "\n");break;case '*':result = x1 * x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "*" + x2 + "=" + result);area.append(x1 + "*" + x2 + "=" + result + "\n");break;case '/':if (x2 == 0)fieldshow.setText("除数不能为零");else {result = x1 / x2;fieldshow.setText(result.toString());fieldcalculator.setText(x1 + "/" + x2 + "=" + result);area.append(x1 + "/" + x2 + "=" + result + "\n");}break;case '=':default:}x1 = x2 = 0d;count = 0;a = 1;t = '=';S.setLength(0);}// 保存操作if (e.getSource() == button21) {JFileChooser jf = new JFileChooser();// 实例化文件选择器JTextField jt = new JTextField();Calendar ca = Calendar.getInstance();int year = ca.get(Calendar.YEAR);// 获取年份int month = ca.get(Calendar.MONTH);// 获取月份int day = ca.get(Calendar.DATE);// 获取日int minute = ca.get(Calendar.MINUTE);// 分int hour = ca.get(Calendar.HOUR);// 小时int second = ca.get(Calendar.SECOND);// 秒int select = jf.showSaveDialog(frame);// 显示对话框if (select == JFileChooser.APPROVE_OPTION) {// 单击保存按钮File file = jf.getSelectedFile();// 得到选择的文件try {Writer out = null;out = new FileWriter(jf.getSelectedFile());// 输出流String str = area.getText() + " 时间:" + year + "-"+ month + "-" + day + "\n" + hour + ":" + minute+ ":" + second;out.write(str);out.close();} catch (FileNotFoundException e1) {e1.printStackTrace();System.out.println(" jshdfj");} catch (IOException e2) {e2.printStackTrace();System.out.println(" jshdfjjkdfh");}jt.setText("saving:" + file.getName());} else if (select == JFileChooser.CANCEL_OPTION// 单击取消按钮或者关闭文件窗口操作|| select == JFileChooser.ERROR_OPTION) {jt.setText("Save command cancel by user");// System.out.println("关闭");}// try {// FileOutputStream out = new FileOutputStream(// jf.getSelectedFile());//输出流//// byte byt[] = new byte[10000];// byt = (area.getText() + " 时间:" + year + "-" + month + "-" +// day// + " " + hour + ":" + minute + ":" + second).getBytes();// out.write(byt);// } catch (FileNotFoundException e1) {// e1.printStackTrace();// System.out.println(" jshdfj");// } catch (IOException e2) {// e2.printStackTrace();// System.out.println(" jshdfjjkdfh");// }}// 复制操作if (e.getSource() == button22) {area.selectAll();area.copy();area.select(0, 0);JDialog dialog = new JDialog(frame, "复制", true);Font font = new Font("宋体", Font.BOLD + Font.ITALIC, 34);JTextField JtextField = new JTextField("文字已复制成功");dialog.getContentPane().add(JtextField);JtextField.setFont(font);dialog.setLocation(500, 250);dialog.setSize(300, 200);dialog.setVisible(true);}// 清除操作if (e.getSource() == button23) {area.setText(null);}}}。