JAVA 学习之路一 自己制作一个计算机

一、创建项目

  1. 以 Calculators 为项目名称 ,以com.xiaojun.calculators 为包名, 以 Calculators 为类名 创建项目

二、做一个计算机的页面出来在这里插入图片描述

先列出需要的字段,和功能属性

  1. super: 使用指定的标题创建一个最初不可见的新框架。

  2. setLayout:设置此容器的布局管理器

  3. setBounds:移动此组件并调整其大小。左上角的新位置由x和y指定,新大小由宽度和高度指定。

  4. setHorizontalAlignment:设置文本的水平对齐方式,有效键为:
    •JTextField.LEFT
    •JTextField.CENTER
    •JTextField.RIGHT
    •JTextField.LEADING
    •JTextField.TRAILING

  5. setEditable:设置指定的布尔值以指示此TextComponent是否应可编辑。状态更改时将触发PropertyChange事件(“可编辑”)。

  6. setResizable:设置此框架是否可由用户调整大小

  7. setBounds:移动此组件并调整其大小。左上角的新位置由x和y指定,新大小由宽度和高度指定。

  8. setDefaultCloseOperation:设置当用户在此帧上启动“关闭”时默认情况下将发生的操作。必须指定以下选项之一:
    •关闭时不执行任何操作(在WindowConstants中定义):不执行任何操作;要求程序在已注册的WindowListener对象的windowClosingmethod中处理操作。
    •HIDE \u ON \u CLOSE(在WindowConstants中定义):在调用任何已注册的WindowListenerobjects后自动隐藏帧。
    •DISPOSE ON \u CLOSE(在WindowConstants中定义):在调用任何已注册的WindowListenerobjects后自动隐藏和释放帧。
    •EXIT ON \u CLOSE(在WindowConstants中定义):使用系统退出方法退出应用程序。仅在应用程序中使用。
    默认情况下,该值设置为HIDE \u ON \u CLOSE。更改此属性的值会触发属性名为“defaultCloseOperation”的propertychange事件。
    注意:当Java虚拟机(VM)中最后一个可显示的窗口被释放时,VM可能会终止。有关详细信息,请参阅AWT线程问题。

  9. setVisible:根据参数b的值显示或隐藏此窗口。

  10. setText :设置按钮的文本

  11. 代码展示:

package com.xiaojun.calculators;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Calculators extends JFrame implements ActionListener {
	private String[] KEYS = {"7","8","9","*","4","5","6","-","1","2","3","+","0","e","π","/","c","%",".","=","(",")","sqr","x*x"};
	private JButton keys[]=new JButton[KEYS.length];
	private JTextField resulText = new JTextField("0.0");
	private String b= "";
	
	public Calculators(){
		super("计算机");	// 标题
		/** 
		* 未设置Layout时,java默认为flowLayout布局的,设置为null即为清空布局管理器,
		* 之后添加组件,常常是设置组件左上角坐标相对于容器左上角(0,0)的x,y值来确定组件
		* 的位置,即使更改容器大小也不会改变位置。这种方式常常用于窗体大小固定的容器里
		*/
		this.setLayout(null);	
		
		resulText.setBounds(20,5,255,40); // 计算机输出框大小
		resulText.setHorizontalAlignment(JTextField.RIGHT); // 输出文本位置右对齐
		resulText.setEditable(false);	// 用户不可编辑
		this.add(resulText);	// 添加到布局中
		int x=20,y=55;
		for(int i=0;i<KEYS.length; i++) {
			keys[i] = new JButton();
			keys[i].setText(KEYS[i]);
			keys[i].setBounds(x,y,60,40);
			if(x<215) {
					x+=65;
			}else {
				x=20;
				y+=45;
			}
			this.add(keys[i]);
		}
		for (int i = 0; i < KEYS.length; i++) {
			keys[i].addActionListener(this);
		}
		this.setResizable(false); // 不可随意拉伸窗口
		this.setBounds(500,200,300,400); // 设置窗口大小及位置
		/** 
		* 设置一个默认的关闭操作,也就是你的JFrame窗口的关闭按钮,点击它时,退出程序。
		* 不写的话,也是可以关闭窗口的,但是并没有结束程序的进程。写上的话,在关闭窗口的同时,
		* 会结束这个进程
		*/
		this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
		/** 
		* 方法的意思是说数据模型已经构造好了,允许JVM可以根据数据模型执行paint方法开始画图并
		* 显示到屏幕上了,并不是显示图形,而是可以运行开始画图了。这个方法和java多线程的start
		* 方法有点异曲同工之妙,start方式是允许run方法运行了,start方法和setVisible方法很相似。
		* 但为了安全起见,还是要把setVisible方法放到最后面。
		*/
		this.setVisible(true);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO 自动生成的方法存根
		
	}
	public static void main(String[] args) {
		Calculators calculators =new Calculators();
	}
	
	
}

以上只展示计算器界面,下面将进行用户点击按钮触发事件

三 、运算逻辑及事件交互

public void actionPerformed(ActionEvent e) {
   	String label = e.getActionCommand();  // 获得用户点击按钮的数值

   	if (label == "⬅") { // 回退
   		System.out.println(this.b.length());
   		if (this.b == null || this.b.length() == 0) {
   			this.b = "";
   		} else {
   			this.b = this.b.substring(0, this.b.length() - 1);
   			resulText.setText(this.b);
   		}
   	} else if (label == "c" || label == "=") {	// 清除 与 结果
   		if (label == "c") {
   			this.b = "";
   			resulText.setText("");
   		} else {
   			String s[] = yunsuan(this.b);	// 调用运算方法
   			String a = Result(s);	// 调用结果方法
   			this.b = a;
   			resulText.setText(this.b);	// 输出
//				System.out.println(Arrays.toString(s));
   		}
   	} else if (label=="sqr")//sqr 按钮计算开方
       {
           String n=yunsuan2(this.b); // 调用开方方法
           resulText.setText(n);
           this.b=n;
       } else if(label=="x*x")//x*x按钮实现某个数的平方
       {
           String m=yunsuan3(this.b);
           resulText.setText(m);
           this.b=m;
       } else {
   		this.b = this.b + label;
   		resulText.setText(this.b);

   	}
   }

   public String[] yunsuan(String str) {	// 运算方法 将用户输入的 计算式子 由中缀改为后缀返回

   	String s = "";
   	char a[] = new char[100];	// 创建接收运算符的数组
   	String jieguo[] = new String[100];	// 接收 由中缀 变 后缀式子 的数组
   	int top = -1, j = 0;	// 创建指针 
   	for (int i = 0; i < str.length(); i++) {	
   		if ("0123456789.".indexOf(str.charAt(i)) >= 0) { // 判断是数字及小数的进
   			s = "";
   			for (; i < str.length() && "0123456789.".indexOf(str.charAt(i)) >= 0; i++) {
   				s = s + str.charAt(i);	// 获取连续数字
   			}
   			i--;
   			System.out.println(" i = " + i + " s = " + s);
   			jieguo[j] = s;	// 将获得的数字添加到数组
   			j++; // 下标向后移
   		} else if ("(".indexOf(str.charAt(i)) >= 0) {	// 是左括号的进
   			top++;	
   			a[top] = str.charAt(i); // 直接增加到运算附数组

   		} else if (")".indexOf(str.charAt(i)) >= 0) {
   			for (;;) { // 无限循环,遇到break跳出
   				if (a[top] != '(') { 
   					jieguo[j] = a[top] + ""; // 添加 遇到左括号之前的所有运算符到 后缀数组
   					j++;
   					top--; // 指针回退
   				} else {
   					top--;	
   					break;
   				}
   			}

   		} else if ("x÷%".indexOf(str.charAt(i)) >= 0) {
   			if (top == -1) {	// 当运算符数组没有值时 直接将运算符赋值到运算符 a 数组
   				top++;
   				a[top] = str.charAt(i); 
   			} else {
   				if ("x÷%".indexOf(a[top]) >= 0) {
   					jieguo[j] = a[top] + "";	// 优先执行 优先级高的运算符, 同级执行先添加的
   					j++;
   					a[top] = str.charAt(i);	// 将后添加的运算符添加到 a 中
   				} else if ("(".indexOf(a[top]) >= 0) {
   					top++;
   					a[top] = str.charAt(i);	// 同上
   				} else if ("+-".indexOf(a[top]) >= 0) {
   					top++;
   					a[top] = str.charAt(i);	// 优先级低 直接添加
   				}

   			}
   		} else if ("+-".indexOf(str.charAt(i)) >= 0) {
   			if (top == -1) {
   				top++;
   				a[top] = str.charAt(i);
   			} else {
   				if ("x÷%".indexOf(a[top]) >= 0) {
   					jieguo[j] = a[top] + "";
   					j++;
   					a[top] = str.charAt(i);
   				} else if ("(".indexOf(a[top]) >= 0) {
   					top++;
   					a[top] = str.charAt(i);
   				} else if ("+-".indexOf(a[top]) >= 0) {
   					jieguo[j] = a[top] + "";	// 同级优先执行
   					j++;
   					a[top] = str.charAt(i);
   				}
   			}
   			System.out.println(Arrays.toString(a));
   		}
   	}
   	System.out.println(top);
   	for (; top != -1;) {	// 将剩下的运算符都赋值到 jieguo 数组中
   		jieguo[j] = a[top] + "";
   		j++;
   		top--;
   	}
   	System.out.println(Arrays.toString(jieguo));
   	return jieguo; // 返回后缀表达式数组
   }

   public String Result(String str[]) { // 执行后缀表达式 返回运算结果
   	String result[] = new String[100]; // 创建保存结果的数组
   	int Top = -1; 
   	for (int i = 0; str[i] != null; i++) {
   		System.out.println("+-x÷%".indexOf(str[i]));
   		if ("+-x÷%".indexOf(str[i]) < 0) { // 判断不为运算附的进 ,直接添加
   			Top++;
   			result[Top] = str[i];
   		} else {
   			double x, y, n;	
   			// 获取数值
   			x = Double.parseDouble(result[Top]);	
   			Top--;// 指针回退
   			y = Double.parseDouble(result[Top]);
   			Top--;
   			System.out.println("x = " + x+","+"y = " + y);
   			// 执行运算
   			if ("+".indexOf(str[i]) >= 0) {
   				n = y + x;
   				Top++;
   				result[Top] = String.valueOf(n);
   			} else if ("-".indexOf(str[i]) >= 0) {
   				n = y - x;
   				Top++;
   				result[Top] = String.valueOf(n);
   			} else if ("x".indexOf(str[i]) >= 0) {
   				n = y * x;
   				Top++;
   				result[Top] = String.valueOf(n);
   			} else if ("÷".indexOf(str[i]) >= 0) {
   				n = y / x;
   				Top++;
   				result[Top] = String.valueOf(n);
   			} else if ("%".indexOf(str[i]) >= 0) {
   				n = y % x;
   				Top++;
   				result[Top] = String.valueOf(n);
   			} 
   		}
   	}
   	System.out.println("result = " + Arrays.toString(result));
   	return result[Top]; 返回最后结果
   }

   public String yunsuan2(String str) {
   	String result = "";
   	double a = Double.parseDouble(str), b = 0;
   	b = Math.sqrt(a);
   	result = String.valueOf(b);
   	return result;
   }
   public String yunsuan3(String str)
   {
       String result="";
       double a=Double.parseDouble(str),b=0;
       b=Math.pow(a, 2);
       result=String.valueOf(b);
       return result;
   }
  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值