纯Java语言的计算器
import javax.accessibility.AccessibleIcon; import javax.swing.*; import javax.swing.plaf.basic.BasicOptionPaneUI; import java.awt.*; import java.awt.event.*; import java.awt.event.*; import javax.swing.*; public class Calculator extends JFrame implements ActionListener{ /*******************北面控件****************************/ private JPanel jp_north = new JPanel(); // 创建一个组件 装计算器的上部分 private JTextField display_text = new JTextField(); // 计算器上面的现实栏 private JButton cButton = new JButton("C"); // 计算器的清空键 /*****************中间控件****************************/ private JPanel jp_center = new JPanel(); /*****************文本操作变量****************************/ private String firstInput = null; // 第一次输入的结果 private String operator = null; // 操作符 public Calculator() throws HeadlessException { this.init(); // 初始化 this.addNorthComponent(); // 设置北面控件 this.addCenterButton(); } public static class Const{ // 各种参数的类 public static final int FRAME_W = 500; // 窗口的宽和高 public static final int FRAME_H = 500; public static final int SCREEN_W = Toolkit.getDefaultToolkit().getScreenSize().width; // 获取显示屏宽和高 public static final int SCREEN_H = Toolkit.getDefaultToolkit().getScreenSize().height; public static int FRAME_X = (SCREEN_W - FRAME_W) / 2; // 设置窗口默认位置是屏幕的中央 public static int FRAME_Y = (SCREEN_H - FRAME_H) / 2; public static final String TITLE = "计算器"; // 窗口的名称 } public void init(){ // 初始化方法 this.setTitle(Const.TITLE); // 设置窗口名字 this.setSize(Const.FRAME_W, Const.FRAME_H); // 设置窗口默认大小 this.setLayout(new BorderLayout()); // 添加一个布局 this.setResizable(true); // 设置窗口大小不可以改变 this.setLocation(Const.FRAME_X, Const.FRAME_Y); // 设置窗口的默认位置 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置点击右上角的关闭 可以真正的关闭 } // 添加北面控件 public void addNorthComponent(){ this.display_text.setPreferredSize(new Dimension(400, 40)); // 设置显示框的大小 this.cButton.setPreferredSize(new Dimension(60,40)); // 设置清空按钮的大小 this.cButton.setForeground(Color.red); // 设置清空按钮的字体颜色 jp_north.add(this.display_text); // 拼装组件 jp_north.add(this.cButton); cButton.addActionListener(new ActionListener() { // 给这个案例添加清空功能 @Override // 使用匿名内部类的时候注意对外部的引用的时候 不要加this 因为匿名内部类也是一个内 public void actionPerformed(ActionEvent e) { display_text.setText(""); firstInput = null; operator = null; } }); this.add(jp_north,BorderLayout.NORTH); // 把组件放入框架 } // 添加中间按钮 public void addCenterButton(){ String btn_text = "123+456-789*0.=/"; // 按钮的文字 String regex = "[\\+\\-*/.=]"; // 写正则表达式 this.jp_center.setLayout(new GridLayout(4, 4)); for(int i = 0; i < 16; ++ i){ String temp = btn_text.charAt(i) + ""; // 获取第i个字符串 JButton btn = new JButton(); btn.setText(temp); if (temp.matches(regex)){ btn.setFont(new Font("粗体", Font.BOLD, 20)); // 如果是特殊符号那么就设置为粗体 btn.setForeground(Color.red); } else { btn.setFont(new Font("正常", Font.ROMAN_BASELINE, 20)); // 数字设置为正常字体 } jp_center.add(btn); btn.addActionListener(this); // 给按钮添加监听 } this.add(jp_center, BorderLayout.CENTER); } public static void main(String[] args) { Calculator calculator = new Calculator(); calculator.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // 给事件实例化 String clickStr = e.getActionCommand(); // 获取监听事件 if (".0123456789".indexOf(clickStr) != -1){ this.display_text.setFont(new Font("正常", Font.ROMAN_BASELINE, 20)); // 设置显示文字的大小 this.display_text.setText(this.display_text.getText() + clickStr); // 显示文字 this.display_text.setHorizontalAlignment(JTextField.RIGHT); // 从右开始显示文字 // JOptionPane.showMessageDialog(this, clickStr); // 测试是否建立监听成功 } else if (clickStr.matches("[\\+\\-*/]{1}")){ // 写正则表达式 如果获取的是操作符中的一个 this.operator = clickStr; this.firstInput = this.display_text.getText(); // 把上一次获取的字符 设置为上一次的字符 this.display_text.setText(""); // 然后清空当前字符 } else if (clickStr.equals("=")){ // 当输入的为=的时候就该输出结果了 Double a = Double.valueOf(this.firstInput); // 把上一次的输入的字符转化为实数 Double b = Double.valueOf(this.display_text.getText()); // 把当前的字符也设置为实数 Double result = null; Boolean flag = false; // 标记一下除数是否为0 switch(operator){ case "+": result = a + b; break; case "-": result = a - b; break; case "*": result = a * b; break; case "/": if (b == 0){ flag = true; } else { result = a / b; } break; } if (flag){ // 除数为0的情况 this.display_text.setText("除数不能为0"); } else { this.display_text.setText(result.toString()); } } } }