首页 > 编程 > Java > 正文

java图形化界面实现简单混合运算计算器的示例代码

2019-11-26 08:21:41
字体:
来源:转载
供稿:网友

写了好几天了终于写完了这个四则运算计算器,总代码放在后面

截图如下:

首先是布局都比较简单,最上面的一个框是总的输出框,

第二个框是每次输入的数字显示在框内,

对于每一个按钮都增加监听器,

对于数字按钮:当长度大于8的 或者等号已经出现之后就不再处理按钮事件

if(e.getSource().equals(button1)) {	s=numberText.getText();    //数字长度大于8或者等号已出现	if(s.length()>8 || equalbook == 1) {					}	else if(s.equals("0") || s.equals("")) {	  numberText.setText("1");	}else {	  numberText.setText(s + "1");	}	}

其余的按钮都差不多。

当按钮为小数点时,长度大于7就不再处理,因为总的长度不能超过8,而小数点后面还要与数字,

同时标记小数点已经出现过,因为一个数中最多出现一个小数点

//当按钮为小数点时if(e.getSource().equals(buttonpoint)) {	s=numberText.getText();	if(s.length()>7 || equalbook == 1) {					}	if(pointbook==0) {		numberText.setText(s + ".");		pointbook = 1;	}}

当按钮为加号时:

当数字输入框为空时不做处理

也有可能是最后一位是小数点,当然也不处理

当最上方的输出框的最后一位是右括号的时候,可以用加号

//当按钮为加号时if(e.getSource().equals(buttonadd)) {	s=numberText.getText();	char ch1[] = s.toCharArray();	int length1 = s.length() - 1;		String S = expressText.getText();	char ch2[] = S.toCharArray();	int length2 = S.length() - 1;	//当数字为空或为0或数字的最后一位是小数点时不作处理	if((length2 == -1 ||ch2[length2] != ')') && (s.equals("0") || s.equals("") || ch1[length1] == '.')) {			}else {		numberText.setText("");		expressText.setText(expressText.getText() + s + "+");	}	}

+, -, *, /都差不多

当前面是运算符或者左括号的时候才能用左括号, 注意当框内无元素的时候也可以加左括号, 但是需要判断元素的个数是否大于0

if(e.getSource().equals(buttonleft)) {	if(!numberText.getText().equals("0") && !numberText.getText().contentEquals("")) {		expressText.setText(expressText.getText() + numberText.getText());	}	s=expressText.getText();	char ch[] = s.toCharArray();	int length = s.length() - 1;	/*	 * 当前面是运算符或者左括号的时候才能用左括号	 * 注意当框内无元素的时候也可以加左括号	 * 但是需要判断元素的个数是否大于0	 */	if(length == -1 || ch[length] == '+' || ch[length] == '-' || 	  ch[length] == '*' || ch[length] == '/' || 	  ch[length] == '(' || s.equals("")) {		expressText.setText(expressText.getText() + '(');		leftNum++;	}	}

右括号就不一样

if(e.getSource().equals(buttonright)) {	if(!numberText.getText().equals("0")) {		expressText.setText(expressText.getText() + numberText.getText());		numberText.setText("");	}		s=expressText.getText();	char ch[] = s.toCharArray();	int length = s.length() - 1;	/*	 * 只有前面是数字的时候且左括	 * 号的数量大于右括号的数量的时候才能加右括号	 */	if(Character.isDigit(ch[length]) && leftNum > rightNum) {		rightNum++;		expressText.setText(expressText.getText() + ')');	}	}

当按钮为 C时,清除所有内容并更新等号状态, 左括号数量, 右括号数量, 小数点状态,当一次计算完成之后,只有按C按钮才能进行新的计算。

当按钮为CE时,只清除数字框中的内容。

if(e.getSource().equals(buttonC)) {  numberText.setText("0");  expressText.setText("");  leftNum = 0;  rightNum = 0;  pointbook = 0;  equalbook = 0;}

当按钮为等号时就把总输出框中显示的字符串取出进行计算,因为这个计算器是带括号的,所以这里我用了逆波兰表达式做的,需要把中缀表达式变为后缀表达式,然后进行计算,这一点我认为是最困难的一点,后面有时间我会再写关于 逆波兰表达式实现以及 逆波兰表达式的求值。

需要注意588行的代码,最后的两个括号的条件没有加上,导致花了周末一天在找bug......

else if((ch[j] == '*' || ch[j] == '/') &&    (operater1=='+' || operater1=='-') ||     (operater1=='(' || operater1 == ')')) {	  Operater.push(ch[j]);      break;}

所有代码:

package cn.edu.shengda; /* * author 201705050153 张宜强 */ import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Stack; import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTextField; public class Calculator extends JFrame implements ActionListener {	Calculator() {		init();	}	public void init() {	JFrame frame = new JFrame ("计算器");    frame.setBackground(Color.yellow);    frame.setLayout(null);        //放置数字0    button0 = new JButton("0");    button0.setBounds(20, 200, 100, 25);    frame.add(button0);        //放置数字1    button1 = new JButton("1");    button1.setBounds(20, 170, 45, 25);    frame.add(button1);        //放置数字2    button2 = new JButton("2");    button2.setBounds(75, 170, 45, 25);    frame.add(button2);        //放置数字3    button3 = new JButton("3");    button3.setBounds(130, 170, 45, 25);    frame.add(button3);        //放置数字4    button4 = new JButton("4");    button4.setBounds(20, 140, 45, 25);    frame.add(button4);        //放置数字5    button5 = new JButton("5");    button5.setBounds(75, 140, 45, 25);    frame.add(button5);        //放置数字6    button6 = new JButton("6");    button6.setBounds(130, 140, 45, 25);    frame.add(button6);        //放置数字7    button7 = new JButton("7");    button7.setBounds(20, 110, 45, 25);    frame.add(button7);        //放置数字8    button8 = new JButton("8");    button8.setBounds(75, 110, 45, 25);    frame.add(button8);        //放置数字9    button9 = new JButton("9");    button9.setBounds(130, 110, 45, 25);    frame.add(button9);        //放置 .    buttonpoint = new JButton(".");    buttonpoint.setBounds(130, 200, 45, 25);    frame.add(buttonpoint);        //放置 +    buttonadd = new JButton("+");    buttonadd.setBounds(185, 200, 45, 25);    frame.add(buttonadd);        //放置 -    buttonreduce = new JButton("-");    buttonreduce.setBounds(185, 170, 45, 25);    frame.add(buttonreduce);         //放置 *    buttonride = new JButton("*");    buttonride.setBounds(185, 140, 45, 25);    frame.add(buttonride);           //放置 /    buttonexcept = new JButton("/");    buttonexcept.setBounds(185, 110, 45, 25);    frame.add(buttonexcept);        //放置 =    buttonequal = new JButton("=");    buttonequal.setBounds(240, 170, 55, 55);    frame.add(buttonequal);        //计算1/x    buttoninvert = new JButton("1/x");    buttoninvert.setBounds(240, 110, 55, 55);    frame.add(buttoninvert);        //放置左括号    buttonleft = new JButton("(");    buttonleft.setBounds(20, 80, 45, 25);    frame.add(buttonleft);        //放置右括号    buttonright = new JButton(")");    buttonright.setBounds(75, 80, 45, 25);    frame.add(buttonright);        //放置C 消除所有输入    buttonC = new JButton("C");    buttonC.setBounds(130, 80, 75, 25);    frame.add(buttonC);        //放置CE 消除当前输入    buttonCE = new JButton("CE");    buttonCE.setBounds(220, 80, 75, 25);    frame.add(buttonCE);        //添加表达式文本框    expressText = new JTextField();    expressText.setBounds(20, 10, 300, 30);    frame.add(expressText);        //添加数字文本框    numberText = new JTextField("0");    numberText.setBounds(20, 40, 300, 30);    frame.add(numberText);        //加监听器    button0.addActionListener(this);    button1.addActionListener(this);    button2.addActionListener(this);    button3.addActionListener(this);    button4.addActionListener(this);    button5.addActionListener(this);    button6.addActionListener(this);    button7.addActionListener(this);    button8.addActionListener(this);    button9.addActionListener(this);    buttonpoint.addActionListener(this);    buttonadd.addActionListener(this);    buttonreduce.addActionListener(this);    buttonride.addActionListener(this);    buttonexcept.addActionListener(this);    buttoninvert.addActionListener(this);    buttonequal.addActionListener(this);    buttonleft.addActionListener(this);    buttonright.addActionListener(this);    buttonC.addActionListener(this);    buttonCE.addActionListener(this);    numberText.addActionListener(this);    expressText.addActionListener(this);      frame.setBounds(0, 0, 350, 300);    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    frame.setVisible(true);	}		JButton button0;	JButton button1;	JButton button2;	JButton button3;	JButton button4;	JButton button5;	JButton button6;	JButton button7;	JButton button8;	JButton button9;	JButton buttonpoint;	JButton buttonadd;	JButton buttonreduce;	JButton buttonride;	JButton buttonexcept;	JButton buttonequal;	JButton buttoninvert;	JButton buttonleft;	JButton buttonright;	JButton buttonC;	JButton buttonCE;	JTextField numberText;	JTextField expressText;			String s = null;       //记录小数点是否出现,每次当前数字框中只能出现一个小数点	int pointbook = 0;  //记录等号是否出现,每次计算的总算式只能出现一个等号   int equalbook = 0;    //记录左括号的数量   int leftNum = 0;   //记录有括号的数量   int rightNum = 0;   	@Override	public void actionPerformed(ActionEvent e) {		// TODO Auto-generated method stub		       		//当按钮为0时		if(e.getSource().equals(button0)) {			s=numberText.getText();			if(s.length()>8) {							}			else if(s.equals("0") || equalbook == 1) {							}else {				numberText.setText(s + "0");			}		}				//当按钮为1时		if(e.getSource().equals(button1)) {			s=numberText.getText();			if(s.length()>8 || equalbook == 1) {							}			else if(s.equals("0") || s.equals("")) {				numberText.setText("1");			}else {				numberText.setText(s + "1");			}			}				//当按钮为2时		if(e.getSource().equals(button2)) {			s=numberText.getText();			if(s.length()>8 || equalbook == 1) {							}			else if(s.equals("0") || s.equals("")) {				numberText.setText("2");			}else {				numberText.setText(s + "2");			}			}				//当按钮为3时		if(e.getSource().equals(button3)) {			s=numberText.getText();			if(s.length()>8 || equalbook == 1) {							}			else if(s.equals("0") || s.equals("")) {				numberText.setText("3");			}else {				numberText.setText(s + "3");			}			}				//当按钮为4时		if(e.getSource().equals(button4)) {			s=numberText.getText();			if(s.length()>8 || equalbook == 1) {							}			else if(s.equals("0") || s.equals("")) {				numberText.setText("4");			}else {				numberText.setText(s + "4");			}			}				//当按钮为5时		if(e.getSource().equals(button5)) {			s=numberText.getText();			if(s.length()>8 || equalbook == 1) {							}			else if(s.equals("0") || s.equals("")) {				numberText.setText("5");			}else {				numberText.setText(s + "5");			}			}				//当按钮为6时		if(e.getSource().equals(button6)) {			s=numberText.getText();			if(s.length()>8 || equalbook == 1) {							}			else if(s.equals("0") || s.equals("")) {				numberText.setText("6");			}else {				numberText.setText(s + "6");			}			}				//当按钮为7时		if(e.getSource().equals(button7)) {			s=numberText.getText();			if(s.length()>8 || equalbook == 1) {							}			else if(s.equals("0") || s.equals("")) {				numberText.setText("7");			}else {				numberText.setText(s + "7");			}			}				//当按钮为3时		if(e.getSource().equals(button8)) {			s=numberText.getText();			if(s.length()>8 || equalbook == 1) {							}			else if(s.equals("0") || s.equals("")) {				numberText.setText("8");			}else {				numberText.setText(s + "8");			}			}				//当按钮为9时		if(e.getSource().equals(button9)) {			s=numberText.getText();			if(s.length()>8 || equalbook == 1) {							}			else if(s.equals("0") || s.equals("")) {				numberText.setText("9");			}else {				numberText.setText(s + "9");			}			}				//当按钮为小数点时		if(e.getSource().equals(buttonpoint)) {			s=numberText.getText();			if(s.length()>7 || equalbook == 1) {							}			if(pointbook==0) {				numberText.setText(s + ".");				pointbook = 1;			}		}				//当按钮为加号时		if(e.getSource().equals(buttonadd)) {			s=numberText.getText();			char ch1[] = s.toCharArray();			int length1 = s.length() - 1;						String S = expressText.getText();			char ch2[] = S.toCharArray();			int length2 = S.length() - 1;			//当数字为空或为0或数字的最后一位是小数点时不作处理			if((length2 == -1 ||ch2[length2] != ')') && (s.equals("0") || s.equals("") || ch1[length1] == '.')) {							}else {				numberText.setText("");				expressText.setText(expressText.getText() + s + "+");			}					}				//当按钮为减号时		if(e.getSource().equals(buttonreduce)) {			s=numberText.getText();			char ch1[] = s.toCharArray();			int length1 = s.length() - 1;						String S = expressText.getText();			char ch2[] = S.toCharArray();			int length2 = S.length() - 1;			if((length2 == -1 ||ch2[length2] != ')') && (s.equals("0") || s.equals("") || ch1[length1]=='.')) {							}else {				numberText.setText("");				expressText.setText(expressText.getText() + s + "-");			}		}				//当按钮为乘号时		if(e.getSource().equals(buttonride)) {			s=numberText.getText();			char ch1[] = s.toCharArray();			int length1 = s.length() - 1;						String S = expressText.getText();			char ch2[] = S.toCharArray();			int length2 = S.length() - 1;			if((length2 == -1 ||ch2[length2] != ')') && (s.equals("0") || s.equals("") || ch1[length1]=='.')) {							}else {				numberText.setText("");				expressText.setText(expressText.getText() + s + "*");			}		}				//当按钮为除号时		if(e.getSource().equals(buttonexcept)) {			s=numberText.getText();			char ch1[] = s.toCharArray();			int length1 = s.length() - 1;						String S = expressText.getText();			char ch2[] = S.toCharArray();			int length2 = S.length() - 1;			if((length2 == -1 ||ch2[length2] != ')') && (s.equals("0") || s.equals("") || ch1[length1]=='.')) {							}else {				numberText.setText("");				expressText.setText(expressText.getText() + s + "/");			}		}				//当按钮为左括号时		if(e.getSource().equals(buttonleft)) {			if(!numberText.getText().equals("0") && !numberText.getText().contentEquals("")) {				expressText.setText(expressText.getText() + numberText.getText());			}			s=expressText.getText();			char ch[] = s.toCharArray();			int length = s.length() - 1;			/*			 * 当前面是运算符或者左括号的时候才能用左括号			 * 注意当框内无元素的时候也可以加左括号			 * 但是需要判断元素的个数是否大于0			 */			if(length == -1 || ch[length] == '+' || ch[length] == '-' || 			  ch[length] == '*' || ch[length] == '/' || 			  ch[length] == '(' || s.equals("")) {				expressText.setText(expressText.getText() + '(');				leftNum++;			}					}				//当按钮为右括号时		if(e.getSource().equals(buttonright)) {			if(!numberText.getText().equals("0")) {				expressText.setText(expressText.getText() + numberText.getText());				numberText.setText("");			}						s=expressText.getText();			char ch[] = s.toCharArray();			int length = s.length() - 1;			/*			 * 只有前面是数字的时候且左括			 * 号的数量大于右括号的数量的时候才能加右括号			 */			if(Character.isDigit(ch[length]) && leftNum > rightNum) {				rightNum++;				expressText.setText(expressText.getText() + ')');			}					}								/*    *当按钮为 C时    *清除所有内容    *并更新等号状态, 左括号数量, 右括号数量, 小数点状态    *当一次计算完成之后,只有按CE按钮才能进行新的计算    */              if(e.getSource().equals(buttonC)) {      numberText.setText("0");      expressText.setText("");      leftNum = 0;      rightNum = 0;      pointbook = 0;      equalbook = 0;    }              /*    *当按钮为CE时,    *清除当前数字框中内容      *更新小数点状态    */    if(e.getSource().equals(buttonCE)) {      numberText.setText("0");      pointbook = 0;      }        //当按钮为1/x时把输入框中的值变为倒数       if(e.getSource().equals(buttoninvert) ) {    	s = numberText.getText();    	//等于0的时候不进行操作    	if(s.equals("0")) {    		    	}else {    		double a = Double.parseDouble(numberText.getText());	    	a = 1/a;	    	numberText.setText(String.valueOf(a));    	}    	    }          		//当按钮为等于号时		if(e.getSource().equals(buttonequal)) {			s=numberText.getText();			if(!s.equals("0") && !s.equals("")) {				expressText.setText(expressText.getText() + s);			}      //当等号没有出现时才能输入等号 			if(equalbook == 0) {         numberText.setText("");        //补全右括号        for(int i = 0; i < leftNum - rightNum; i++) {        	expressText.setText(expressText.getText() + ')');        }        		    /*		     * 声明栈		     * 一个char型存储运算符		     * 将中缀表达式转化为逆波兰表达式		    */		    String[] ansString = new String[100];		    int Size = 0;		    Stack<Character> Operater = new Stack<Character>();		    		    s = expressText.getText();		    char ch[] = s.toCharArray();		    int length = ch.length;		    for(int j = 0; j < length; j++) {		    	//当数组元素为数字时		    	if(ch[j] >='0' && ch[j] <= '9') {		    		double Number = ch[j] - '0';		    		//继续往后遍历,直到不是数字和小数点		    		//记录小数点是否出现		    		int point = 0;		    		//记录小数点出现后的位数		    		int bit = 1;		    		if(j==length-1) {		    			ansString[Size++] = String.valueOf(Number);		    		}		    		for(j++; j<length; j++) {		    			if((ch[j] < '0' || ch[j] >'9') && ch[j]!='.') {		    				j--;		    				ansString[Size++] = String.valueOf(Number);		    				break;		    			}		    			if(ch[j] == '.') {		    				point = 1;		    				continue;		    			}		    			if(ch[j] >= '0' && ch[j] <= '9') {		    				/*		    				 * 当小数点没有出现时和没出现时要分开讨论		    				 */		    				if(point == 0) {		    					Number = Number * 10 + (ch[j] - '0');		    				} else {		    					Number = Number + Math.pow(10, -bit) * (ch[j]-'0');		    					bit++;		    				} 		    			}		    		}		    	} else { //考虑运算符		    		if(ch[j] =='(') {		    			Operater.push('(');		    		} else if(ch[j]==')') {		    			while(!Operater.peek().equals('(')) {		    				ansString[Size++] = String.valueOf(Operater.peek());		    				Operater.pop();		    			}		    			Operater.pop();		    		} else {		    			if(Operater.empty()) {		    				Operater.push(ch[j]);		    			}		    			else {		    				//System.out.println("!" + ch[j]);		    					    				while(true) {		    							    					if(Operater.empty()) {				    				Operater.push(ch[j]);				    				break;				    			}                                char operater1 = Operater.peek();		    					if((ch[j] == '*' || ch[j] == '/') &&		    					  (operater1=='+' || operater1=='-') || (operater1=='(' || operater1 == ')')) {		    						Operater.push(ch[j]);		    						break;		    					}		    					else {		    						ansString[Size++] = String.valueOf(Operater.peek());		    						Operater.pop();		    					}		    				}		    			}		    		}		    	}		    }//System.out.println(s);		    while(!Operater.empty()) {		    	ansString[Size++] = String.valueOf(Operater.peek());		    	Operater.pop();		    }//		    for(int i=0; i<Size; i++)//		    	System.out.println(ansString[i]);		    //最后计算逆波兰表达式的值		    Stack<Double> Last = new Stack<Double>();		    for(int i=0; i<Size; i++) {		    	String s1 = ansString[i];		    	char ch2[] = s1.toCharArray();		    	if(ch2[0]>='0' && ch2[0]<='9') {		    		Last.push(Double.parseDouble(s1));		    	}		    	else {		    		double num1 = Last.pop();		    		double num2 = Last.pop();		    		double num3 = 0;		    		if(ch2[0]=='+') 		    			num3 = num2 + num1;		    		else if(ch2[0]=='-')		    			num3 = num2 - num1;		    		else if(ch2[0]=='*')		    			num3 = num2 * num1;		    		else if(ch2[0]=='/')		    			num3 = num2 / num1;		    				    		Last.push(num3);		    	}		    }		    expressText.setText(expressText.getText() + "=" + Last.pop());		    equalbook = 1;        }	     }			} 	  public static void main(String []args) {  	Calculator calculator = new Calculator();  }	 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表