计算器键盘输入update(非常有用)
- 格式:docx
- 大小:94.67 KB
- 文档页数:18
计算器update——实现键盘输入
吴蔓电工一2017.5.12
之前做计算器时就想实现键盘功能,但是当时还不太会,刚接触,就先实现了各种函数,但是一直想实现键盘输入和鼠标输入均可的计算器,所以我最近半个月一直断断续续在做,由于最近考试多所以进度很慢,今天刚好考完,就可以全身心投入了,做好了这个只有加减乘除的键盘鼠标输入的计算器。
由于时间有限,这次不做exe了。
这次的键盘输入我只是完成了基本的加减乘除,sin,cos等函数运算暂时没有考虑,但是这是一个可以用鼠标控制输入也可以键盘输入的计算器,主要功能:
按下home键——清零,清空结果文本框,可重新输入新的数字
按下ESC键——退出计算器
按下backspace键——退格
按下等号/回车——得到计算结果,但是如果按的是等号,结果文本框会多显示一个”=”在最后,但是不影响计算结果正确性。如下图:(界面中右下角hello没有任何功能,只是为了美观)
鼠标输入的逻辑——首先设置当前运算符是=,输入一个数字,然后输入运算符,一旦检测到输入运算符就应该要进入一个处理运算符的函数,然后由于当前运算符是=,就执行等号
那部分的程序(仅仅是获得目前输入的第一个数字),然后应该清空文本框,让firstDigit=true,又可以输入数字,并改变当前运算符为刚输入的运算符;再输入等号,又进入处理运算符的那个程序,但是当前运算符应该是刚刚输入的运算符,所以执行+-*/对应的运算程序,得到结果。
键盘输入的逻辑——按下操作数一,显示在文本框中——>按下运算符(+-*/),获取第一个操作数到resultNum中,清空文本框——>显示出运算符,再清除;——>按下操作数2,显示出来,按下等号,就获取操作数二,再做相应的计算得到结果显示出来。
关键是加减乘除四则运算用到的四个布尔变量——plus,sub,mul,div,他们最开始设置为false,一旦检测到相应的运算符按下就变为true,等号按下后根据谁是true做什么运算。
做的过程中遇到一些问题,主要有以下几个:
1.乘号,加号检测不到。使用if(e.getKeyCode()==KeyEvent.VK_SHIFT &&
e.getKeyCode()==61){//加号
System.out.println("你按了+键");
resultNum=getNumberFromText();
resultText.setText("");
plus=true;}是检测不到的,具体解决方法在代码中写的很清楚。
加号应该使用if(e.getKeyChar()=='+'){//加号
System.out.println("你按了+键");
resultNum=getNumberFromText();
resultText.setText("");
plus=true;
}才可以检测到。
2.加减乘除计算不正确,后来分析原来是因为第二个数字输入以后和运算符一起出现在结
果文本框中,当按下等号或者回车时,get到的除了第二个操作数还有运算符,所以结果不对,所以想清除掉运算符的显示,用的代码:
if((e.getKeyCode()>=KeyEvent.VK_0&& e.getKeyCode()<=KeyEvent.VK_9)){ if(e.getKeyChar()=='*'){//乘号,乘号必须放在下面这个if前面,否则就无效,且又必须放在这个检测数字的if语句中才有效,因为按乘号是shift+8,8是数字键,所以加号就不必放在这里
System.out.println("你按了*键");
resultNum=getNumberFromText();
resultText.setText("");
3.加号和乘号的顺序问题,这两个不是随便放就有效的,顺序和原因我都写在注释中了,
主要是由于加号是shift和=,没涉及到数字,而乘号是shift和8,有数字所以必须放在检测数字的if中(见代码)。
程序:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class KeyTest extends JFrame implements ActionListener,KeyListener{ private static final long serialVersionUID= 1L;
private final String[] KEYS={
"7","8","9","÷",
"4","5","6","*",
"1","2","3","-",
"0",".","=","+",
"BackSpace","AllClear","Exit","hello"};
private JTextField resultText=new JTextField("");
private JButton keys[]=new JButton[KEYS.length];
private boolean firstDigit=true;
private boolean plus,sub,mul,div;
private double resultNum=0.0;
//当前运算的运算符,初始化为=
private String operator="=";
//操作是否合法
private boolean operateValidFlag=true;
public KeyTest(){
super("键盘输入测试程序");