学Java累计15天,跟着老师的视频自己做了一个简易的计算器。
记录一下学习和制作的过程。
第一:制作界面
使用netbeans的图形界面设计,创建一个jFrame类,就可以进行组件的摆放,属性的设置等等的操作。
组件组成:按钮和标签。
按钮就是0,1,2,+,开始等的操作。标签作为显示屏。
第二:编写功能
使用字符串来接收每一次的点击。一个字符串 s 保存所有符合的点击内容,并且在标签上显示,另一个 l 保存运算符号之后的内容,用来转换为第二个运算数。
数字按钮的功能。
当点击数字按钮时,要看目前标签上的内容
标签内容只有0或者与上次计算结果相同时,点击的数字按钮相应的数字应该代替标签原有的内容。
private void jButton30ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String s;
JButton j1 = (JButton) evt.getSource();
if (jLabel1.getText().equals(num3 + " ")) {
jLabel1.setText("0");
}
if (isOp(jLabel1.getText())) {
l = l + j1.getText();
}
if (jLabel1.getText().equals("0")) {
s = j1.getText();
} else {
s = jLabel1.getText() + j1.getText();
}
jLabel1.setText(s);
}
小数点的功能。
一个数不可能出现两个小数点,所以要判断点击小数点之前是否有小数点。因为点击按钮之后的内容是以字符串的形式连接,而且前后两个数值分别可以有一个小数点,那么就要以运算符为分界,分别判断是运算符前有小数点还是运算符后有。如果有运算符,就只用判断运算符后是否已经出现小数点,即 l 中是否有小数点,没有就判断 s 。
private void jButton31ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String s;
s = jLabel1.getText();
if (isOp(jLabel1.getText())) {
if (l.indexOf('.') >= 0) {
s = jLabel1.getText();
} else {
s = jLabel1.getText() + ".";
l=l+".";
}
jLabel1.setText(s);
} else {
if (s.indexOf('.') >= 0) {
s = jLabel1.getText();
} else {
s = jLabel1.getText() + ".";
}
jLabel1.setText(s);
}
}
运算符的功能。
一按运算符,前面的即标签里的内容就要转换为一个数字保存起来了,这样按等号的时候就方便运算了。并且用char类型op保存运算符的符号。
private void jButton33ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
JButton j1 = (JButton) evt.getSource();
num1 = Double.parseDouble(jLabel1.getText());
op = j1.getText().charAt(0);
jLabel1.setText(jLabel1.getText() + op);
}
等于号的功能。
按等于号就意味着要开始运算了。可是要先从标签的内容中获取第二个运算数,别急,我们已经用 l 保存了第二个运算数的字符串类型了,转换为double类型即可。
然后用switch多分支选择结构,来确定做哪种运算。
private void jButton32ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
num2=Double.parseDouble(l);
BigDecimal b1=new BigDecimal(Double.toString(num1));
BigDecimal b2=new BigDecimal(Double.toString(num2));
switch (op) {
case '+':
num3 = b1.add(b2).doubleValue();
break;
case '-':
num3 = b1.subtract(b2).doubleValue();
break;
case '*':
num3 = b1.multiply(b2).doubleValue();
break;
case '/':
num3 = b1.divide(b2).doubleValue();
break;
default:
num3 = num1;
}
jLabel1.setText(num3 + " ");
num1 = 0;
num2 = 0;
l="";
}
遇到的问题。
测试的时候,我发现double直接运算是有误差的,因为计算机使用二进制存储的。所以,我查了一下资料,发现使用java.math.BigDecimal里的BigDecimal类运算。
BigDecimal b1=new BigDecimal(Double.toString(num1));
BigDecimal b2=new BigDecimal(Double.toString(num2));
定义两个BigDecimal类。
使用BigDecimal类里的方法来进行加减乘除的计算。这样就不会出现误差了。
一个自学小白的内心独白。
这段时间,java是我在中国慕课上学的,接触不深。这也是我第一次写简书,希望看到的大牛们多多批评指正。