(一)实验目的

1、掌握Java图形用户界面的编程设计方法;

2、掌握异常处理的编程方法。

3、掌握组件的监听和动作响应处理方法。

(二)实验内容和实验原理

实现一个计算器。要求:

1、参照Windows计算器功能,实现加、减、乘、除运算;

2、声明为按钮数组;

3、对0~9数字操作,采用相同的算法;

4、解决除数为零的问题;

5、具有清除一个数字、全部清除、开平方和平方功能。

6、计算结果保留4位小数。

7、界面缩放时,所有组件同步缩放,保持界面整体风格不变。

(三)实验步骤

1.在MyEclipse环境中,新建工作区和类;

2.编辑并编译源程序;

3、运行。

(四)实验报告要求

1、提交实验源程序;

2、提交实验过程的截图;

3、撰写心得体会。

计算绝大部分是依靠js引擎的eval()函数来完成,不清楚eval的同学可以参考:https://www.w3school.com.cn/js/jsref_eval.asp

 

1.js 的eval函数及引擎调用方法

   我的审美实在是不够,所以可以只参考以下的使用方法,然后自己自然的发挥

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

 /*
  * @param String numberString  接受的要计算的字符串
  *   
  * @return 分情况返回,1.计算结果 2.计算是否合法 
  * 
  * */

public static String js(String numberString) throws ScriptException
{
        try {
        	ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
    		ScriptEngine engine = scriptEngineManager.getEngineByName("javascript");
    		Object reString = engine.eval(numberString);
    		if(reString.toString().equals("Infinity"))
    		{
    			return "0不能当除数嗷";
    		} else {
    			System.out.println(reString.toString());
        	    return reString.toString();
		}
    	        
        }catch (Exception e) {
	        //当计算有误就会出现异常		
	}
       
	    return "error!";
}

 

 2.我写的又丑,又傻的计算器

