用JAVA做个简易的计算器,入门水平就好,不要太复杂
实现功能:加减乘除,清除键,部分清除键,开平方,小数点,等号,百分比
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Calculation extends JFrame implements ActionListener{
private JTextField txfResult;//显示操作结果的文本框
JTextField txfM;//显示记忆的索引值的文本框
Double dM=0d;//存储数据
public Calculation() {
super("swing 计算器实例");
/*设置用于显示的文本框*/
txfResult =new JTextField("0",30);//初始文本显示0 最大列数30
txfResult.setBackground(Color.WHITE);
txfResult.setHorizontalAlignment(JTextField.RIGHT);//数字在文本框中靠右显示
txfResult.setEditable(false);//文本框不可编辑 即为readOnly只读属性
JPanel ResultTextPanel=new JPanel();//放操作结果文本框的面板
ResultTextPanel.add(txfResult);
/*设置用于控制数字的键与显示记忆索引值的文本框*/
txfM=new JTextField(2);//最长2列
JButton b1=new JButton("Backspace");//退格键
JButton b2=new JButton("CE");//重置键
JButton b3=new JButton("C");//清0键
JPanel ControlPanel=new JPanel();
ControlPanel.setLayout(new GridLayout(1, 4, 2, 2));//1行4列 水平间距2 垂直间距2
ControlPanel.add(txfM);
ControlPanel.add(b1);
ControlPanel.add(b2);
ControlPanel.add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
/*数字和运算符键*/
String dcKey[]= {"MC","7","8","9","/","sqrt","MR","4","5","6","*","%","MS","1","2","3","-","1/x"
,"M+","0","+/-",".","+","="};
JPanel dcKeyPanel =new JPanel();//数字和运算符的面板
dcKeyPanel.setLayout(new GridLayout(4, 6,2,2));
//一个 循环放好所有数字和运算符组件
for(int i=0;i<24;i++) {
JButton b=new JButton(dcKey[i]);
dcKeyPanel.add(b);
b.addActionListener(this);
}
Container ct=this.getContentPane();//窗体内容面板对象
ct.setLayout(new BorderLayout());
ct.add(ResultTextPanel,BorderLayout.NORTH);
ct.add(ControlPanel,BorderLayout.CENTER);
ct.add(dcKeyPanel,BorderLayout.SOUTH);
pack();
setVisible(true);
setResizable(false);//禁止最大化
setLocationRelativeTo(null);//居中显示
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Calculation();
}
//////////////////////////////////////////////////////数字键和功能键的实现/////////////////////////////////////////////////////////
private boolean newDigital=true;//类内全局boolean变量 用于表示是否是输入数的标志
private String operation="";//表示运算符的字符串
private double d1;//二元运算前操数
private double d2;//二元运算后操作数
private int optionValue;//区别加减乘除运算符的变量
/*监听方法*/
@Override
public void actionPerformed(ActionEvent e) {
String s=(e.getActionCommand());//返回与此动作相关的命令字符串 就是button上显示的字
String str=txfResult.getText();
/*后退键*/
if(s.equals("Backspace")) {
if(str.equals("0")||str.equals("")) {//已经是清0状态下 不可再清0了
return;
}
String s1=txfResult.getText();
txfResult.setText(s1.substring(0, s1.length()-1));//截掉最后一个数字
}
/*重置键*/
if(s.equals("CE")) {
txfResult.setText("0");
newDigital=true;//是否是新输入的数的标志设置为true
}
/*清0键*/
if(s.equals("C")) {
txfResult.setText("0");
optionValue=0;//表示运算符的变量设置为0
newDigital=true;//表示是否新输入的数的标志设置为true
}
/*数字键*/
if(s.length()==1&&s.charAt(0)>='0'&&s.charAt(0)<='9') {
if(!newDigital) {
txfResult.setText(str+s);//不是新输入的数
}else {
txfResult.setText(s);
newDigital=false;//表示是否新输入的数的标志设置为false
}
return;
}
/*小数点*/
if(s.equals(".")) {
if(txfResult.getText().indexOf(".")==-1) {//若之前尚不存在小数点
/*判断数字是否0打头*/
if(txfResult.getText().trim().startsWith("0")) {//强大的API
txfResult.setText("0.");
newDigital=false;
}else {
txfResult.setText(str+".");//str事件刚开始就得到的txfResult.getText()
}
}
return;
}
/* 表示数字正负符号+/- */
if(s.equals("+/-")) {
double d=Double.parseDouble(str.trim());//获取输入的数字
txfResult.setText(String.valueOf(-d));//取得获取输入数字的相反数
return;
}
//////////////////////////////////////////////////////加减乘除运算的实现/////////////////////////////////////////////////////////
if(s.equals("+")) {
d1=Double.parseDouble(txfResult.getText());//立刻获取前操作数的值
txfResult.setText("");
optionValue=1;//设置运算符标志
}
if(s.equals("-")) {
d1=Double.parseDouble(txfResult.getText());
optionValue=2;
}
if(s.equals("*")) {
d1=Double.parseDouble(txfResult.getText());
optionValue=3;
}
if(s.equals("/")) {
d1=Double.parseDouble(txfResult.getText());
optionValue=4;
}
if(s.equals("=")) {
d2=Double.parseDouble(txfResult.getText());//获取后操作数的值
/*根据运算符标志的不同值确定计算结果*/
switch(optionValue) {
case 1:
txfResult.setText(String.valueOf(d1+d2));
break;
case 2:
txfResult.setText(String.valueOf(d1-d2));
break;
case 3:
txfResult.setText(String.valueOf(d1*d2));
break;
case 4:
if(d2!=0) {
txfResult.setText(String.valueOf(d1/d2));
}else {
txfResult.setText("除数不能为0");
return;
}
break;
}
operation="";//运算结束 清空运算符
}
////////////////////////////////求平方根 倒数 百分比运算/////////////////////////////////
if(s.equals("sqrt")) {
double d=Double.parseDouble(txfResult.getText().trim());//获取操作数的值
if(d>0) {
txfResult.setText(String.valueOf(Math.sqrt(d)));//计算该值的平方根
}else {
txfResult.setText("负数不能计算平方根");
}
}else if(s.equals("1/x")) {
double d=Double.parseDouble(txfResult.getText().trim());//计算倒数
if(str.equals("0")) {
txfResult.setText("除数不能为0");
}else {
txfResult.setText(String.valueOf(1/d));
}
}else if(s.equals("%")) {
txfResult.setText((String.valueOf(Double.parseDouble(str)/100)));
}
///////////////////////////////////////////实现数据的记忆功能///////////////////////////////////
if(s.equals("MC")) {//清空存储数据
txfResult.setText("");
dM=0d;
newDigital=true;
}
if(s.equals("MR")) {
if(txfM.getText().trim()!="") {
txfResult.setText(""+dM);//显示存储数字当前值
}
}
if(s.equals("MS")) {
dM=Double.parseDouble(txfResult.getText().trim());
txfM.setText("M");//存储区显示M
}
if(s.equals("M+")) {
dM=dM+Double.parseDouble(txfResult.getText().trim());//将显示的数字与已经存储的数据相加 即更新存储数据
}
}
}