java计算器实战

Java中实现一个计算器功能。
利用Java swing技术设计一个简单的计算器,界面如图所示。
计算器图

界面简述:

整个面板的由一个JTextFiled组件+16个JButton组件构成,外加一个JPanel组件存放16个按钮,其布局为4x4的网格布局(GridLayout)。

显示框与按钮面板放在了整个面板容器中,布局为BorderLayout,显示框放容器北部,整个按钮面板放容器中部。

功能实现简述:

由匿名内部类实现ActionListener接口,按钮注册进行监听,并捕获按钮事件。
由于该计算器只能计算中缀表达式,即数字与运算符交替出现的表达式,获取输入的运算表达式,并将其存与一个字符串中。

程序代码

import java.awt.BorderLayout;
import java.awt.Color;
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;

import com.sun.org.apache.xalan.internal.xsltc.runtime.Operators;


public class zuoyan extends JFrame implements ActionListener {
    private final String[]KEYS={"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};
    private final String[]Command={"delete","C"};
    private JButton[] keys=new JButton[KEYS.length];
    private JButton[] coms=new JButton[Command.length];
    private JTextField text=new JTextField("0");
    private boolean Firstdigit=true;
    private double result=0.0;
    private String operator = "=";//默认操作为"="
    private boolean operateValidFlag = true;//操作是否合法
    public zuoyan() {
        init();
        this.setTitle("计算器");
        this.setLocationRelativeTo(null);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //this.setSize(width, height)
        this.pack();
    }
    private void init() {
        // TODO Auto-generated method stub
        text.setHorizontalAlignment(JTextField.RIGHT);
        text.setBackground(Color.white);
            text.setEditable(false);
            JPanel keyspanel=new JPanel();//装按键的画板
            keyspanel.setLayout(new GridLayout(4,4,3,3));//布局为网格布局4行4列 水平竖直间距都为3像素
            for(int i=0;i<keys.length;i++){//创建按钮
                keys[i]=new JButton(KEYS[i]);
                keyspanel.add(keys[i]);//在画板上添加按钮
                keys[i].setForeground(Color.blue);//按键前景色蓝色
        }
        //运算符按键前景色为红
        keys[3].setForeground(Color.red);
        keys[7].setForeground(Color.red);
        keys[11].setForeground(Color.red);
        keys[14].setForeground(Color.black);
        keys[15].setForeground(Color.red);
        JPanel comspanel=new JPanel();
        comspanel.setLayout(new GridLayout(1,2,3,3));
        for(int i=0;i<coms.length;i++){
            coms[i]=new JButton(Command[i]);
            comspanel.add(coms[i]);
        }
        JPanel panel1=new JPanel();
        panel1.setLayout(new BorderLayout(3,3));
        panel1.add("North", comspanel);
        panel1.add("Center", keyspanel);
        JPanel top = new JPanel();  //装文本框的画板
        top.setLayout(new BorderLayout()); //边界布局
        top.add("Center", text);
        getContentPane().setLayout(new BorderLayout(3,5));
        getContentPane().add("North", top);  //北  放置top画板 里面是文本框
        getContentPane().add("Center", panel1);  //中心  放置panel1画板 装的是数字按键和命令按键
        for (int i = 0; i < KEYS.length; i++) {
            keys[i].addActionListener(this);
        }
        for (int i = 0; i < Command.length; i++) {
            coms[i].addActionListener(this);
        }
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        String label=e.getActionCommand();
        if(label==Command[0]){
            handleDelete();
        }
        else if(label==Command[1]){
            handLeC();
        }
        else if("0123456789.".indexOf(label)>=0){
            handlenumber(label);
        }
        else{
            handleOperator(label);
        }
    }
    private void handleOperator(String label) {
        // TODO Auto-generated method stub
        if(operator.equals("/")){
            if(text.getText()=="0"){
                text.setText("除数不能为0");
                operateValidFlag=false;
                handLeC();
            }
            else{
                result/=Double.valueOf(text.getText());
            }
        }
        else if(operator.equals("*")){
            result*=Double.valueOf(text.getText());
        }
        else if(operator.equals("+")){
            result+=Double.valueOf(text.getText());
        }
        else if(operator.equals("-")){
            result-=Double.valueOf(text.getText());
        }
        else if(operator.equals("=")){
            result=Double.valueOf(text.getText());
        }
        if(operateValidFlag){
            text.setText(String.valueOf(result));
        }
        operator=label;
        Firstdigit = true;//按完运算符后 在输入数字为第一次输入
        operateValidFlag=true;
    }
    private void handlenumber(String label) {
        // TODO Auto-generated method stub
        if(Firstdigit){
            if(label.equals(".")){
                text.setText(text.getText()+".");
            }
            else{
                text.setText(label);
            }
        }
        //按的是"."并且字符串里没"."
        else if(label.equals(".")&&text.getText().indexOf(".")<0){
            text.setText(text.getText()+".");
        }
        //按得是数字
        else if(!label.equals(".")){
            text.setText(text.getText()+label);
        }
        Firstdigit=false;//输过就不是第一次输入了
    }
    private void handLeC() {
        // TODO Auto-generated method stub
        text.setText("0");
        Firstdigit=true;
        operator="=";
    }
    private void handleDelete() {
        // TODO Auto-generated method stub
        if(text.getText().length()>1){
            text.setText(text.getText().substring(0, text.getText().length()-1));
        }
        else if(text.getText().length()==1){
            text.setText("0");
        }
    }
    public static void main(String args[]) {
        zuoyan calculator1 = new zuoyan();
        calculator1.setSize(280,300);
        calculator1.setResizable(false);
//       zuoyan.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

左魇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值