java计算器(图型界面)

package xjj;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;

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

public class Calculator extends JFrame implements ActionListener{
	private JTextField text;
	private BigDecimal bigDecimal_a,bigDecimal_b,bigDecimal_result;
	private boolean isFirst=true,isPoint=true,isEqual=false;
	private String str;
	private int operator;
	private JButton[] jbtns=new JButton[21];
	private String[] buttonName={"",
								 "±","C","←","÷",
								 "7","8","9","×",
								 "4","5","6","+",
								 "1","2","3","-" ,
								 "0",".","=",""};
	public Calculator(){
		super("计算器");
		Dimension dim=this.getToolkit().getScreenSize();
		this.getContentPane().setLayout(null);
		//this.getContentPane().setBackground(Color.CYAN);
		this.setBounds(dim.width*2/5, dim.height/4, dim.width/4, dim.height/2);
		this.setResizable(false);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		text=new JTextField(20);
		text.setBounds(new Rectangle(5, 3, 325, 40));
		text.setHorizontalAlignment(JTextField.RIGHT);
		text.setBackground(Color.CYAN);
		this.getContentPane().add(text);
		int count=1;
		for(int i=1;i<20;i++){
			jbtns[i]=new JButton();
			jbtns[i] = new JButton(buttonName[i]);
			jbtns[i].addActionListener(this);
			this.getContentPane().add(jbtns[i]);
			int k=i%4;
			if(i%4==0){
				k=4;
				jbtns[i].setBounds(5+(k-1)*85, 60*count, 70, 42);
				count++;
			}else{
				jbtns[i].setBounds(5+(k-1)*85, 60*count, 70, 42);
			}
		}
		jbtns[19].setBounds(5+2*85, 300, 155, 42);

		text.setFont(new Font("xjj",Font.BOLD,20));

		this.setVisible(true);
	}

	public static void main(String[] args) {
		new Calculator();
	}

	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==jbtns[19]){
			str=text.getText();
			if(!haveSign(str) && !isEqual){
				return ;
			}
			int i=calculator();
			if(i==0){
				return ;
			}
			isEqual=true;
			isFirst=true;
			text.setText(""+bigDecimal_result);
		}
		if(e.getSource()==jbtns[18] && isPoint ){
			isAddPoint();
			String s=str.substring(0,str.length()-1);
			if(havePoint(s)){
				return ;
			}
			isEqual=false;
			isPoint=false;
			text.setText(str);
		}
		if(e.getSource()==jbtns[1]){
			str=text.getText();
			if(str.length()==0){
				str="-";
				text.setText(str);
				return ;
			}
			if(str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='×'||str.charAt(str.length()-1)=='÷'){
				str=str+"-";
				text.setText(str);
				return ;
			}
		}
		if(e.getSource()==jbtns[3]&& !isEqual){
			str=text.getText();
			if(str.length()==0){
				return ;
			}
			if(str.length()==1){
				str="";
			}
			if(str.length()>=2){
				if(str.charAt(str.length()-1)=='÷' || str.charAt(str.length()-1)=='×' ||str.charAt(str.length()-1)=='+' ||str.charAt(str.length()-1)=='-'){
					isFirst=true;
				}
				str=str.substring(0, str.length()-1);
				if(havePoint(str)){
					isPoint=false;
				}else{
					isPoint=true;
				}
			}
			text.setText(str);
			return ;
		}
		if(e.getSource()==jbtns[2]){
			str="";
			isFirst=true;isPoint=true;isEqual=false;
			text.setText(str);
			return ;
		}
		JButton jbtn=(JButton)e.getSource();
		if(jbtn.getText().compareTo("0")>=0 && jbtn.getText().compareTo("9") <=0){
			str=text.getText()+jbtn.getText();
			isEqual=false;
			text.setText(str);
		}
		for(int i=4;i<=16;i+=4){
			if(e.getSource()==jbtns[i]&&isFirst){
				str=text.getText();
				if(str.length()==0){
					return ;
				}
				isEqual=false;
				operator=i;
				str=text.getText()+jbtns[i].getText();
				isFirst=false;
				isPoint=true;
				text.setText(str);
			}
		}
	}

	private int calculator() {
		str=text.getText();
		if(operator==4){
			String[] string=str.split("÷");
			if(string.length==1){
				bigDecimal_result=bigDecimal_result.divide(bigDecimal_b,5,BigDecimal.ROUND_HALF_UP);
				bigDecimal_result=bigDecimal_result.stripTrailingZeros();
				return 1;
			}
			bigDecimal_a=new BigDecimal(string[0]);
			bigDecimal_b=new BigDecimal(string[1]);
			if(bigDecimal_b.compareTo(BigDecimal.ZERO)==0){
				return 0;
			}
			bigDecimal_result=bigDecimal_a.divide(bigDecimal_b,20,BigDecimal.ROUND_HALF_UP);
			bigDecimal_result=bigDecimal_result.stripTrailingZeros();

		}
		if(operator==8){
			String[] string=str.split("×");
			if(string.length==1){
				bigDecimal_result=bigDecimal_result.multiply(bigDecimal_b);
				bigDecimal_result=bigDecimal_result.stripTrailingZeros();
				return 1;
			}
			bigDecimal_a=new BigDecimal(string[0]);
			bigDecimal_b=new BigDecimal(string[1]);
			bigDecimal_result=bigDecimal_a.multiply(bigDecimal_b);
			bigDecimal_result=bigDecimal_result.stripTrailingZeros();
		}
		if(operator==12){
			String[] string=str.split("+");
			if(string.length==1){
				bigDecimal_result=bigDecimal_result.add(bigDecimal_b);
				bigDecimal_result=bigDecimal_result.stripTrailingZeros();
				return 1;
			}
			bigDecimal_a=new BigDecimal(string[0]);
			bigDecimal_b=new BigDecimal(string[1]);
			bigDecimal_result=bigDecimal_a.add(bigDecimal_b);
			bigDecimal_result=bigDecimal_result.stripTrailingZeros();
		}
		if(operator==16){
			String[] string=str.split("-");
			if(string.length==1){
				bigDecimal_result=bigDecimal_result.subtract(bigDecimal_b);
				bigDecimal_result=bigDecimal_result.stripTrailingZeros();
				return 1;
			}
			bigDecimal_a=new BigDecimal(string[0]);
			bigDecimal_b=new BigDecimal(string[1]);
			bigDecimal_result=bigDecimal_a.subtract(bigDecimal_b);
			bigDecimal_result=bigDecimal_result.stripTrailingZeros();
		}
		return 1;
	}
	public void isAddPoint(){
		str=text.getText();
		if(str.length()==0){
			str="0.";
			return ;
		}
		if(str.charAt(str.length()-1)>'9'||str.charAt(str.length()-1)<'0'){
			str=str+"0.";
			return ;
		}
		str=text.getText()+".";
	}
	public boolean haveSign(String s){
		for(int i=0;i<s.length();i++){
			if(s.charAt(i)=='+' || s.charAt(i)=='-' ||s.charAt(i)=='÷' ||s.charAt(i)=='×'){
				return true;
			}
		}
		return false;
	}
	public boolean havePoint(String s){
		int count=0;
		for(int i=0;i<s.length();i++){
			if(s.charAt(i)=='.' ){
				count++;
			}
		}
		if(count==1 && haveSign(s)){
			return false;
		}
		if(count==0 ){
			return false;
		}
		return true;
	}
}
时间: 2024-12-29 13:49:40

