(一)实验目的
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());
}
}
}
}
}