实现一个简单的计算器,前面是一个文本框(操作数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;
}
}