Java开发实例 计算器功能实现
需要实现的功能(比较简单)
所实现的功能:
1、清零;
2、切换第一个操作数的符号;
3、逐个删除数字(遇到运算符截止);
4、输入操作数;
5、+、-、×、÷、=运算
6、为最近的操作数添加小数点
步骤:
1.定义一个CalculatorListener事件处理类,该类实现ActionListener动作事件接口,重写接口中的抽象方法。
2.实例化CalculatorListener事件处理类的对象,对象名cl。
3.给事件源对象按钮添加addActionLsitener动作监听方法,指定事件处理类的对象cl。
根据输入的内容,进行计算。
String字符串的操作
//计算器主类
最后再设置窗体可见就可以了。
package calculator;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Calculator extends JFrame {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
Calculator cal = new Calculator();
cal.initUI();
}
public void initUI(){
// 设置窗体的属性值
this.setTitle("计算器");
this.setSize(400, 590);
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setResizable(false);// 禁止调整窗体的大小
this.setLayout(new FlowLayout());
JLabel labShow = new JLabel("0.0");
// 设置组件的大小
labShow.setPreferredSize(new Dimension(380, 100));
// 设置组件上字体
labShow.setFont(new Font("Courier New", Font.BOLD, 40));
// 设置标签中文字的对齐方式
labShow.setHorizontalAlignment(JLabel.RIGHT);
this.add(labShow);
//2.实例化CalculatorListener事件处理类的对象,对象名cl。
CalculatorListener cl = new CalculatorListener(labShow);
// 定义数组,存储按钮上要显示的文字信息
String[] array = { "C", "±", "←", "÷", "7", "8", "9", "×", "4", "5", "6", "-", "1", "2", "3",
"+", "0", ".", "=" };
// 循环array数组,根据数组中的数据创建按钮对象,将按钮对象添加到窗体上
for (int i = 0; i < array.length; i++) {
JButton button = new JButton(array[i]);
if(array[i].equals("0"))button.setPreferredSize(new Dimension(175, 85));
else button.setPreferredSize(new Dimension(85, 85));
this.add(button);
//3.给事件源对象按钮添加addActionLsitener动作监听方法,指定事件处理类的对象cl。
button.addActionListener(cl);
}
this.setVisible(true);
}
}
//事件处理类
package calculator;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
public class CalculatorListener implements ActionListener{
private JLabel labShow;
String label_Text;//标签文本
String num1="";//从字符串中截取数字
String op="";//运算符
double num01=0.0,num02=0.0;
int numOfNum=0;
boolean end=false;
public CalculatorListener(JLabel labShow) {
this.labShow=labShow;
}
public void actionPerformed(ActionEvent e) {
String text=e.getActionCommand();
label_Text = labShow.getText();
if(end) {
label_Text="0.0";end=false;
}
//正负号运算
if(text.equals("±")){
if(label_Text.subSequence(0, 1).equals("-")) label_Text=text.substring(1);
else label_Text="-"+label_Text;
}
//重置清零
else if(text.equals("C")) {
label_Text="0.0";
numOfNum=0;num01=0;num02=0;op="";
}
//删除操作,遇到运算符就停止
else if(text.equals("←")) {
if(!(label_Text.substring(label_Text.length()-1).equals("+")
||label_Text.substring(label_Text.length()-1).equals("-")
||label_Text.substring(label_Text.length()-1).equals("×")
||label_Text.substring(label_Text.length()-1).equals("÷")))
label_Text=label_Text.substring(0,label_Text.length()-1);
}
//加小数点
else if(text.equals(".")){
int l=label_Text.length();boolean if_is=false;
for(int i=0;i<l;i++){
//第一个操作数中有小数点是允许的
if(label_Text.subSequence(i, i+1).equals("."))if_is=true;
//运算符后,第二个操作数没有小数点才能进行加小数点操作
else if(label_Text.subSequence(i, i+1).equals("+")||label_Text.subSequence(i, i+1).equals("-")||label_Text.subSequence(i, i+1).equals("×")||label_Text.subSequence(i, i+1).equals("÷")){
if_is=false;
}
if(i==l-1&&if_is==false){
label_Text+=".";
}
}
}
//数字的话直接添加
else if (text.equals("0") || text.equals("1") || text.equals("2")
|| text.equals("3") || text.equals("4")|| text.equals("5") || text.equals("6")
|| text.equals("7") || text.equals("8") || text.equals("9")) {
if(label_Text.equals("0.0")){label_Text="";}
else if(label_Text.equals("-0.0")){label_Text="-";}
label_Text+=text;
}
//运算符
else if(text.equals("+")||text.equals("-")||text.equals("×")||text.equals("÷")||text.equals("=")){
//运算符前没有保存操作数,则将运算符前数字赋值为第一个操作数
if(numOfNum==0){
num1=label_Text;
num01=Double.parseDouble(num1);//String直接转double
numOfNum=1;
System.out.println("第一个数:"+num1); //调试输出语句
}
//运算符前已经保存了一个操作数,则将运算符前数字赋值给第二个操作数
else if(numOfNum==1){
label_Text+=text;
for(int i=0;i<label_Text.length()-1;i++){
if(i==0&&label_Text.subSequence(0,1).equals("-"))i++;//忽略负号
String temp=(String) label_Text.subSequence(i, i+1);
//取第二个操作数
if(temp.equals("+")||temp.equals("-")||temp.equals("×")||temp.equals("÷")){
temp=label_Text.substring(i+1,label_Text.length()-1);
System.out.println("第二个数:"+temp); //||temp.equals("=")
num02=Double.parseDouble(temp);numOfNum=2; break;
}
}
}
//如果有了两个操作数,就进行运算
if(numOfNum==2){
System.out.println("第一个数:"+num01+" 第二个数:"+num02); //
if(op.equals("+"))num01+=num02;
else if(op.equals("+"))num01-=num02;
else if(op.equals("×"))num01*=num02;
else if(op.equals("÷"))num01/=num02;
label_Text="";label_Text+=num01;numOfNum=1;
labShow.setText(label_Text);
}
//记录除“=”外的运算符
if(!text.equals("=")){
op=text;
label_Text+=text;labShow.setText(label_Text);
}
//“=”的话,输出,重置
else{
labShow.setText(label_Text);
numOfNum=0;num01=0;num02=0;op="";
end=true;
}
}
labShow.setText(label_Text);
}
}
实现效果: