声明:
由于本人是Java初学者,对Java语言理解不是很透彻
以下代码部分参考了许多课本和网上的一些资料,经过本人对这些资料的理解,所以写下了以下程序代码
经运行测试,已经完全实现了计算器的基础功能,并且能够对运行界面进行鼠标点击操作和键盘输入操作。
本人已将代码进行了注释,如果有不懂的地方可细看后面注释进行理解。
设计思路:
运用字符串转换成算术运算的思想
先定义按钮文本框以及窗口
其次将按钮事件和按压键盘事件生成的字符串放置在文本框中
最后按等号或Enter键将文本框中的字符串转换成算术表达式运算为结果,最后输出到文本框中
计算器实现的功能:
已实现加、减、乘、除、正负号、退格、将百分数转换成实数、清零、取倒数、百分数转换等功能
相关组件能够进行按钮事件和键盘事件处理
代码部分:
import java.awt.*;
import java.awt.event.*;
import javax.script.*;
import javax.swing.*;
public void keyTyped(KeyEvent e)
{
}
public void keyPressed(KeyEvent e) //键盘按键监听
{
char label=e.getKeyChar();
String k=String.valueOf(label);
if(label==KeyEvent.VK_ENTER)
{
handleResult();
}
else if(label==KeyEvent.VK_BACK_SPACE)
{
String s = resultText.getText();
if(s!=null)
{
handleBackspace(); //调用定义的处理←方法
}else
{
resultText.setText(s);
}
}
else
{
handleEquation(k); //按下数字和运算符号的叠加
}
}
public void keyReleased(KeyEvent e)
{
}
public void actionPerformed(ActionEvent e) //按钮监听
{
String label=e.getActionCommand(); //获取该按键内容
if(label.equals("1/x")) //判断按钮输入内容
{
handleReciprocal(); //调用定义的处理1/x方法
}
else if(label.equals("←")) {
String s = resultText.getText();
if(s!=null)
{
handleBackspace(); //调用定义的处理←方法
}else
{
resultText.setText(s);
}
}
else if(label.equals("="))
{
handleResult(); //调用定义的处理=方法
}
else if(label.equals("C"))
{
handleC(); //调用定义的处理C方法
}
else if(label.equals("±"))
{
handleOppositeNumber(); //调用定义的处理±方法
}
else if(label.equals("%"))
{
handlePercent(); //调用定义处理百分比方法
}
else
{
handleEquation(label); //调用算式处理方法
}
}
public void handleOppositeNumber() //定义符号反转方法
{
String strText = resultText.getText();
Double a = Double.parseDouble(strText);
a=a*(-1);
strText=String.valueOf(a);
resultText.setText(strText);
}
public void handleReciprocal() //定义1/x方法
{
String strText = resultText.getText();
Double a = Double.parseDouble(strText);
a=1/a;
strText=String.valueOf(a);
resultText.setText(strText);
}
public void handlePercent() //定义%方法
{
String strText = resultText.getText();
Double a = Double.parseDouble(strText);
a=a*(0.01);
strText=String.valueOf(a);
resultText.setText(strText);
}
public void handleEquation(String label) //定义算式处理方法
{
if(resultText.getText().equals("0"))
{
resultText.setText(label); //如果为文本框显示内容为0 则输出到文本框显示内容不变
}
else
{
resultText.setText(resultText.getText()+label); //如果初始状态不为0 则将字符串进行叠加
}
}
public void handleResult() //定义处理结果的方法
{
String text=resultText.getText();
try
{
Object a=jse.eval(text); //它可以把字符串转换为表态式并执行
text=String.valueOf(a);
resultText.setText(text);
}
catch (ScriptException e) //处理异常
{
resultText.setText("格式错误");
}
}
public void handleBackspace() //定义删除方法
{
String strText = resultText.getText();
strText = strText.substring(0,strText.length()-1);//删除最后一个字符串
resultText.setText(strText);
}
public void handleC() //定义C方法
{
resultText.setText("0");
}
public void centered(Container container) //定义屏幕自适应居中方法
{
Toolkit toolkit=Toolkit.getDefaultToolkit(); //定义一个抽象类 通过这个方法可以获取到Toolkit的对象
Dimension screenSize=toolkit.getScreenSize(); //获取主显示器屏幕分辨率大小 1920×1080
int w=container.getWidth(); //将屏幕的宽度赋给w 1920
int h=container.getHeight(); //将屏幕的高度赋给h 1080
container.setBounds((screenSize.width-w)/2, (screenSize.height-h)/2, w, h);//在屏幕中心显示
}
public static void main(String[] args) //主函数
{
Calculator test=new Calculator(); //运行函数
}
运行页面如下:
上述运行界面参照手机上的计算器进行制作
扩展软件包介绍:
- java.awt软件包:
抽象窗口工具包,包含创建图形界面和绘制图像的所有类。比如容器类、组建类、局部管理器类等 包括组件的颜色等 - java.awt.event软件包:
包含事件处理类。其中用到的有按钮事件处理和键盘事件处理 - javax.script软件包:
是后端java语言和前端语言javascript语言进行交互的中介。Java Scripting API 包含一组类和接口,这是一个相对比较小的 package包,以 ScriptEngineManager 类作为起点。 - javax.swing软件包
定义了顶层容器和轻量级组件
致谢:
最后特别感谢各位大佬的例程,我才能够更加深刻理解计算器的设计思路,编写出完整的代码。