学了J2SE半个月,自己独立写的第一个小东西——计算器(bug待修复啊~)

看了马士兵老师的视频差不多半个多月了,聊天的项目也看完了,真的觉得马士兵老师讲的挺好的,有趣而且很尽责,讲的很透,但又不是不给你自己思考的余地。

总之,终于开始自己写一些称得上是程序的小玩意儿了,先拿计算器练练手吧。发个博,作为学习轨迹记录下来。

个人觉得还有两个主要的问题没有解决。

首先,界面很奇怪,不知道怎么改变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;
		}
	}

}


计算器 一、 背景描述 该计算器模仿Windows自带的计算器,只实现标准型计算器功能。 在完成Swing的学习后,练习使用Swing包中JFrame、JButton、JLabel、JTextField、JMenu、JMenuItem等组件完成图形界面绘制。 二、 实现要求 前期能够独立思考并完成计算器的逻辑代码。 三、 实现技术 a) 熟练使用JButton、JTextField、JLabel等Swing包中组件。 b) 熟练使用BorderLayout、FlowLayout、BoxLayout、GridLayout等布局。 c) 能够根据需要覆盖paint函数,定制自己需要的组件。 四、 类图 a) 类图 b) 类图说明 类名称 Calculator 类描述 计算器界面类。 包描述 main 函数描述 Calculator() 计算器界面类缺省构造函数。 private void initMenu() 初始化菜单添加。 private void initButton() 初始化按钮。按钮的初始化、部署、事件添加等。 private void initAdd() 初始化各个容器的添加。 public void actionPerformed(ActionEvent e) 处理按钮事件。1.复制事件2.粘贴事件,此处应用正则表达式(详细请参考类 java.util.regex.Pattern)解析粘贴板中的内容,仅得到内容中最后的数字和小数点。3.关于事件 private boolean isContain(String str,String ch) 检测某字符串中是否包含某个字符串。 private void showResult(String result) 设置计算的得到的结果。 private void clearAll(String result) 清空结果。 private void countResult(double value2) 计算结果并显示结果。 内部类 private class ButtonListener extends AbstractAction 按钮事件。包括+、-、*、/、1/x、数字等按钮事件。 此类继承AbstractAction 类名称 CalculateButton 类描述 定制自己的按钮类。练习自己定制按钮。比如定制按钮的高度、宽度、文字等。 包描述 main 函数描述 public CalculateButton(Action listener,String text,int key,boolean isctrl) 构造一个具有缺省事件、指定文本、指定快捷键的JButton。 public CalculateButton(Action listener,String text,int key,boolean isctrl,Color color) 构造一个具有缺省事件、指定文本、指定快捷键、指定文本颜色的JButton。 public CalculateButton(Action listener,String text,int key,boolean isctrl,Color color,int width,int height) 构造一个具有缺省事件、指定文本、指定快捷键、指定文本颜色的JButton。 protected void paintBorder(Graphics g) 绘制边界。 c) 效果图 五、 技术技巧提问 a) 思考用户如果多次连续按如+、-、*、/等键时,应该怎么处理?请仔细考虑好该逻辑。 b) 练习使用剪贴板的功能,实现复制、粘贴功能。考虑当粘贴板中数据值带有多个小数点时如何处理然后显示到文字框上。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值