看了马士兵老师的视频差不多半个多月了,聊天的项目也看完了,真的觉得马士兵老师讲的挺好的,有趣而且很尽责,讲的很透,但又不是不给你自己思考的余地。
总之,终于开始自己写一些称得上是程序的小玩意儿了,先拿计算器练练手吧。发个博,作为学习轨迹记录下来。
个人觉得还有两个主要的问题没有解决。
首先,界面很奇怪,不知道怎么改变GridLayout里面小格子的大小,BorderLayout用的也不熟,位置的放置还没调好。
其次,用的是double类型保存要运算的操作数,于是有时候运算的结果会出现小数点后很多个9啊或者0啊的近似值,不知道该改哪可以修复这个问题。
在图书馆借了书看别人的计算器代码,出书的真的是专业,计算器的功能太强大了,代码也多,看不进去,就自己写的功能比较简单的,只有加减乘除,个人觉得算法比较奇怪,也不知道到底用了面向对象的思维没有,总之,用java编程之后对我来说最困难的就是面向对象的编程思维了,什么if else(),for()循环等等控制语句,数组函数什么的,在C里面也学过,所以刚开始敲代码的时候脑子里都是面向过程的编程思维。这个计算器估计也不是很对象,虽说main方法里面就一句话。花了差不多一下午加晚上的时间把这个写完了,其间吃饭啊短暂休息了会。现在跟着马老师坦克大战的项目视频在学习,争取J2SE的基础巩固的更好一点吧。加油嘞~
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
public class Jisuanqi extends Frame {
static Jisuanqi j = new Jisuanqi();
private static final long serialVersionUID = 1L;
TextField tf = new TextField();
double ten = 10;
int jj = 0;
String yunsuanfu = null;
List<String> per = new ArrayList<String>();
double s1 = 0;
double ss1 = 0;
double sss1 = 0;//操作数2!!!
double sss2 = 0;//操作数1!!!
Button b1 = new Button("1");
Button b2 = new Button("2");
Button b3 = new Button("3");
Button b4 = new Button("4");
Button b5 = new Button("5");
Button b6 = new Button("6");
Button b7 = new Button("7");
Button b8 = new Button("8");
Button b9 = new Button("9");
Button b0 = new Button("0");
Button bjia = new Button("+");
Button bjian = new Button("-");
Button bcheng = new Button("*");
Button bchu = new Button("/");
Button bdian = new Button(".");
Button bdengyu = new Button("=");
public static void main(String[] args) {
j.lanuchFrame();
}
public void lanuchFrame () {
this.setTitle("ICY的计算器");
this.setLocation(400, 200);
this.setSize(230, 300);
this.setVisible(true);
this.add(tf, BorderLayout.NORTH);
tf.setEditable(false);
tf.setFocusable(false);
tf.setVisible(true);
Panel p1 = new Panel();
this.add(p1);
Panel p = new Panel();
//p.setSize(220, 275);
p.setVisible(true);
p1.add(p);
GridLayout gl = new GridLayout(4,4);
gl.setHgap(5);
gl.setVgap(4);
p.setLayout(gl);
p.add(b1);
p.add(b2);
p.add(b3);
p.add(bjia);
p.add(b4);
p.add(b5);
p.add(b6);
p.add(bjian);
p.add(b7);
p.add(b8);
p.add(b9);
p.add(bcheng);
p.add(b0);
p.add(bdian);
p.add(bdengyu);
p.add(bchu);
this.pack();
this.addWindowListener(new WindowAdapter() { //这句话:内部匿名类,以WindowAdapter为父类的一个新子类,重写了windowClosing()方法,并同时new了一个该子类的对象
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
jisuan();
}
public void jisuan() {
Numbers number = new Numbers();
Bdengyu dengyu = new Bdengyu();
Yunsuan yunsuan = new Yunsuan();
Dian dian = new Dian();
b1.addActionListener(number);
b2.addActionListener(number);
b3.addActionListener(number);
b4.addActionListener(number);
b5.addActionListener(number);
b6.addActionListener(number);
b7.addActionListener(number);
b8.addActionListener(number);
b9.addActionListener(number);
b0.addActionListener(number);
bdian.addActionListener(dian);
bjia.addActionListener(yunsuan);
bjian.addActionListener(yunsuan);
bcheng.addActionListener(yunsuan);
bchu.addActionListener(yunsuan);
bdengyu.addActionListener(dengyu);
}
class Yunsuan implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
yunsuanfu = null;
per.removeAll(per);
ten = 10;
sss2 = sss1;
yunsuanfu = e.getActionCommand().toString();
}
}
class Dian implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
per.add(e.getActionCommand().toString());
ten = (double) 0.1;
jj = per.size();
}
}
class Numbers implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
per.add(e.getActionCommand().toString());
getsss();
}
}
class Bdengyu implements ActionListener {
public void actionPerformed(ActionEvent e) {
double s = 0;
if(yunsuanfu == "+") {
s = sss1 + sss2;
}
if(yunsuanfu == "-") {
s = sss2 - sss1;
}
if(yunsuanfu == "*") {
s = sss1 * sss2;
}
if(yunsuanfu == "/") {
s = sss2 / sss1;
}
String str = (new Double(s)).toString();
tf.setText(str);
s1 = 0;
ss1 = 0;
sss1 = 0;
sss2 = 0;
per.removeAll(per);
ten = 10;
jj = 0;
yunsuanfu = null;
}
}
public void getsss() {
if(ten == (double)10) {
for(int i=0; i<per.size(); i++) {
s1 = s1 + ( Double.parseDouble(per.get(per.size()-1-i))*(double)(Math.pow(ten, i)) );
String str = (new Double(s1)).toString();
tf.setText(str);
}
ss1 = (double)s1;//(操作数1的整数部分,保存好,后期不能改动了,再跟小数部分加在一起成为完整的操作数1)
sss1 = (double)s1;
s1 = (double)0;
}
if(ten == (double)0.1) {
for(int i=jj; i<per.size(); i++) {
s1 = s1 + ( Double.parseDouble(per.get(i))*(double)(Math.pow(ten, i-jj+1)));
}
s1 = s1 +ss1;
sss1 = (double)s1;//完整的操作数1
String str = (new Double(s1)).toString();
tf.setText(str);
s1 = (double)0;
}
}
}