📄 calculator.java
字号:
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.InputEvent;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.DataFlavor;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JLabel;
import javax.swing.KeyStroke;
import javax.swing.ImageIcon;
import java.lang.Math;
import java.lang.Double;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
/**
*主类
*/
public class Calculator
{public static void main (String[] agrs)
{new CalculatorFrame();
}
}
/**
*Frame类
*/
class CalculatorFrame extends JFrame
{private static final long serialVersionUID = 1L;
private JPanel contentpane,panela,panelb,panelc,paneld,panele;
private JButton back,c,ac,bsqrt,bpf,bds,bf,b1,b2,b3,b4,b5,b6,b7,b8,b9,b0,bd,bdy,bjia,bjian,bcheng,bchu;
private JTextField text,cacheText;
private JLabel label;
private String show=null;
private String sign="+";
private String CMD=null;
private double ima,last=0,sum,temp=0;
private int suanfa=0;
private boolean result=false;
private boolean error=false;
private boolean deng=false;
private boolean start=true;
private boolean isCMD=false;
private boolean isDOT=false;
private Clipboard clipboard=null;
//private Number_Key number_key = new Number_Key();
/**
*=====数字输入累计函数=====
*/
private void addNumber(String s)
{if (error==false&&isCMD==false)
{if (show==null||text.getText().equals("0")){show=s;}
else {if (show.length()<20) {show=show+s;}}
text.setText(show);
}
}
/**
*=====数字运算函数A=====
*/
private void mathProgressA(String s)
{if (show==null) {sum=0;}
else {sum=Double.valueOf(show).doubleValue();}
isCMD=false;
show=null;
}
/**
*=====数字运算函数B=====
*/
private void mathProgressB(String s)
{if (show!=null) {ima=Double.valueOf(show).doubleValue();last=ima;}
if (start) last=ima;
if (s=="+")
{if (show==null&&deng==true)
{suanfa=1;
if (start) {sum=Double.valueOf(text.getText()).doubleValue();last=sum;sum+=sum;start=false;}
else sum+=last;
}
if (show!=null&&deng!=true)
{if (suanfa==3) temp=0;
suanfa=2;sum+=temp+ima;temp=sum;}
if (show!=null&&deng==true)
{if (suanfa==2) sum+=temp+ima;
else sum+=ima;
suanfa=3;
if (temp!=0) start=false;
else start=true;
temp=sum;}
}
if (s=="-")
{if (show==null&&deng==true)
{suanfa=1;
if (start) {sum=Double.valueOf(text.getText()).doubleValue();last=sum;sum-=sum;start=false;}
else sum-=last;
}
if (show!=null&&deng!=true)
{if (suanfa==3) temp=0;
suanfa=2;sum-=ima;temp=sum;}
if (show!=null&&deng==true)
{sum-=ima;
suanfa=3;
if (temp!=0) start=false;
else start=true;
temp=sum;}
}
if (s=="*")
{if (show==null&&deng==true)
{suanfa=1;
if (start) {sum=Double.valueOf(text.getText()).doubleValue();last=sum;sum*=sum;start=false;}
else sum*=last;
}
if (show!=null&&deng!=true)
{if (suanfa==3) temp=0;
suanfa=2;sum*=ima;temp=sum;}
if (show!=null&&deng==true)
{sum*=ima;
suanfa=3;
if (temp!=0) start=false;
else start=true;
temp=sum;}
}
if (s=="/")
{if (show==null&&deng==true)
{suanfa=1;
if (start) {sum=Double.valueOf(text.getText()).doubleValue();last=sum;sum/=last;start=false;}
else sum/=last;
}
if (show!=null&&deng!=true)
{if (suanfa==3) temp=0;
suanfa=2;sum/=ima;temp=sum;}
if (show!=null&&deng==true)
{sum/=ima;
suanfa=3;
if (temp!=0) start=false;
else start=true;
temp=sum;}
show=""+sum;
}
show=""+sum;
if (sum%1==0) show=show.substring(0,show.length()-2);
if ((suanfa==2||suanfa==3)&&s=="/"&&ima==0||show.equals("Infinity")) {show="Error";error=true;}
text.setText(show);result=true;
if (suanfa==2) {start=false;}
if (suanfa==3) {ima=0;suanfa=0;}
if (isCMD==true) start=true;
show=null;isCMD=false;
if (deng=true) {deng=false;}
}
/**
*=====此函数判断是字符串否是带符号和小数点的数字=====
*/
public boolean isNumeric(String str)
{Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
Pattern pattern2 = Pattern.compile(".*");
Matcher isNum2 = pattern2.matcher(str);
Pattern pattern3 = Pattern.compile("-*");
Matcher isNum3 = pattern3.matcher(str);
if (isNum.matches()||isNum2.matches()||isNum3.matches()) return true;
else return false;
}
/**
*包含显示屏的容器a
*/
private JPanel getPanela()
{panela=new JPanel();
text=new JTextField("0",21);
text.setEditable(false);
text.setHorizontalAlignment(JTextField.RIGHT);
panela.add(text);
return panela;
}
/**
*包含存储空间,退格和清0按钮的容器e
*/
private JPanel getPanele()
{panele=new JPanel();
panele.setLayout(new GridLayout(1,4,6,4));
cacheText=new JTextField("存数区域");
cacheText.setFont(cacheText.getFont().deriveFont(Font.BOLD));
/**
*退格键
*/
back=new JButton("←");
back.addActionListener
(new java.awt.event.ActionListener()
{public void actionPerformed(java.awt.event.ActionEvent e)
{if (isCMD==false&&error==false&&result==false)
{if (show==null) {show="0";}
if (show.length()==1&&sign=="+"||show.length()==2&&sign=="-") {show="0";}
else {show=show.substring(0,show.length()-1);}
if (show.substring(show.length()-1,show.length()).equals(".")) {show=""+show.substring(0,show.length()-1);}
text.setText(show);
}
}
}
);
/* 当前数清0 */
c=new JButton("C");
c.addActionListener
(new java.awt.event.ActionListener()
{public void actionPerformed(java.awt.event.ActionEvent e)
{show=null;sign="+";error=false;isDOT=false;
text.setText("0");
}
}
);
/* 全体清0 */
ac=new JButton("AC");
ac.addActionListener
(new java.awt.event.ActionListener()
{public void actionPerformed(java.awt.event.ActionEvent e)
{show=null;sign="+";error=false;isCMD=false;isDOT=false;last=0;ima=0;CMD=null;sum=0;start=true;result=false;temp=0;suanfa=0;
text.setText("0");
}
}
);
/*上端按纽组加完*/
panele.add(cacheText);
panele.add(back);
panele.add(c);
panele.add(ac);
return panele;
}
private JPanel getPaneld()
{/*包含根号,平方,倒数,正负号的容器*/
paneld=new JPanel();
paneld.setLayout(new GridLayout(4,1,4,4));
/*根号*/
bsqrt=new JButton("sqrt");
bsqrt.addActionListener
(new java.awt.event.ActionListener()
{public void actionPerformed(java.awt.event.ActionEvent e)
{if(error==false)
{ima=Double.valueOf(text.getText()).doubleValue();
if (ima==0) {text.setText("0");isCMD=true;}
else {if (ima<0){text.setText("Error");error=true;isCMD=true;}
else {isCMD=true;ima=Math.sqrt(ima);
show=""+ima;
if (ima%1==0) show=show.substring(0,show.length()-2);
text.setText(show);
}
}
if (ima==0) isCMD=false;
}
deng=true;
}
}
);
/*平方*/
bpf=new JButton("x×x");
bpf.addActionListener
(new java.awt.event.ActionListener()
{public void actionPerformed(java.awt.event.ActionEvent e)
{if(error==false)
{ima=Double.valueOf(text.getText()).doubleValue();
if (ima==0) {text.setText("0");isCMD=true;}
else {isCMD=true;ima*=ima;
show=""+ima;
if (ima%1==0) show=show.substring(0,show.length()-2);
text.setText(show);
}
if (ima==0) isCMD=false;
}
deng=true;
}
}
);
/*倒数*/
bds=new JButton("1/x");
bds.addActionListener
(new java.awt.event.ActionListener()
{public void actionPerformed(java.awt.event.ActionEvent e)
{if(error==false)
{ima=Double.valueOf(text.getText()).doubleValue();
if (ima==0) {text.setText("Error");error=true;isCMD=true;}
else {isCMD=true;ima=1/ima;
show=""+ima;
if (ima%1==0) show=show.substring(0,show.length()-2);
text.setText(show);
}
}
deng=true;
}
}
);
/*正负号*/
bf=new JButton("+/-");
bf.addActionListener
(new java.awt.event.ActionListener()
{public void actionPerformed(java.awt.event.ActionEvent e)
{show=text.getText();
if (!show.equals("0")&&show!=null&&error==false)
{if (Double.valueOf(show).doubleValue()>=0) {sign="-";show="-"+show;}
else {if (sign=="-"||Double.valueOf(show).doubleValue()<=0) {sign="+";show=show.substring(1,show.length());}}
text.setText(show);
}
deng=true;
}
}
);
/*左端按纽组加完*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -