纯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());
}
}
}
}