/**
* @(#)AchieveListener.java
*
*
* @author
* @version 1.00 2010/12/17
*
* 此类实现了对各按钮监听器的actionPerformed()方法
*/
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.math.BigDecimal;
import java.math.MathContext;
public class AchieveBtnListener {
private JTextField jtf;//显示框
private Operation ope;//存放操作数和运算符的类
/******************************************************************************/
public AchieveBtnListener(JTextField jtf) {
this.jtf=jtf;
ope=Operation.getOperation();
}
/******************************************************************************/
//实现数字按钮监听类执行方法
public void achieveNumBtnListener(ActionEvent e){
String strJtfText=jtf.getText(),//存放显示框的当前显示
strBtnText=e.getActionCommand();//获取数字
//如果显示0表示程序刚开始
if(strJtfText.equals("0")){
jtf.setText(strBtnText);//直接用按钮输入的数字替换当前显示文本
}
//若显示其他非0数字,则在原先的数上追加
else if(strJtfText.matches("\\-?\\d+")||strJtfText.matches("\\-?\\d+\\.?\\d*")){
jtf.setText(strJtfText+strBtnText);
}
//如不是数字则显示的是运算符,直接用当前数字替换
else{
jtf.setText(strBtnText);
}
}
/******************************************************************************/
//实现运算符按钮监听类执行方法
public void achieveOpeBtnListener(ActionEvent e){
String strJtfText=jtf.getText(),//存放显示框的当前显示
strBtnText=e.getActionCommand();//获取按钮上的文本
//如果是=,则调用Operation类的相应函数来计算结果
if(strBtnText.equals("=")){
//,看看最后一个字符是不是数字就可以知道整个字符串是不是数字.我怎么以前没想到。。。囧~
//如果文本框显示的是数字
if((Character.isDigit(strJtfText.charAt(strJtfText.length()-1)))){
//好吧,我承认这句有点长,可是现在是凌晨5点40分了,我还有20分钟下班,我要快点写。。。
//abc//
ope.setNumberB(new BigDecimal(jtf.getText(),MathContext.DECIMAL64));
//首先,如果是除数运算,除数不可以为0
String strOpe=ope.getOpe();//获取操作符
if(strOpe.equals("/")&&(ope.getNumberB().equals(new BigDecimal(0,MathContext.DECIMAL64)))){
int yesNoCan=JOptionPane.showConfirmDialog(jtf,"你个SB,除数不能为0你不知道吗?","SB专用",JOptionPane.YES_NO_OPTION,JOptionPane.ERROR_MESSAGE);
while(yesNoCan!=0){
yesNoCan=JOptionPane.showConfirmDialog(jtf,"你要真SB就继续按否","SB专用2号",JOptionPane.YES_NO_OPTION,JOptionPane.ERROR_MESSAGE);
}
jtf.setText("/");//返回操作符那一步
return;
}else{
//执行等于的通用操作
jtf.setText(String.valueOf(ope.getResult(strOpe)));//设置文本框显示结果
ope.setNumberA(ope.getResult(strOpe));//将结果付给操作数1
//将操作数与操作符重置
//abc//
ope.setNumberB(new BigDecimal(0,MathContext.DECIMAL64));
ope.setOpe("");
}
}
//如果文本框显示的不是数字,则什么都不做。
}
//如果是+ - * /等运算符
else{
//则继而判断文本框显示的是什么
//if(strJtfText.matches("\\-?\\d+")||strJtfText.matches("\\-?\\d+\\.\\d+")){
//上面这句等效于下面这局,但是肯定下面这句效率高。。好吧~我猜的
if(Character.isDigit(strJtfText.charAt(strJtfText.length()-1))){
//如果文本框显示的是数字,判断是否为第一个操作数
if(ope.getOpe().equals("")){//如果运算符变量为空,则文本框当前显示文字应该是第一个操作数
ope.setNumberA(new BigDecimal(strJtfText,MathContext.DECIMAL64));//将当前数值放入操作数1中
jtf.setText(strBtnText);//且将运算符替换文本框上的文本
//abc//
ope.setOpe(strBtnText);//然后将运算符存在操作符变量中
}//如果是当前显示的是第二个操作数,即操作符不为空,则什么也不做
}
//如果文本框显示的不是数字,那么替换他,别忘了替换掉运算符哦
else{
jtf.setText(strBtnText);
//abc//
ope.setOpe(strBtnText);
}
}
}
/******************************************************************************/
//实现其他按钮监听类执行方法
public void achieveOtherBtnListener(ActionEvent e){
//建议在下一个版本中用Enum重写,方便拓展
String strJtfText=jtf.getText(),//存放显示框的当前显示
strBtnText=e.getActionCommand();//获取按钮上的文本
//清零按钮
if(strBtnText.equals("清零")){
jtf.setText("0");
//abc//
ope.setNumberA(new BigDecimal(0,MathContext.DECIMAL64));
ope.setNumberB(new BigDecimal(0,MathContext.DECIMAL64));
ope.setOpe("");
}
//退格按钮
else if(strBtnText.equals("退格")){
//先判断文本框的内容是否为数字,若不是则什么都不做
if(strJtfText.matches("\\-?\\d*\\.?\\d*")){
//若是数字,则继而判断字符个数是否=1
if(strJtfText.length()==1){
//若只有1个字符,
jtf.setText("0");
}else{
jtf.setText(strJtfText.substring(0,strJtfText.length()-1));//抛弃最后一个字符
}
}
}
//点按钮
else if(strBtnText.equals(".")){
if(strJtfText.matches("\\-?\\d+")){//如果文本框是整数,就追加一个.否则什么都不做
jtf.setText(strJtfText+strBtnText);
}
}
//+/-号按钮
else if(strBtnText.equals("+/-")){
//只有对数字非0
if(Character.isDigit(strJtfText.charAt(strJtfText.length()-1))&&!strJtfText.equals("0")){
if(strJtfText.matches("\\d+")||strJtfText.matches("\\d+\\.\\d+")){
//其实只要判断大于0就可以了。。。懒得改了。。。算了
//如果是正数
jtf.setText("-"+strJtfText);
}else{
//除去字符串末尾是.的情况
if(!strJtfText.endsWith(".")){
jtf.setText(strJtfText.substring(1,strJtfText.length()));
}
}
}
}
}
/******************************************************************************/
}
没有合适的资源?快使用搜索试试~ 我知道了~
java实现计算器(e_forrest面向对象版本)
共16个文件
class:10个
java:6个
需积分: 16 11 下载量 201 浏览量
2010-12-18
17:42:09
上传
评论 1
收藏 24KB RAR 举报
温馨提示
java实现计算器(e_forrest面向对象版本) v 1.0 实现了基础功能+ - * / 删除 重置 改变正负号等
资源推荐
资源详情
资源评论
收起资源包目录
Calculator_BY_e_forrest.rar (16个子文件)
CalFrame.class 4KB
ButtonListener.java 2KB
OtherButtonListener.class 732B
Operation.java 3KB
CalFrame.java 6KB
Calculator_BY_e_forrest.class 479B
Calculator_BY_e_forrest.java 320B
AchieveBtnListener.java 6KB
ButtonFactory.java 3KB
NumButtonListener.class 726B
Operation.class 2KB
ButtonListener.class 562B
ButtonFactory.class 1KB
AchieveBtnListener.class 3KB
OpeButtonListener.class 726B
Calculator_BY_e_forrset.class 9KB
共 16 条
- 1
资源评论
e_forrest
- 粉丝: 28
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功