1建立窗口
- 观察计算机的窗口,随后进行建议设置
- 先设置出一个大的窗口
- 分割成两大块,一块为文本框、一块为按钮
- 将按纽通过网格进行4*4的实现,其中通过将按钮文字存在数组中解决不一样按钮文字的展示
void run() {
JFrame frame = new JFrame("calcultor");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//在窗口显示之前,将文本框,按钮创建出来
tf = new JTextField();
//设定大小
tf.setPreferredSize(new Dimension(400, 60));
bt = new JButton();
//添加到窗口中
frame.getContentPane().add(tf, BorderLayout.NORTH);
frame.getContentPane().add(bt, BorderLayout.CENTER);
//内容面板,帮助组合布局
JPanel p = new JPanel();
//变成网格布局
p.setLayout(new GridLayout(4, 4));
//添加16个按钮
for (int i = 0; i < 16; i++) {
JButton bt = new JButton(BtText[i]);
p.add(bt);
//点击按钮进行事件响应
bt.addActionListener(this);
}
frame.getContentPane().add(p, BorderLayout.CENTER);
frame.setSize(300, 400);
// 方法的意思是说数据模型已经构造好了,
// 允许JVM可以根据数据模型执行paint方法开始画图并显示到屏幕上了,
// 并不是显示图形,而是可以运行开始画图了。
// 这个方法和java多线程的start方法有点异曲同工之妙,
// start方式是允许run方法运行了,start方法和setVisible方法很相似
frame.setVisible(true);
}
2实现ActionListener——监听事件
- 实现ActionListener后,会自动重写actionPerformed方法,在其中,进行整个逻辑的实现。
- 先通过if-else将按钮文字进行分类:数字类、操作符类(operator)以及小数点
- 数字类:注意是第一个数字还是操作符后的第二个数字。通过operator的初始值判断后将数字放入相应的位置
- 操作符类:通过switch进行相应的操作,注意使用BigDecimal避免精度丢失
- 小数点:通过判断是否为第一个数字(只能输入一个小数点还未解决,随后跟进)
-
public void actionPerformed(ActionEvent e) { //处理按钮的点击事件 //默认标签上的文字 String action = e.getActionCommand(); char act = action.charAt(0); if (act >= '0' && act <= '9') { //确保不是只能输入一个数字 //使用感叹号表示其还没有填入运算符,来判断是否放置在数字b中 if (operator == '!') { //保证不输入0000111这类型数字 // if (act == '0') { // if (strA.length() > 0) { // strA += action; // //放置在文本框中 // tf.setText(strA); // } // } else { strA += action; //放置在文本框中 tf.setText(strA); // } } else { strB += action; //放置在文本框中 tf.setText(strB); } } else if (act == '+' || act == '-' || act == '*' || act == '/') { tf.setText(String.valueOf(act)); operator = act; } else if (act == '=') { //解决丢失精度问题 // 加法 add()函数 减法subtract()函数 // 乘法multiply()函数 除法divide()函数 绝对值abs()函数 BigDecimal a = new BigDecimal(Double.parseDouble(strA)); // Double a = Double.parseDouble(strA); BigDecimal b = new BigDecimal(Double.parseDouble(strB)); // Double b = Double.parseDouble(strB); double res; switch (operator) { case '+': res = a.add(b).doubleValue(); //整形+""转换成字符串 tf.setText(res + ""); break; case '-': res = a.subtract(b).doubleValue(); //整形+""转换成字符串 tf.setText(res + ""); break; case '*': res = a.multiply(b).doubleValue(); //整形+""转换成字符串 tf.setText(res + ""); break; case '/': //在进行divide操作的时候,scale表示保留几位小数,第三个参数表示四舍五入操作 res = a.divide(b, 10, BigDecimal.ROUND_HALF_DOWN).doubleValue(); //整形+""转换成字符串 tf.setText(res + ""); break; } //把操作的制空,保证下一次操作的正常进行 operator = '!'; strA = ""; strB = ""; } else if (act == '.') { if (operator == '!' && strA != "") { if (flag = true) { strA += action; tf.setText(strA); flag = false; } } if (strB != "") { if (flag2 == true) { strB += action; flag2 = false; } } } }