package Calculator;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Calculatorface extends JFrame {
private JTextField textField;//单行文本输入框
private ActionListener myListener;//监听机//表面
public Calculatorface(){setTitle("计算器");// 设置名字setSize(400,400);// 设置大小setLocationRelativeTo(null);// 设置位置为居中setResizable(false);// 设置为大小不可变setDefaultCloseOperation(EXIT_ON_CLOSE);// 可以退出
Container container =getContentPane();// 新建一个容器
container.setLayout(new BorderLayout(5,5));// 设置左右间距为5像素
JPanel panelall = new JPanel();// 设置总体大面板
JPanel panel = new JPanel();//设置下方小面板
JPanel panel1 = new JPanel();//设置下方小面板1
JPanel panel2 = new JPanel();//设置下方小面板2
container.add(panelall);// 把大面板放到容器上
panelall.setLayout(new BorderLayout(5,5));// 设置为边界布局
panel.setLayout(new BorderLayout(5,5));// 设置为边界布局
textField = new JTextField();// 文本框设置
textField.setFont(new Font("宋体", Font.PLAIN,20));//格式
textField.setEditable(false);// 不可修改
textField.setHorizontalAlignment (JTextField.RIGHT);//设置输出右对齐
panelall.add(textField, BorderLayout.NORTH);// 将文本框放到北面
JButton btnback =useButton("Back");//退格
JButton btnce =useButton("CE");//清零
btnback.setFont(new Font("微软雅黑",Font.PLAIN,24));//设置相关字体
btnce.setFont(new Font("微软雅黑",Font.PLAIN,24));
panel1.add(btnback,BorderLayout.NORTH);//加到小面板1
panel1.add(btnce,BorderLayout.NORTH);
panel1.setLayout(new GridLayout(1,2,3,3));//网格布局
String[] titles ={"7","8","9","/","4","5","6","*","1","2","3","-","0","~+/-",".","+","l/x","%","sqrt","="};//数字计算
panel2.setLayout(new GridLayout(5,4,3,3));//网格布局for(int i =0; i < titles.length; i++){
JButton btnNum =useButton(titles[i]);
btnNum.setFont(new Font("微软雅黑",Font.PLAIN,24));
panel2.add(btnNum);}//都加到小面板2上去
panel.add("North",panel1);//back ce 加到小面板北面
panel.add("Center",panel2);//数字计算加到小面板 南面
panelall.add("Center",panel);//把小面板加到大面板中心位置}//监听
public JButton useButton (final String titles){// String.valueof(x) 返回x的字符串表示
JButton button = new JButton(String.valueOf(titles));if(myListener == null){
myListener = new ActionListener(){
public voidactionPerformed(ActionEvent event){
String btnInformation = event.getActionCommand();char key2 = btnInformation.charAt(0);//目的是使用switch case action(key2);}};}
button.addActionListener(myListener);return button;}//计算int len;// 输入长度
String a, b, value;// 第一个输入的,第二个输入的, 结果char exit ='0';// 保证 = 有意义char op ='n';
boolean flag = false;// flag 为true的时候进行前面的字符串的清空,后面的第一个字符的输入// flag 为false的时候进行后面的字符串的输入
private voidaction(char key2){
String text;switch(key2){case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':case'0'://输入数字if(flag){
textField.setText("");//清零
textField.setText(String.valueOf(key2));//输入key2
flag = false;//继续输入}else{
text = textField.getText()+ key2;//接前面的输入
textField.setText(text);//设置新的字符串
text ="";//清空text }break;case'.'://小数点if("".equals(textField.getText()))//如果前面的字符串为空break;// 第一个元素不能为. if(!"".equals(textField.getText())){// 不为空
text = textField.getText();//得到当前字符串
len = text.length();int i =0;for(; i<len; i++){if('.'== text.charAt(i))break;}if(i<len)break;// 确认字符串中是否已经存在.
text = textField.getText()+ key2;
textField.setText(text);//新的字符串
text ="";}break;case'+':if(!"".equals(textField.getText())){if('n'== op){
a = textField.getText();
op ='+';
flag = true;}else{
b = textField.getText();calculation(a, b);
a = value;//可以继续运算
textField.setText(value);
op ='+';
flag = true;}
exit ='1';}break;case'-':if(!"".equals(textField.getText())){if('n'== op){
a = textField.getText();
op ='-';
flag = true;}else{
b = textField.getText();calculation(a, b);
a = value;
textField.setText(value);
op ='-';
flag = true;}
exit ='1';}break;case'*':if(!"".equals(textField.getText())){if('n'== op){
a = textField.getText();
op ='*';
flag = true;}else{
b = textField.getText();calculation(a, b);
a = value;
textField.setText(value);
op ='*';
flag = true;}
exit ='1';}break;case'/':if(!"".equals(textField.getText())){if('n'== op){
a = textField.getText();
op ='/';
flag = true;}else{
b = textField.getText();calculation(a, b);
a = value;
textField.setText(value);
op ='/';
flag = true;}
exit ='1';}break;case'%'://取余if(!"".equals(textField.getText())){if('n'== op){
a = textField.getText();
op ='%';
flag = true;}else{
b = textField.getText();calculation(a, b);
a = value;
textField.setText(value);
op ='%';
flag = true;}
exit ='1';}break;case'l'://倒数 if(!"".equals(textField.getText())){
text = textField.getText();
text = String.valueOf(1/Float.parseFloat(text));
textField.setText(text);
text="";}break;case's'://根号if(!"".equals(textField.getText())){
text = textField.getText();
text = String.valueOf(Math.sqrt(Float.parseFloat(text)));
textField.setText(text);
text="";}break;case'~'://正负数if(!"".equals(textField.getText())){
text = textField.getText();
text = String.valueOf((-1)*Float.parseFloat(text));
textField.setText(text);
text="";}break;case'B'://退格
text = textField.getText();if(!"".equals(text)){
len = text.length();
text = text.substring(0, len-1);
textField.setText(text);}
text="";break;case'C'://清零
textField.setText("");break;case'='://等于if('0'== exit){
textField.setText("");break;}if("".equals(textField.getText()))// 排除 7*= 7+= 之类错误break;
b = textField.getText();calculation(a, b);
textField.setText(String.valueOf(value));break;}}//两个数的计算
private voidcalculation(String a, String b){double v1 = Double.parseDouble(a);double v2 = Double.parseDouble(b);double v=0;switch(op){case'+':
v = v1 + v2;
exit ='0';
a = b = null;
op ='n';break;case'-':
v = v1 - v2;
exit ='0';
a = b = null;
op ='n';break;case'*':
v =(v1)*(v2);
exit ='0';
a = b = null;
op ='n';break;case'/':if(v2==0)break;
v = v1 / v2;
exit ='0';
a = b = null;
op ='n';break;case'%':if(v2==0)break;
v = v1 % v2;
exit ='0';
a = b = null;
op ='n';break;}
value = String.valueOf(v);}//main
public staticvoidmain(String[] args){
new Calculatorface().setVisible(true);}}