java自制计算器(加减乘除 清空 退位 支持小数 括号)
来源:互联网 发布:网络咨询大病种的方法 编辑:程序博客网 时间:2024/06/10 03:34
首先建了一个JFrame的子类Show,在这个子类里面建了一个JPanel的内部子类MyPanel,Show显示的就是MyPanel的内容。通过画线,每次线颜色的rgb根据循环的i值做出相应的改变,从而实现了背景的渐变。后面根据一些Show的一些属性开始画网格,并且通过主函数的监听事件传入的坐标,在实现按键的效果(响应位置重画其它颜色)。根据位置把对应的符号传入Deal类进行运行。最后MyPanel画上Deal上的有关值的属性。
Main类就只要是设置号监听事件,传入被点击的坐标。刚开始使用的是mouseClick 但发现如果按下和抬起的坐标不一直,则这次点击无效,造成一种卡顿的假想。所以我用了mousePressed和mouseReleased这两个方法。
Deal类就是用于处理计算,Change方法是存入数值,防止非法输入。最麻烦的就是中缀转换为后缀的那个算法。
中缀转换为后缀思路请见:http://blog.csdn.net/in_clude/article/details/53146981
计算机器效果图
项目下载链接:http://download.csdn.net/detail/in_clude/9681337
代码如下
package yhz;import java.awt.Color;import java.awt.Graphics;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;public class Main {public static void main(String args[]){final Show show=new Show();show.addMouseListener(new MouseAdapter(){public void mousePressed(MouseEvent e) {// TODO Auto-generated method stubsuper.mousePressed(e);int tx=e.getY()-show.mDivHeight/2;int ty=e.getX();if(tx>show.mDivision){show.mSelectX=(tx-show.mDivision)/show.mDivHeight;show.mSelectY=ty/show.mDivWidth;}show.repaint();}public void mouseReleased(MouseEvent e) {// TODO Auto-generated method stubsuper.mouseReleased(e);show.mSelectX=-1;show.mSelectY=-1;show.repaint();}});}}
package yhz;import java.awt.*;import javax.swing.*;public class Show extends JFrame {public int mDivision;//按钮与显示的分界线public int mDivWidth;//每个小格的宽public int mDivHeight; //每个小格的高public int[] mDivX = new int[10];//存每个小格左上角的x坐标public int[] mDivY = new int[10];//存每个小格左上角的y坐标public int mSelectX;public int mSelectY;public char [][] mSign = {{'C','<','(',')'},{'1','2','3','+'},{'4','5','6','-'},{'7','8','9','×'},{'.','0','=','÷'}};public Deal mDeal = new Deal();public Show(){setTitle("小智的计算器");setSize(90*3,160*3);this.getContentPane().add(new MyPanel());setVisible(true);setResizable(false);setLocation(400,100);mSelectX=-1;mSelectY=-1;}public class MyPanel extends JPanel{private int flag=0;protected void paintComponent(Graphics g) {// TODO Auto-generated method stubsuper.paintComponent(g);/** * 存储位置 */if(flag==0){mDivision=this.getWidth()*9/16-30;for(int i=0;i<6;i++){mDivX[i]=mDivision+(this.getHeight()-mDivision)*i/5;}for(int i=0;i<5;i++){mDivY[i]=this.getWidth()*i/4;}mDivHeight=(this.getHeight()-mDivision)/5; //5行mDivWidth=this.getWidth()/4; //4列flag=1;}/** * 下面开始绘图 *///背景for(int i=0;i<mDivision;i++){Color myColor = new Color(255,200,i/2);g.setColor(myColor);g.drawLine(0, i, this.getWidth(), i);}for(int i=mDivision;i<this.getHeight();i++){Color myColor = new Color(250-i/3,200-i/3,i/3);g.setColor(myColor);g.drawLine(0, i, this.getWidth(), i);}//按键效果if(mSelectX!=-1&&mSelectY!=-1){mDeal.Change(mSign[mSelectX][mSelectY]);for(int i=mDivX[mSelectX];i<=mDivX[mSelectX]+mDivHeight;i++){Color myColor = new Color(255,200,0);g.setColor(myColor);g.drawLine( mDivY[mSelectY], i, mDivY[mSelectY]+mDivWidth,i);}}g.setColor(Color.white);//网格for(int i=0;i<5;i++){g.drawLine(0, mDivX[i], this.getWidth(), mDivX[i]);}for(int i=1;i<=4;i++){g.drawLine(mDivY[i], mDivision, mDivY[i], this.getHeight());}//绘字for(int i=0;i<5;i++){for(int j=0;j<4;j++){g.drawString(String.valueOf(mSign[i][j]), mDivY[j]+mDivWidth/2-2, mDivX[i]+mDivHeight/2+5); //-2 +5是根据显示进行的微调}}Font font = new Font("Arial", Font.PLAIN, 29);g.setFont(font);if(mDeal.mText==""){g.drawString(mDeal.mAns, this.getWidth()-this.getFontMetrics(font).stringWidth(mDeal.mAns)-5, mDivision*2/3);}else g.drawString(mDeal.mText, this.getWidth()-this.getFontMetrics(font).stringWidth(mDeal.mText)-5, mDivision*2/3);Font font1 = new Font("Arial", Font.PLAIN, 16);g.setFont(font1);String str = new String();for(int i=0;i<mDeal.mDetailPos;i++){str+=mDeal.mTextDetail[i];}g.drawString(str, this.getWidth()-this.getFontMetrics(font1).stringWidth(str), mDivision/3);}}}
package yhz;import java.util.Stack;public class Deal {public String mText = new String();public String[] mTextDetail = new String[100];//用数组方便后缀表达式那儿放入栈中public int mDetailPos;public String mAns = new String();private int mLeftBracketNum;private String[] mSuffix =new String[105];private int mSuffixPos;private Stack mTemp =new Stack();public Deal(){mLeftBracketNum=0;mDetailPos=0;mAns="0";mText="";}public void Change(char c){mAns="0";if(c<='9'&&c>='0'){if(mDetailPos>0){if(mTextDetail[mDetailPos-1].equals(")")==false)mText+=c;}else mText+=c;}else if(c=='+'||c=='-'||c=='×'||c=='÷'){if(mText!=""){if(mText.substring(mText.length()-1, mText.length()).equals("."))//确保末尾不能有小数点{mText=mText.substring(0, mText.length()-1);}mTextDetail[mDetailPos++]=mText;String temp = new String();temp = "";temp+=c;mTextDetail[mDetailPos++]=temp;mText="";}else if(mTextDetail[mDetailPos-1].equals("(")==true){}else if(mTextDetail[mDetailPos-1].equals(")")==true){String temp = new String();temp = "";temp+=c;mTextDetail[mDetailPos++]=temp;}else if(mTextDetail[mDetailPos-1].equals(")")==false){String temp = new String();temp ="";temp+=c;mTextDetail[mDetailPos-1]=temp;}if(c=='+'||c=='-')if(mLeftBracketNum==0){Calculate();}}else if(c=='C'){mLeftBracketNum=0;mText="";for(int i=0;i<mDetailPos;i++){mTextDetail[i]="";}mDetailPos=0;mAns="0";}else if(c=='<'){if(mText!=""){if(mText.length()==1) mText="";else mText=mText.substring(0, mText.length()-1);}}else if(c=='='){if(mText!="")mTextDetail[mDetailPos++]=mText;for(int i=mLeftBracketNum;i>0;i--)//补全括号{mTextDetail[mDetailPos++]=")";}mTextDetail[mDetailPos++]="=";Calculate();for(int i=0;i<mDetailPos;i++){mTextDetail[i]="";}mDetailPos=0;mText="";}else if(c=='.'){if(mText!=""){if(mText.contains(".")==false){mText+=c;}}}else if(c=='('){if(mDetailPos==0){mTextDetail[mDetailPos++]="(";mLeftBracketNum++;}else if(mTextDetail[mDetailPos-1].equals("+")==true||mTextDetail[mDetailPos-1].equals("-")==true||mTextDetail[mDetailPos-1].equals("×")==true||mTextDetail[mDetailPos-1].equals("÷")==true){mTextDetail[mDetailPos++]="(";mLeftBracketNum++;}}else if(c==')'){if(mLeftBracketNum>0){if(mText!=""){mTextDetail[mDetailPos++]=mText;mTextDetail[mDetailPos++]=")";mLeftBracketNum--;mText="";}}}}/** * 中缀转后缀 */public void toSuffix(){for(int i=0;i<mDetailPos-1;i++)//-1是因为式子包含了最后的 = + - {if(mTextDetail[i].equals("+")==true|| mTextDetail[i].equals("-")==true){while( mTemp.empty()==false&& (mTemp.peek().equals("+")==true|| mTemp.peek().equals("-")==true|| mTemp.peek().equals("×")==true|| mTemp.peek().equals("÷")==true) ){mSuffix[mSuffixPos++]=(String) mTemp.peek();mTemp.pop();}mTemp.push(mTextDetail[i]);}else if(mTextDetail[i].equals("×")==true||mTextDetail[i].equals("÷")==true){while( mTemp.empty()==false&& (mTemp.peek().equals("×")==true||mTemp.peek().equals("÷")==true)){mSuffix[mSuffixPos++]=(String) mTemp.peek();mTemp.pop();}mTemp.push(mTextDetail[i]);}else if(mTextDetail[i].equals("(")==true){mTemp.push(mTextDetail[i]);}else if(mTextDetail[i].equals(")")==true){while(mTemp.peek().equals("(")==false){mSuffix[mSuffixPos++]=(String) mTemp.peek();mTemp.pop();}mTemp.pop();}else {mSuffix[mSuffixPos++]=mTextDetail[i];}}while(mTemp.empty()==false){mSuffix[mSuffixPos++]=(String) mTemp.peek();mTemp.pop();}}public void Calculate(){mSuffixPos=0;for(int i=0;i<100;i++){mSuffix[i]="";}while(mTemp.empty()==false){mTemp.pop();}toSuffix();//输出测试for(int i=0;i<mDetailPos;i++)System.out.print(mTextDetail[i]+" ");System.out.print("\n");for(int i=0;i<mSuffixPos;i++){System.out.print(mSuffix[i]+" ");}System.out.print("\n");for(int i=0;i<mSuffixPos;i++){if(mSuffix[i].equals("+")||mSuffix[i].equals("-") ||mSuffix[i].equals("×")||mSuffix[i].equals("÷")){double b = Double.valueOf((String) mTemp.pop()).doubleValue();double a = Double.valueOf((String) mTemp.pop()).doubleValue();double c = 0;if(mSuffix[i].equals("+")){c = a + b;}if(mSuffix[i].equals("-")){c = a - b;}if(mSuffix[i].equals("×")){c = a * b;}if(mSuffix[i].equals("÷")){c = a / b;}String str = Double.toString(c);mTemp.push(str);}else {mTemp.push(mSuffix[i]);}}mAns = (String) mTemp.pop();if(mAns.length()>16)//防止超出屏幕 如果超过了 改成指数形式输出更好mAns = mAns.substring(0, 16);}}
0 0
- java自制计算器(加减乘除 清空 退位 支持小数 括号)
- C#计算器(递归,WebService) 支持加减乘除括号等 (一)
- C#计算器(递归,WebService) 支持加减乘除括号等 (二)
- 复数计算器支持加减乘除
- C语言实现计算器(包含加减乘除和括号)
- 简单的JAVA计算表达式,支持加减乘除括号
- QT,计算器实现(四则运算,括号,小数,负数)---(一)
- java 简单的计算器(加减乘除)
- MFC 实现 加减乘除,括号,乘方的 计算器
- 简单加减乘除括号的计算器实现
- 加减乘除(计算器)
- js 计算器(加减乘除)
- 计算器实现(加减乘除)
- 一个非常酷的Js计算器(加减乘除,浮点,以及括号运算,四则混合运算)
- 问题 C: 某计算器的超电磁炮(加减乘除括号表达式求值)
- Java计算器实现加减乘除功能
- 简易计算器(3)- 扩展(支持括号和负数)
- 【C语言】计算器(支持括号和长式子)
- Linux查看程序端口占用情况
- SpringMVC_001_框架搭建
- 2016秋季 EDA 设计 课程内容
- Fiddler证书安装(查看HTTPS)
- RelativeLayout中 gone之后的布局错位问题
- java自制计算器(加减乘除 清空 退位 支持小数 括号)
- 关于Runtine erro!
- Xcode8 屏蔽控制台多余的Log日志
- poj 3468 A Simple Problem with Integers(线段树+延迟标记)
- ubuntu用ascii文本播放电影
- Tomcat设置虚拟路径
- 【NOIP2010冲刺十二模拟赛】奶牛晒衣服
- POJ 3249 Test for Job DAG图单源最短路
- 初探前端WEB安全#1