以下代码是为应付本学期的Java期末大作业,而赶出来的,通过借鉴博主Henry_626的代码,用Java实现仿win10计算器,相比Henry_626的第一代版本,在一些细节上增加对win10计算器的还原度,如增加运算过程的文本显示,小数位数的处理等细节;并在大作业题要求的基础上,增加cos sin 指数运算和阶乘运算


packagedemo1;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.text.DecimalFormat;importjava.math.BigInteger;importjava.math.BigDecimal;publicclassCalculatorimplementsActionListener{privateJFrame frame=newJFrame();privateString[] keys={"%","CE","C","←","n!","aⁿ","cos","sin","1⁄x","x²","√x","÷","7","8","9","×","4","5","6","-","1","2","3","+","+/-","0",".","="};privateJButton button[]=newJButton[keys.length];privateJTextField resultText=newJTextField("0");privateJTextField processText=newJTextField();privateboolean firstDigit=true;privatedouble resultNum=0.0000;privateString operator="=";privateboolean operateValidFlag=true;char charA;publicCalculator(){init();
frame.setTitle("计算器(纯原版)");
frame.setSize(350,550);
frame.setLocation(500,300);
frame.setResizable(true);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}privatevoidinit(){Color color1=newColor(181,181,181);Color color2=newColor(126,192,238);Color color3=newColor(232,232,232);JPanel resultTextPanel=newJPanel();
resultTextPanel.setLayout(newBorderLayout());
resultTextPanel.setSize(400,50);
resultTextPanel.add(resultText);
resultText.setFont(newFont("黑体",Font.BOLD,55));
resultText.setHorizontalAlignment(JTextField.RIGHT);
resultText.setEditable(false);
resultText.setBorder(null);
resultText.setBackground(color1);JPanel processTextPanel=newJPanel();
processTextPanel.setLayout(newBorderLayout());
processTextPanel.setSize(400,50);
processTextPanel.add(processText);
processText.setFont(newFont("黑体",Font.PLAIN,25));
processText.setHorizontalAlignment(JTextField.RIGHT);
processText.setEditable(false);
processText.setBorder(null);
processText.setBackground(color1);JPanel keysPanel=newJPanel();
keysPanel.setLayout(newGridLayout(7,4,2,2));for(int i=0; i<12; i++){
button[i]=newJButton(keys[i]);Dimension preferredSize=newDimension(95,50);
button[i].setPreferredSize(preferredSize);
keysPanel.add(button[i]);
button[i].setBackground(color3);
button[i].setForeground(Color.black);
button[i].setFont(newFont(Font.SERIF,Font.PLAIN,18));if(i==11|| i==3) button[i].setFont(newFont(Font.SERIF,Font.PLAIN,30));if(i==1|| i==2) button[i].setFont(newFont("黑体",Font.PLAIN,18));
button[i].setBorderPainted(false);}for(int i=12; i< keys.length; i++){
button[i]=newJButton(keys[i]);Dimension preferredSize=newDimension(95,50);
button[i].setPreferredSize(preferredSize);
keysPanel.add(button[i]);if((i+1)%4==0){
button[i].setBackground(color3);
button[i].setFont(newFont(Font.SERIF,Font.PLAIN,30));}else{
button[i].setBackground(Color.white);
button[i].setFont(newFont("黑体",Font.BOLD,20));}if(i==19) button[i].setFont(newFont(Font.SERIF,Font.PLAIN,18));
button[i].setForeground(Color.black);
button[i].setBorderPainted(false);}
button[27].setBackground(color2);
keysPanel.setBackground(color1);
frame.getContentPane().add("North", processTextPanel);
frame.getContentPane().add("Center", resultTextPanel);
frame.getContentPane().add("South", keysPanel);
processTextPanel.setBorder(BorderFactory.createMatteBorder(25,3,0,3, color1));
resultTextPanel.setBorder(BorderFactory.createMatteBorder(0,3,5,3, color1));
keysPanel.setBorder(BorderFactory.createMatteBorder(5,3,5,3, color1));for(int i=0; i< keys.length; i++){
button[i].addActionListener(this);}}publicvoidactionPerformed(ActionEvent ev){String command= ev.getActionCommand();if(command.equals(keys[3]))doBackspace();elseif(command.equals(keys[1])) resultText.setText("0");elseif(command.equals(keys[2]))doC();elseif("0123456789.".indexOf(command)>=0)doNumber(command);elseif(command.equals(keys[0])|| command.equals(keys[4])|| command.equals(keys[6])|| command.equals(keys[7])|| command.equals(keys[8])|| command.equals(keys[9])|| command.equals(keys[10])|| command.equals(keys[24]))doOperator1(command);elsedoOperator2(command);}privatevoiddoBackspace(){String text= resultText.getText();int i= text.length();if(i>0){
text= text.substring(0, i-1);if(text.length()==0){
resultText.setText("0");
firstDigit=true;
operator="=";}else{
resultText.setText(text);}}}privatevoiddoC(){
processText.setText(null);
resultText.setText("0");
firstDigit=true;
operator="=";}privatevoiddoNumber(String key){if(firstDigit){
resultText.setText(null);
resultText.setText(key);}elseif((key.equals("."))&&(resultText.getText().indexOf(".")<0)){
resultText.setText(resultText.getText()+".");}elseif(!key.equals(".")){
resultText.setText(resultText.getText()+ key);}
firstDigit=false;}privatevoiddoOperator1(String key){
operator= key;if(operator.equals("1⁄x")){if(resultNum==0){
operateValidFlag=false;
resultText.setText("除数不能为零");}else{
resultNum=1/getNumberFromText();
processText.setText("1/("+ resultText.getText()+")");}}elseif(operator.equals("√x")){if(resultNum<0){
operateValidFlag=false;
resultText.setText("无效输入");}else{
resultNum=Math.sqrt(getNumberFromText());
processText.setText("√("+ resultText.getText()+")");}}elseif(operator.equals("x²")){
resultNum=getNumberFromText()*getNumberFromText();
processText.setText("sqr("+ resultText.getText()+")");}elseif(operator.equals("%")){
resultNum=getNumberFromText()/100;}elseif(operator.equals("n!")){BigInteger num=newBigInteger("1");BigInteger flat=newBigInteger("1");for(