0
点赞
收藏
分享

微信扫一扫

java GUI 布局与事件综合练习 简单计算器 加减乘除,开方,倒数,百分比,数据记忆功能

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Container;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JTextField;


public class Calculation extends JFrame implements ActionListener{

private JTextField txfResult;//显示操作结果的文本框

JTextField txfM;//显示记忆的索引值的文本框

Double dM=0d;//存储数据



public Calculation() {

super("swing 计算器实例");

/*设置用于显示的文本框*/

txfResult =new JTextField("0",30);//初始文本显示0 最大列数30

txfResult.setBackground(Color.WHITE);

txfResult.setHorizontalAlignment(JTextField.RIGHT);//数字在文本框中靠右显示

txfResult.setEditable(false);//文本框不可编辑 即为readOnly只读属性

JPanel ResultTextPanel=new JPanel();//放操作结果文本框的面板

ResultTextPanel.add(txfResult);

/*设置用于控制数字的键与显示记忆索引值的文本框*/

txfM=new JTextField(2);//最长2列

JButton b1=new JButton("Backspace");//退格键

JButton b2=new JButton("CE");//重置键

JButton b3=new JButton("C");//清0键

JPanel ControlPanel=new JPanel();

ControlPanel.setLayout(new GridLayout(1, 4, 2, 2));//1行4列 水平间距2 垂直间距2

ControlPanel.add(txfM);

ControlPanel.add(b1);

ControlPanel.add(b2);

ControlPanel.add(b3);

b1.addActionListener(this);

b2.addActionListener(this);

b3.addActionListener(this);

/*数字和运算符键*/

String dcKey[]= {"MC","7","8","9","/","sqrt","MR","4","5","6","*","%","MS","1","2","3","-","1/x"

,"M+","0","+/-",".","+","="};

JPanel dcKeyPanel =new JPanel();//数字和运算符的面板

dcKeyPanel.setLayout(new GridLayout(4, 6,2,2));

//一个 循环放好所有数字和运算符组件

for(int i=0;i<24;i++) {

JButton b=new JButton(dcKey[i]);

dcKeyPanel.add(b);

b.addActionListener(this);

}

Container ct=this.getContentPane();//窗体内容面板对象

ct.setLayout(new BorderLayout());

ct.add(ResultTextPanel,BorderLayout.NORTH);

ct.add(ControlPanel,BorderLayout.CENTER);

ct.add(dcKeyPanel,BorderLayout.SOUTH);

pack();

setVisible(true);

setResizable(false);//禁止最大化

setLocationRelativeTo(null);//居中显示

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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

new Calculation();

}



//数字键和功能键的实现/


private boolean newDigital=true;//类内全局boolean变量 用于表示是否是输入数的标志



private String operation="";//表示运算符的字符串

private double d1;//二元运算前操数

private double d2;//二元运算后操作数

private int optionValue;//区别加减乘除运算符的变量

/*监听方法*/

@Override

public void actionPerformed(ActionEvent e) {

String s=(e.getActionCommand());//返回与此动作相关的命令字符串 就是button上显示的字

String str=txfResult.getText();

/*后退键*/

if(s.equals("Backspace")) {

if(str.equals("0")||str.equals("")) {//已经是清0状态下 不可再清0了

return;

}

String s1=txfResult.getText();

txfResult.setText(s1.substring(0, s1.length()-1));//截掉最后一个数字

}

/*重置键*/

if(s.equals("CE")) {

txfResult.setText("0");

newDigital=true;//是否是新输入的数的标志设置为true

}

/*清0键*/

if(s.equals("C")) {

txfResult.setText("0");

optionValue=0;//表示运算符的变量设置为0

newDigital=true;//表示是否新输入的数的标志设置为true

}

/*数字键*/

if(s.length()==1&&s.charAt(0)>='0'&&s.charAt(0)<='9') {

if(!newDigital) {

txfResult.setText(str+s);//不是新输入的数

}else {

txfResult.setText(s);

newDigital=false;//表示是否新输入的数的标志设置为false

}

return;

}



/*小数点*/

if(s.equals(".")) {

if(txfResult.getText().indexOf(".")==-1) {//若之前尚不存在小数点

/*判断数字是否0打头*/

if(txfResult.getText().trim().startsWith("0")) {//强大的API

txfResult.setText("0.");

newDigital=false;

}else {

txfResult.setText(str+".");//str事件刚开始就得到的txfResult.getText()

}

}

return;

}

/* 表示数字正负符号+/- */

if(s.equals("+/-")) {

double d=Double.parseDouble(str.trim());//获取输入的数字

txfResult.setText(String.valueOf(-d));//取得获取输入数字的相反数

return;

}



//加减乘除运算的实现/


if(s.equals("+")) {

d1=Double.parseDouble(txfResult.getText());//立刻获取前操作数的值

txfResult.setText("");

optionValue=1;//设置运算符标志

}

if(s.equals("-")) {

d1=Double.parseDouble(txfResult.getText());

optionValue=2;

}

if(s.equals("*")) {

d1=Double.parseDouble(txfResult.getText());

optionValue=3;

}

if(s.equals("/")) {

d1=Double.parseDouble(txfResult.getText());

optionValue=4;

}

if(s.equals("=")) {

d2=Double.parseDouble(txfResult.getText());//获取后操作数的值

/*根据运算符标志的不同值确定计算结果*/

switch(optionValue) {

case 1:

txfResult.setText(String.valueOf(d1+d2));

break;

case 2:

txfResult.setText(String.valueOf(d1-d2));

break;

case 3:

txfResult.setText(String.valueOf(d1*d2));

break;

case 4:

if(d2!=0) {

txfResult.setText(String.valueOf(d1/d2));

}else {

txfResult.setText("除数不能为0");

return;

}

break;


}

operation="";//运算结束 清空运算符

}






求平方根 倒数 百分比运算/

if(s.equals("sqrt")) {

double d=Double.parseDouble(txfResult.getText().trim());//获取操作数的值

if(d>0) {

txfResult.setText(String.valueOf(Math.sqrt(d)));//计算该值的平方根

}else {

txfResult.setText("负数不能计算平方根");

}

}else if(s.equals("1/x")) {

double d=Double.parseDouble(txfResult.getText().trim());//计算倒数

if(str.equals("0")) {

txfResult.setText("除数不能为0");

}else {

txfResult.setText(String.valueOf(1/d));

}


}else if(s.equals("%")) {

txfResult.setText((String.valueOf(Double.parseDouble(str)/100)));

}



///实现数据的记忆功能///

if(s.equals("MC")) {//清空存储数据

txfResult.setText("");

dM=0d;

newDigital=true;

}

if(s.equals("MR")) {

if(txfM.getText().trim()!="") {

txfResult.setText(""+dM);//显示存储数字当前值

}

}

if(s.equals("MS")) {

dM=Double.parseDouble(txfResult.getText().trim());

txfM.setText("M");//存储区显示M

}

if(s.equals("M+")) {

dM=dM+Double.parseDouble(txfResult.getText().trim());//将显示的数字与已经存储的数据相加 即更新存储数据

}


}

}

举报

相关推荐

0 条评论