布局是borderlayout,为了自己能清楚布局结构,我就在四周加了颜色.


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
//js引擎用来调用js
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class myCalculator extends JFrame implements ActionListener{
	
	
	JTextField lastJTextField = new JTextField(22);
	JTextField nowJTextField = new JTextField(22);
	String[] buttonContent = new String []{"x^2","x^3","√x","Back","1/x","%","C","CE","7", "8","9","/","4","5","6","*","1","2","3","-",".","0","=","+"};
	JButton[] keyButton =new JButton[buttonContent.length];
	public myCalculator() {
		// TODO Auto-generated constructor stub
		super("计算器");
		this.setBounds(0, 0, 500, 500);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLayout(new BorderLayout());
		int x = 20;
		int y = 55;
		JPanel topJPanel = new JPanel();
		// 设置
		topJPanel.setBounds(0, 0, 500, 200);
		topJPanel.setBorder(BorderFactory.createLineBorder(Color.red, 3));
		topJPanel.setBackground(Color.blue);
		topJPanel.add(lastJTextField);
		topJPanel.add(nowJTextField);
		lastJTextField.setEditable(false);
		lastJTextField.setText("");
		nowJTextField.setText("");
		JPanel leftJPanel = new JPanel();
		leftJPanel.setBackground(Color.yellow);
		JPanel rightJPanel = new JPanel();
		rightJPanel.setBackground(Color.black);
		JPanel bottomJPanel = new JPanel();
		bottomJPanel.setBackground(Color.red);
		
		JPanel centerJPanel = new JPanel();
			centerJPanel.setLayout(new GridLayout(6,4,2,2));
		
		System.out.println(buttonContent[15]);
		for (int i=0;i<buttonContent.length;i++) {
			this.keyButton[i] = new JButton();
			this.keyButton[i].setText(buttonContent[i]);
			keyButton[i].setBounds(x, y, 60, 40);
        }
		ImageIcon imgIcon = new ImageIcon("C:\\Users\\lenovo\\Desktop\\Back.png");

		imgIcon.setImage(imgIcon.getImage().getScaledInstance(25, 25,Image.SCALE_DEFAULT ));
		keyButton[3] = new JButton("Back",imgIcon);
		centerJPanel.add(keyButton[3]);
		for(int i=0;i<buttonContent.length;++i)
		{
			keyButton[i].addActionListener(this);
			centerJPanel.add(keyButton[i]);
			
		}
		this.keyButton[3].addActionListener(this);
		this.add(centerJPanel,BorderLayout.CENTER);
		this.add(topJPanel, BorderLayout.NORTH);
		this.add(leftJPanel, BorderLayout.WEST);
		this.add(rightJPanel, BorderLayout.EAST);
		this.add(bottomJPanel, BorderLayout.SOUTH);

		this.setVisible(true);
	}

	public static void main(String[] args) {
		
		  new myCalculator();
		  System.out.println();
		 

	}
	public static String js(String numberString) throws ScriptException
	{//这个算是计算的核心了
        try {
        	ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
    		ScriptEngine engine = scriptEngineManager.getEngineByName("javascript");
    		Object reString = engine.eval(numberString);
    		if(reString.toString().equals("Infinity"))
    		{
    			return "0不能当除数嗷";
    		}else {
    			System.out.println(reString.toString());
        	    return reString.toString();
			}
    	        
        }catch (Exception e) {
			// TODO: handle exception
		}
       
	    return "error!";
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getActionCommand().equals("CE")||e.getActionCommand().equals("x^2")||e.getActionCommand().equals("x^3")||e.getActionCommand().equals("Back")
				||e.getActionCommand().equals("=")||e.getActionCommand().equals("1/x")||e.getActionCommand().equals("C")||e.getActionCommand().equals("√x"))
		{
			if(e.getActionCommand().equals("x^3"))
			{
				//System.out.println(nowJTextField.getText());
				try {
					String numberString = nowJTextField.getText()+"*"+nowJTextField.getText()+"*"+nowJTextField.getText();
					System.out.println(numberString);
					nowJTextField.setText(js(numberString));
				} catch (ScriptException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			if(e.getActionCommand().equals("x^2"))
			{
				try {
					String numberString = nowJTextField.getText()+"*"+nowJTextField.getText();
					System.out.println(numberString);
					nowJTextField.setText(js(numberString));
				} catch (ScriptException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
			}
			if(e.getActionCommand()=="√x")
			{
				double x = Float.parseFloat((nowJTextField.getText()));
				double result = Math.sqrt(x);
				System.out.println(result);
				nowJTextField.setText(""+result);
			}
			if(e.getActionCommand().equals("Back"))
			{
				String xString = lastJTextField.getText().toString();
				String nowString = nowJTextField.getText().toString();
				if(nowString.length()>0)
				{
					String reString = xString.substring( 0, xString.length()-1);
					String nString = nowString.substring(0,nowString.length()-1);
					System.out.println(123+" "+reString);
					lastJTextField.setText( reString );
					nowJTextField.setText(nString);
				}
				
				//nowJTextField.setText(substring( 0,nowJTextField.getText().length() ));
			}
			if(e.getActionCommand().equals("1/x"))
			{
				if(!nowJTextField.getText().equals("0")) {
					double x = Float.parseFloat((nowJTextField.getText()));
					double result = 1/x;
					System.out.println(result);
					nowJTextField.setText(""+result);	
				}else {
					nowJTextField.setText("1/0,是∞");
				}
			}
			if(e.getActionCommand().equals("="))
			{
				try {
					nowJTextField.setText(js(lastJTextField.getText()));
				} catch (ScriptException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				//Caculate();
			}
			if(e.getActionCommand().equals("C"))
			{
				nowJTextField.setText("");
				lastJTextField.setText("");
			}
			if(e.getActionCommand().equals("CE"))
			{
				nowJTextField.setText("");
			}
			
		}else {//进行算式的加法
			for(int i=0;i<buttonContent.length;++i)
			{
				if(e.getActionCommand().equals( keyButton[i].getActionCommand()) )
				{
					nowJTextField.setText(keyButton[i].getText());
					lastJTextField.setText(lastJTextField.getText()+nowJTextField.getText());
					
				}
			}
		}
	
		
	}


}