java计算器(Swing绘制界面)

来源:互联网 发布:防网络诈骗四格漫画 编辑:程序博客网 时间:2024/05/17 03:34
package calcTool;


import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class CalcFrame implements ActionListener {
private JFrame jFrame;
private JPanel jPanel;
private JButton button1;
private JButton button2;
private JButton button3;
private JButton button4;
private JButton button5;
private JButton button6;
private JButton button7;
private JButton button8;
private JButton button9;
private JButton button0;
private JButton buttona;
private JButton buttonb;
private JButton buttonc;
private JButton buttond;
private JButton buttone;
private JButton buttonf;
private JTextField textField;


//参考模式 :A 运算符a B 运算符b (1+11+  显示  :12+ )  

private String strVal;  //接受数字用的临时变量
private String cflag;   //连续输入多个运算符的时用的控制变量
private String equflag = "0";  //多次输入等号的时候用的控制变量(运算符号发生过一次变化)
private String equflag1 = "0";  //多次输入等号的时候用的控制变量(运算符号没有发生变化)
private String strVaDisp;  //显示用的变量
private String calcValA;  //运算数A
private String calcValB;  //运算数B
private String calcValBTemp; //多次输入等号的时候,保存临时变量用
private String optionFlagA; //操作符A
private String optionFlagB; //操作符B


public void menuFrame() {
if (jFrame == null) {
jFrame = new JFrame("计算器");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textField = new JTextField();
textField.setSize(240, 60);
textField.setHorizontalAlignment(JTextField.RIGHT);
jFrame.setLayout(new BorderLayout(5, 5));
jFrame.add(textField, BorderLayout.NORTH);


jPanel = new JPanel();
jPanel.setLayout(new GridLayout(4, 4, 5, 5));


button1 = new JButton("1");
button1.setSize(60, 60);
button1.addActionListener(this);
jPanel.add(button1);


button2 = new JButton("2");
button2.setSize(60, 60);
button2.addActionListener(this);
jPanel.add(button2);


button3 = new JButton("3");
button3.setSize(60, 60);
button3.addActionListener(this);
jPanel.add(button3);


buttona = new JButton("+");
buttona.setSize(60, 60);
buttona.addActionListener(this);
jPanel.add(buttona);


button4 = new JButton("4");
button4.setSize(60, 60);
button4.addActionListener(this);
jPanel.add(button4);


button5 = new JButton("5");
button5.setSize(60, 60);
button5.addActionListener(this);
jPanel.add(button5);


button6 = new JButton("6");
button6.setSize(60, 60);
button6.addActionListener(this);
jPanel.add(button6);


buttonb = new JButton("-");
buttonb.setSize(60, 60);
buttonb.addActionListener(this);
jPanel.add(buttonb);


button7 = new JButton("7");
button7.setSize(60, 60);
button7.addActionListener(this);
jPanel.add(button7);


button8 = new JButton("8");
button8.setSize(60, 60);
button8.addActionListener(this);
jPanel.add(button8);


button9 = new JButton("9");
button9.setSize(60, 60);
button9.addActionListener(this);
jPanel.add(button9);


buttonc = new JButton("*");
buttonc.setSize(60, 60);
buttonc.addActionListener(this);
jPanel.add(buttonc);


button0 = new JButton("0");
button0.setSize(60, 60);
button0.addActionListener(this);
jPanel.add(button0);


buttone = new JButton(".");
buttone.setSize(60, 60);
buttone.addActionListener(this);
jPanel.add(buttone);


buttonf = new JButton("=");
buttonf.setSize(60, 60);
buttonf.addActionListener(this);
jPanel.add(buttonf);


buttond = new JButton("/");
buttond.setSize(60, 60);
buttond.addActionListener(this);
jPanel.add(buttond);


jFrame.add(jPanel, BorderLayout.CENTER);
jFrame.pack();
jFrame.setResizable(false);
;


jFrame.setVisible(true);


}
}


public void actionPerformed(ActionEvent e)
{
System.out.println(e.getActionCommand());
//获取输入的数字,并赋值给显示用的变量
if(isNumeric(e.getActionCommand()))
{
if(strVal != null)
{
strVal = strVal + e.getActionCommand();
}
else
{
strVal = e.getActionCommand();
}
if(calcValA == null)
{
strVaDisp = strVal;
}
else
{
//多次输入等号后再次输入运算数的处理
if(equflag == "1" || equflag1 == "1")
{
strVaDisp = strVal;
equflag = "0";
strVal = null;
}
else
{
strVaDisp = calcValA + optionFlagA + strVal; 
}


}
//输入的是等号时
}else if(e.getActionCommand() == "=")
{
//当输入的算式是这样样式(A 运算符)时:再次输入等号做一下处理。
if(calcValA != null && optionFlagA != null && strVal == null)
{
//多次连续输入等号的处理,如果运算符发生变化时,将运算数calcValB改为当前的A,再此连续的运算
if(equflag == "0" && equflag1 == "0")
{
calcValBTemp = calcValA;
equflag = "1";
}
calcValB = calcValBTemp;
calcValA = clac();
strVaDisp = calcValA;
calcValB = null;
strVal = null;
}
//两个运算数和一个运算符都已经正常获取后,再次输入了等号的处理,没有清空optionFlagA是为了连续再次输入等号用,
//实现连续的运算
if(calcValA != null && optionFlagA != null && strVal != null)
{
//除数为0的处理
if(optionFlagA == "/" && strVal == "0")
{
calcValA = null;  //清空运算数A
optionFlagA = null; //清空运算符a
strVaDisp = "除数为零重新输入!";  //显示信息赋值
}
else
{
equflag1 = "1";
calcValBTemp = strVal;
calcValB = strVal;
calcValA = clac();
strVaDisp = calcValA;
calcValB = null;
strVal = null;
}


}

}
else
{
//多次输入等号的时候,控制运算数calcValB的变化的变量
equflag = "0";
equflag1 = "0";

if(strVal == null)
{
// 开始就输入运算符的情况,做strVal = "0";
strVal = "0";
// 连续输入多个运算符的情况,cflag = "1"
cflag = "1";
}
//第一次输入运算符的处理
if(calcValB == null && optionFlagA == null)
{
optionFlagA = e.getActionCommand();
strVaDisp = strVal + optionFlagA;
}
else
{
//连续输入多个运算符的时候运算符的处理
if(calcValA != null && optionFlagA != null && cflag == "1")
{
optionFlagA = e.getActionCommand();
strVaDisp = calcValA + optionFlagA;
cflag = "0";
}
else
//输入第二个运算数后再次输入的运算符的处理
{
optionFlagB = e.getActionCommand();
strVaDisp = strVal + optionFlagB;
System.out.println("optionFlagB set ");
}
}
//将接受的运算数分别赋值给相应的变量方便调用共通方法
if(calcValA != null && calcValB == null && optionFlagB != null)
{
calcValB = strVal;
}
else if(calcValA == null)
{
calcValA = strVal;
}
strVal = null;  //清空接受运算数的变量

//如果有两个运算数都不为空的时候的处理
if(calcValA != null && calcValB != null)
{


//除数为0的处理
if(optionFlagA == "/" && calcValB == "0")
{
calcValA = null;  //清空运算数A
optionFlagA = null; //清空运算符a
strVaDisp = "除数为零重新输入!";  //显示信息赋值
}
else
//两个运算数都正常调用运算方法,并将结果返回给第一个运算数,将第二次接受的运算符b赋值给运算符a
{
calcValA = clac();
optionFlagA = optionFlagB;
strVaDisp = calcValA + optionFlagA;
}
calcValB = null;   //清空运算数B
optionFlagB = null;  //清空运算符b
}


}
textField.setText(strVaDisp);  //显示相应的信息
}


//加减乘除运算方法
public String clac() {

double A = Double.parseDouble(calcValA);
double B = Double.parseDouble(calcValB);
double calcALL;

if(optionFlagA == "+")
{
calcALL = A + B;
}
else if(optionFlagA == "-") 
{
calcALL = A - B;
}
else if(optionFlagA == "*")
{
calcALL = A * B;
}
else
{
calcALL = A / B;
}
return String.valueOf(calcALL);
}


public static void main(String[] args) {
CalcFrame calcFrame = new CalcFrame();
calcFrame.menuFrame();


}


// 使用正则表达式,判断当前输入的字符是否是数字或者小数点
public boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]|\\.");
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;
}
return true;
}
}
0 0
原创粉丝点击