简单计算器实现

实现一个简单的计算器,前面是一个文本框(操作数1),后面是标签(操作符),再后面是一个文本框(操作数2),然后是一个"="按钮(JButton),最后是一个文本框(结果)

(1)实现按钮ActionEvent事件的处理,点击等号获取计算结果,并显示在最后一个文本框;
(2)实现第二个文本框的ActionEvent事件处理,在第二个文本框按回车,直接获得计算结果,并显示在最后一个文本框。
(3)实现操作符标签的MouseEvent事件的处理,点击标签,可以更换标签的操作符,比如:将加号改成减号,从而实现减法功能,点击等号按钮,实现减法操作的结果,并显示在第三个文本框。
注:本系统中switch()的case表达式后不能使用字符串常量

在这里插入图片描述

package XueXiTong;
/*
 * 姓名:
 * 日期:2020/4/5
 * 功能:实现一个简单的计算器,前面是一个文本框(操作数1),
 * 后面是标签(操作符),再后面是一个文本框(操作数2)
 * ,然后是一个"="按钮(JButton),最后是一个文本框(结果)
(1)实现按钮ActionEvent事件的处理,点击等号获取计算结果,
并显示在最后一个文本框;
(2)实现第二个文本框的ActionEvent事件处理,在第二个文本框按回车,
直接获得计算结果,并显示在最后一个文本框。
(3)实现操作符标签的MouseEvent事件的处理,点击标签,
可以更换标签的操作符,比如:将加号改成减号,从而实现减法功能,
点击等号按钮,实现减法操作的结果,并显示在第三个文本框。
注:本系统中switch()的case表达式后不能使用字符串常量
 */
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.*;




import java.awt.*;
public class XiTi7_1 {
	public static void main(String[] args) {
		new CaculatorGUI();
		
	}
}
class CaculatorGUI extends JFrame implements ActionListener,MouseListener,MouseMotionListener
{
	private JPanel jp1;
	private JTextField jtf1,jtf2,jtf3;//定义文本框
	private JLabel jl1;//定义标签
	private JButton jb1,jb2;//定义按钮
	Operation op=null;//定义运算类的对象
	String operate ="+";//设置一个操作数
    String str[]={"+","-","*","/"};
    
	public CaculatorGUI()
	{
		jp1=new JPanel();
		jtf1=new JTextField(6);
		jtf2=new JTextField(6);
		jtf3=new JTextField(10);
		jl1=new JLabel("+");
		jb1=new JButton("=");
		jb2=new JButton("clear");
	
		//设置外观
		Font font=new Font("楷体",Font.BOLD,20);
		Font font1=new Font("宋体",Font.BOLD,20);
		Font font3=new Font("宋体",Font.BOLD,50);
		jl1.setFont(font3);
		jb1.setFont(font);
		jb2.setFont(font);
		jtf1.setFont(font1);
		jtf2.setFont(font1);
		jtf3.setFont(font1);
		
		//设置文本框内容居右
		jtf1.setHorizontalAlignment(JTextField.RIGHT);
		jtf2.setHorizontalAlignment(JTextField.RIGHT);	
		//设置文本框内容居右
		jtf3.setHorizontalAlignment(JTextField.RIGHT);
	
		
		//设置前景色
		Color color=new Color(0,0,250);
		jl1.setForeground(color);
		jb1.setForeground(color);
		jb2.setForeground(color);
		
		jp1.add(jtf1);
		jp1.add(jl1);
		jp1.add(jtf2);
		jp1.add(jb1);
		jp1.add(jtf3);
		jp1.add(jb2);		
		//设置布局
		this.setLayout(new GridLayout(1,1,10,10));
		jp1.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black), BorderFactory.createEmptyBorder(10, 10, 10, 10)));

		//添加JPanel到JFrame
		this.add(jp1);
		
		//监听注册--注册按钮事件到监听器frame
		jb1.addActionListener(this);//this代表这个Frame
		jb2.addActionListener(this);
		jl1.addMouseListener(this);
		jl1.addMouseMotionListener(this);
		jtf2.addActionListener(this);
		
		//设置窗体
		this.setTitle("王之计算");
		this.setSize(600,150);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    this.setLocationRelativeTo(this);
		this.setVisible(true);
	}
    int  cout=0;
	public void mouseClicked(MouseEvent e) {
		/*
		int cout=0;//这里有个错误,就是如果定义在函数里面
		//每次触发的时候cout就会置零
		if(e.getSource()==jl1)
		{
		  cout=e.getClickCount();
		}*/

		if(e.getClickCount()==1)
		{
           cout++;
      		if(cout==4)//不能放在else函数体的后面,不然数组会越界报错
      			//要先防止数组越界
       		{
       			cout=0;
                operate=str[cout];
                jl1.setText(str[cout]);
       		}
      		else
      		{
           operate=str[cout];
           jl1.setText(str[cout]);
      		}

		}


	}
	

	private void clear()
	{
		jtf1.setText("");
		jtf2.setText("");		
		jtf3.setText("");		
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getSource()==jb1||e.getSource()==jtf2)
		{
			op=OperationFactory.createOperate(operate);			
			op.setNumA(Double.parseDouble(jtf1.getText()));
			op.setNumB(Double.parseDouble(jtf2.getText()));
			double result=op.getResult();
			if(op.getNumB()==0&&operate.equals("/"))
			{
				JOptionPane.showMessageDialog(null, "除数不能为零", "提示", 3);
				jtf2.setText("");
			}
			else
			{
		    jtf3.setText(Double.toString(result));
			}
		}
		if(e.getSource()==jb2)
		{
			clear();
		}
		
	}





	public void mouseMoved(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mouseDragged(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}


	
}
class Operation {
	  private double numA;
	  private double numB;
	  public double getResult()
	  {
		  return 0;	  
	  }
	public double getNumA() {
		return numA;
	}
	public void setNumA(double numA) {
		this.numA = numA;
	}
	public double getNumB() {
		return numB;
	}
	public void setNumB(double numB) {
		this.numB = numB;
	}
	  
	}
	class OperationAdd extends Operation
	{
		 public double getResult()
		 {
			 return getNumA()+getNumB();
		 }
	}
	class OperationSub extends Operation
	{
		 public double getResult()
		 {
			 return getNumA()-getNumB();
		 }
	}
	class OperationMul extends Operation
	{
		 public double getResult()
		 {
			 return getNumA()*getNumB();
		 }
	}
	class OperationDiv extends Operation
	{
		 public double getResult()
		 {
			 return getNumA()/getNumB();
		 }
	}
	
	class OperationFactory {
		  public static Operation createOperate(String operate)
		  {
			   Operation op=null;
			   switch(operate.charAt(0))//若jdk低于1.7,则不能使用字符串,charAt(0)
			   {
			   case '+': op=new OperationAdd();break;
			   case '-': op=new OperationSub();break;
			   case '*': op=new OperationMul();break;
			   case '/': op=new OperationDiv();break;
			   //case '圆的面积': op=new OperationCircle(); break;
			   }
			   return op;
		  }
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学工科的皮皮志^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值