首先,我认为编程之前需要先要搭建好整个程序一个基本并且合理的框架,只有这样后面的编程才会变得轻松!计算器我认为应该要划分为两个对象:1.界面类对象、2.计算类对象!
1.界面类中用到的一些对象的方法:
ActionEvent:getActionCommand()该方法可用于判断到底是哪一事件被触发。
JTextField: setHorizontalAlignment()该方法可以设置文本对齐方式。 setEditable()该方法可以设置文本框是否可编辑。
2.算法类其实才是核心(将代码附上):
package com.countersAlgorithm;
import java.awt.event.ActionEvent;
import java.math.BigDecimal;
import javax.swing.JButton;
/* CountersAlgorithm类为计算器计算核心逻辑,为处理计算问题而生
*
*/
import javax.swing.JOptionPane;
public class CountersAlgorithm {
public BigDecimal number1,number2,number1_2;//用于将String转换成十进制数,
//number1_2为运算后的结果。
public String displayText="0";//用来显示的字符串
public static final int LENGH = 20;//规定的输入的长度
private boolean firstPoint = true;
public boolean operationFirst = true;
private boolean numStart = false;//判断数字键是否被按下
private String myFlag = null;//弄一个标记用来记忆等于号之前的发生了什么运算
//数字按钮事件处理*****************************功能模块(一)
public void numberButtonAction(String flagNum){
if(displayText.equals("0")){
if(flagNum.equals("0"))
displayText = flagNum;
else if(flagNum.equals(".")&&firstPoint){
displayText += flagNum;
firstPoint = false;
}
else if("123456789".indexOf(flagNum)!=-1){
displayText = flagNum;
}
}
else{
if(flagNum.equals(".")&&firstPoint){
displayText += flagNum;
firstPoint = false;
}
else if("0123456789".indexOf(flagNum)!=-1){
displayText += flagNum;
}
}
numStart = true;
}
//运算符按钮事件处理**********************************功能模块(二)
public void operationButtonAction(String flagOpe){
if(!flagOpe.equals("=")){//首先判断是否输入的是"="运算符
myFlag = flagOpe;//如果不是"="运算符再做标记
if(flagOpe.equals("+")){//按下的是加号
if(operationFirst)
funtion();//funtion()方法提供为number1赋值的功能
else
funAdd();
}
else if(flagOpe.equals("-")){//按下的是减号
if(operationFirst)
funtion();
else
funSub();
}
else if(flagOpe.equals("*")){//按下的是乘号
if(operationFirst)
funtion();
else
funMul();
}
else if(flagOpe.equals("/")){//按下的是除号
if(operationFirst)
funtion();
else
funDiv();
}
}
else{
//如果为等号时
if(myFlag.equals("+")){
funAdd();
}
else if(myFlag.equals("-")){
funSub();
}
else if(myFlag.equals("*")){
funMul();
}
else if(myFlag.equals("/")){
funDiv();
}
}
numStart = false;//将数字按钮的标记置为假
}
//操作符按钮事件处理**************************************功能模块(三)
public void funtionButtonAction(String flagFun){
if(flagFun.equals("MC")){
//如果按下"MC"清零键,就将各变量回归初始化
displayText = "0";
number1 = null;
number2 = null;
operationFirst = true;
firstPoint = true;
numStart = true;
}
else if(flagFun.equals("Del")){
/*如果按下的是"Del"键就是获取
*原displayText长度不断减一的子字符串一直到长度为零。*/
if(!displayText.equals("0")){
if(displayText.length()> 0)
displayText = displayText.substring(0,displayText.length()-1);
}
}
}
//************************************************为功能模块(二)服务的子模块
//为number1赋初值的方法
private void funtion(){
number1 = new BigDecimal(displayText);
displayText = "0";
operationFirst = false;
}
//求加运算
private void funAdd(){
number2 = new BigDecimal(displayText);
number1 = number1.add(number2);
displayText = "0";
}
//求差运算
private void funSub(){
number2 = new BigDecimal(displayText);
number1 = number1.subtract(number2);
displayText = "0";
}
//求积运算
private void funMul(){
/*乘法需要判断dislayText是否为0,因为在乘法进行之前如果出现了其他运算的话,
displayText会被置为"0",接着就会影响number2的值,这样就会影响number1的值。*/
if(!displayText.equals("0")){
number2 = new BigDecimal(displayText);
number1 = number1.multiply(number2);
displayText = "0";
}
else{
if(numStart)//输出结果前先要判断一下数字键是否被按下过,如果为真才输出结果
number1 = number1.multiply(new BigDecimal("0"));
}
}
//求商运算
private void funDiv(){
if(!displayText.equals("0")){
number2 = new BigDecimal(displayText);
try{
number1 = number1.divide(number2);
}
catch(ArithmeticException e){//除法运算时可能会出现算数异常
JOptionPane.showMessageDialog(null,"无限循环:"+e.toString()
,"错误提示",JOptionPane.OK_OPTION);
}
displayText = "0";
}
else{
//判断用户是否输入并且是否将除数输入为零
if(numStart&&displayText.equals("0")){
JOptionPane.showMessageDialog(null,"他妈的 ,小学没学好啊?除数不能为零!!!",
"错误提示!!!",JOptionPane.OK_OPTION);
}
}
}
}