java计算器(图型界面)的相关文章

java之 ------ 图型界面(一)

import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GraphicsEnvironment; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListene

java之图形化界面(GUI)

一.概述 用户与计算机进行交换的方式有两种: GLI:Command lin User Interface(命令行用户接口),也就是常见的dos窗口,它需要记住一些常用的命令,操作不直观方便. GUI:Graphical User Interface(图形用户接口),用图形的方式,来显示计算机操作的界面,这样更方便直观. 这两种交换方式就对应两种交互界面:命令行界面和图形化界面. 现在图形化界面是主流. Java为GUI提供的对象都在java.awt和javax.swing这两个包中. Awt和

java Swing图形化界面

学过java的人应该对java的图形化界面很是反感,特别是接触java不久的人.如果想和其他语言那样用鼠标拖拽,可以使用wondosbulider插件.但是用起来也不是那么方便.当然对于不乐意写代码的人来说真是太幸福了. 然而用代码去实现java的图形化界面并非那么麻烦.总结起来就是~ 1.定义你需要使用的面板,按钮,文本,标签. 2.对这些实例化.  然后把按钮,文本,标签按照你想要的方法放到面板上. 3.把面板放在界面上.  如果界面简单的话,面板也是可以不使用的,面板可以方便管理一些按钮.

Java图形化界面设计——容器(JFrame)

Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程. 一.Java基本类(JFC) Java基本类(“JavaFoundationClasses”,JFC),由一些软件包组成.这些软件包主要包括下面一些应用程序接口(API): ·抽象窗口工具集(AWT)(1.1及以上版本). ·Swing构件. ·Java 2D应

三十一、Java图形化界面设计——布局管理器之GridLayout(网格布局)

摘自http://blog.csdn.net/liujun13579/article/details/7772491 三十一.Java图形化界面设计--布局管理器之GridLayout(网格布局) 网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相同,等于容器的宽度除以网格的列数. l  网格每行高度相同,等于容器的高度除以网格的行数. l  各组件的排列方式为:从上到下,从左到右. l  组件放入容器的次序决定了它在容器中的位置. l  容器大小改变时,组件

二十七、Java图形化界面设计——容器(JFrame)

摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程. 一.Java基本类(JFC) Java基本类("JavaFoundationClasses",JFC),由一些软件包组成.这些

Java学习之图形化界面(Swing基础)

Java学习之图形化界面(Swing基础) 一.Java图形化界面发展史 起初在早期的计算机系统中,电脑只提供命令行界面(CLI),现在在Windows中开个DOS窗口,就可以历史足迹,这就是命令行界面在 现在Windows界面中的体现. 后来Apple公司率先在电脑的操作系统中实现了图形化的用户界面(Graphical User Interface,简称GUI),但由于Apple公司封闭的市场策略,自己完成电脑硬件.操作系统.应用软件一条龙的产品,与其它PC不兼容.这使得Apple公司错过了一

java工程开发之图形化界面之(第三课)

上面我们讲述了通过JOptionPane进行文本I/O操作,一个是通过JOptionPane来获取的 参考链接:http://blog.sina.com.cn/s/blog_993d254201013pgh.html#cmt_3339216 JOptionPane类 1.属于javax.swing 包. 2.功能:定制四种不同种类的标准对话框. ConfirmDialog 确认对话框.提出问题,然后由用户自己来确认(按"Yes"或"No"按钮) InputDialo

三十三、Java图形化界面设计——布局管理器之null布局(空布局)

摘自http://blog.csdn.net/liujun13579/article/details/7774267 三十三.Java图形化界面设计--布局管理器之null布局(空布局) 一般容器都有默认布局方式,但是有时候需要精确指定各个组建的大小和位置,就需要用到空布局. 操作方法: 1)       首先利用setLayout(null)语句将容器的布局设置为null布局(空布局). 2)       再调用组件的setBounds(int x, int y, int width,int