大二下新人java实训实现计算器,其中的代码是参考csdn博主的,注释多是为了方便自己理解,结尾会放文章链接。
以下是代码的一些分析:
细节讲解:
1 单独添加两个按钮Backspace和C:
setLayout()布局管理器,需要精确指定各个组建的大小和位置,就需要用到空布局。
2 网格布局设置按钮:(网上学习的)
使用字符串数组( text2[ ] )存储需要的计算器按钮面板
自定义按钮类数组,定义了一共text2.length个按钮,先用getContentPane()方法获取JFrame的内容面板,然后通过for循环添加按钮,以及实现监听功能。
3 act获取被点击按钮的名称,a获取act的第一个字符,如果是数字且操作符为默认值则继续往strA中添加字符;若操作符不为默认值,则往strB中添加字符
对于绝对值、开平方和回退功能,我用al获取它们的第三个字符,分别是-、r和c,如果识别到al等于对应字符,则进入相应功能。
方法:
append()可以把括号内任意类型的数据添加到字符串缓冲区里面,并返回字符串缓冲区本身。
.valueOf()用于将基本数据类型转换为String类型,补充一点,type不能为null,不然会报空指针异常。
charAt(索引):返回对应索引的字符。
将StringBuffer类型的strA转换为string,再转换为double类型。
不足:
不能进行三个数及以上的运算:2+2+2
代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//异常处理
class munber_Exception extends Exception{
String e;
public munber_Exception(){}
public munber_Exception(String message){
this.e=message;
}
public String shows(){
return e;
}
}
class cal extends JFrame implements ActionListener {
private JPanel panel;//定义面板对象名
private JTextArea show;//文本区(JTextArea),它是窗体中一个放置文本的区域。
StringBuffer strA;
StringBuffer strB;
char oper ='~';
double A;
double B;
private String[] text2 =
{"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0","+/-", ".", "+",
"1/x", "%","sqrt", "=",};//用字符串数组存储计算器按钮面板
private JButton[] munButton = new JButton[text2.length];//自定义按钮类数组
public cal() {
panel = new JPanel();
show = new JTextArea();
strB=new StringBuffer();
strA=new StringBuffer();
}
public void init() {//初始化
//getContentPane()方法和add()方法添加组件(输入框和B、C按钮),再使用网格布局添加余下的数字和操作符按钮
this.setTitle("计算器");
this.setBounds(900, 300, 316, 288);
this.setResizable(false);
show.setBounds(0,0,300,30);
this.getContentPane().add(show);//用getContentPane()方法获得JFrame的内容面板,用add()方法在面板添加输入框
//单独设置两个按钮 Backpace和C
JButton btnCe_1 = new JButton("Backspace");//setLayout()布局管理器,需要精确指定各个组建的大小和位置,就需要用到空布局。
this.getContentPane().setLayout(null);//设置为null布局(空布局)。
// 在已经接入监听器的类中使用addActionListener事件监听器监听按钮
btnCe_1.addActionListener(this);
btnCe_1.setBounds(0, 30, 150, 30);//设置组件在容器中的大小和位置
this.getContentPane().add(btnCe_1);
JButton btnCe = new JButton("C");
btnCe.addActionListener(this);
btnCe.setBounds(150, 30, 150, 30);
this.getContentPane().add(btnCe);
panel.setBounds(0, 60, 300, 190);
panel.setLayout(new GridLayout(5, 4));
this.getContentPane().add(panel);//用getContentPane()方法获得JFrame的内容面板,用add()方法在面板添加
//添加按键
for (int i = 0; i < text2.length; i++) {
munButton[i] = new JButton(text2[i] + " ");
panel.add(munButton[i]);
}
for (int i = 0; i < munButton.length; i++)//实现每个按钮的监听功能
munButton[i].addActionListener(this);
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
//乘法运算
public double division(double x,double y)throws munber_Exception {
if (y == 0) {
throw new munber_Exception("除数不能为0!");
} else {
return x / y;
}
}
//事件触发ActionEvent事件后,监视器调用接口中的方法actionPerformed(ActionEvent e)对发生的事件做出处理
/*因为每按一次按钮就进入处理功能一次,所以a一直在接收按钮传递过来的值.strA和strB用来存储值
如果a仍为~:则为strA继续添加字符;若不为~,则为strB添加字符;
若识别到按钮输入的是操作符,则把操作符赋值给a
若识别到按了=号,则开始运算,strA->A,strB->B使用方法获取A B值,j存储结果
*/
public void actionPerformed(ActionEvent e) {
try {
String act=e.getActionCommand();//定义一个字符串获取按钮(组件)名称
char a=act.charAt(0);//使用一个字符a获取act调用charAt(索引)后返回的值 charAt(索引):返回对应索引的字符
char al='P';
if(act.length()>2){
al=act.charAt(2);//取巧:获取第三个值 c - r x
}
if (a=='0' ||a=='1' || a=='2' ||a=='3'||a=='4'||a=='5'||a=='6'||a=='7'||a=='8'||a=='9'||a=='.')
{
if(oper=='~'){
strA.append(a);//.append()可以把括号内任意类型的数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
// .valueOf()用于将基本数据类型转换为String类型,补充一点,type不能为null,不然会报空指针异常
show.setText(String.valueOf(strA));
}
else {
strB.append(a);
show.setText(String.valueOf(strA)+oper+String.valueOf(strB));
}
}
else if(a=='r'){
if(strA.length()>0){
double Al=Double.parseDouble(String.valueOf(strA));//将StringBuffer类型的strA转换为string,再转换为double类型
strA.delete(0,strA.length());
strA.append(Math.sqrt(Al));
show.setText(String.valueOf(strA));
}
}
else if(a=='x'){
if(strA.length()>0){
double xl=Double.parseDouble(String.valueOf(strA));
if(xl==0){show.setText("除数不能为0");}
else{
strA.delete(0,strA.length());
strA.append(1/xl);
show.setText(String.valueOf(strA));}
}
}
else if(al=='-')
{
if(oper=='~'){
if(strA.length()>0){
double lA=Double.parseDouble(String.valueOf(strA));
if(lA>0){
strA.insert(0,'-');
show.setText(String.valueOf(strA));
}
else if(lA==0){show.setText(String.valueOf(strA));}
else{strA.deleteCharAt(0);show.setText(String.valueOf(strA));}
}
}
else{
double lB=Double.parseDouble(String.valueOf(strB));
if(strB.length()>0){
if(lB>0){
strB.insert(0,'-');
show.setText(String.valueOf(strA)+oper+String.valueOf(strB));
}
else if(lB==0){show.setText(String.valueOf(strB));}
else{strB.deleteCharAt(0);show.setText(String.valueOf(strA)+oper+String.valueOf(strB));}
}
}
}
else if(a=='+'||a=='-'||a=='/'||a=='*'||a=='%'){
oper=a;
show.setText(String.valueOf(strA)+oper);
}
else if(a=='='){
A = Double.parseDouble(String.valueOf(strA));//.parseDouble(“字符串”)将字符串值转换为double值。
B = Double.parseDouble(String.valueOf(strB));
double j;
int len1=strA.length();
int len2=strB.length();
if (oper == '+') {
j = A + B;
show.setText(Double.toString(j));
strA.delete(0,len1);
strB.delete(0,len2);
strA.append(j);
} else if (oper == '-') {
j = A - B;
show.setText(Double.toString(j));//toString(Double值)方法用于获取Double value / object的字符串值
strA.delete(0,len1);
strB.delete(0,len2);
strA.append(j);//支持了运算后再运算
} else if (oper == '*') {
j = A * B;
show.setText(Double.toString(j));
strA.delete(0,len1);
strB.delete(0,len2);
strA.append(j);
} else if (oper == '/') {
try{
j= division(A, B);show.setText(Double.toString(j));}
catch(munber_Exception u){
show.setText(u.shows());
}
}
else if (oper == '%') {
j = A % B;
show.setText(Double.toString(j));
strA.delete(0,len1);
strB.delete(0,len2);
strA.append(j);
}
}
else if (a=='C') {
show.setText(" ");
oper='~';
int len1=strA.length();
int len2=strB.length();
strA.delete(0,len1);
strB.delete(0,len2);
}
else if (a=='c'){
if(oper!='~'){
if(strB.length()>0){//有操作符有B
strB.delete(strB.length()-1,strB.length());
show.setText(String.valueOf(strA)+oper+String.valueOf(strB));
}
}
if(oper=='~'){
if(strA.length()>0){
strA.delete(strA.length()-1,strA.length());
show.setText(String.valueOf(strA));
}
}
}
}catch(ArithmeticException m){
System.out.println("除数不能为0");
}
}
}
public class Calculator {
//调用
public static void main(String[] args) {
cal Calculator1 = new cal();
Calculator1.init();
}
}
布局学习:(20条消息) 简单计算器(Java实训)_Chien d'amis的博客-CSDN博客
实现学习:(20条消息) java 简易计算器_︱Harvey︱的博客-CSDN博客(其实就是两个版本的结合体)