代码如下:
/*
* 该程序实现了计算器工具
* 包含有加减乘除基本运算
* 还加入了归零、取相反数、百分号运算、删除等功能
* 可实现多运算符连续运算、小数点规范输入
*/
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.nio.charset.Charset;
import javax.print.DocFlavor.CHAR_ARRAY;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.BadLocationException;
public class Main {
public static void main(String[] args) {
new Calculator();
}
}
class Calculator{
JFrame win = new JFrame();//程序窗体
JTextField screen = new JTextField();//输出文本框
String s = null;//计算器显示输出
double res = 0;//记录当前数值
double headnum = 0;//运算符前的数字
boolean flag = true;//记录当前数字正负(true为正)
String sign = null;//运算符记录容器
boolean st = false;//用于清除运算结果,防止下次数值的输入直接输入到上次的结果之后,当输入运算符后赋值为true
boolean docin = true;//判断当前文本框是否允许输入小数点
public Calculator() {
//窗体设置
win.setTitle("Calculator");
win.setSize(252, 375);
win.setLayout(null);//给窗体设置布局
win.setResizable(false);//禁止调整窗口大小
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭时终止应用程序
//按钮面板
JPanel buttJPanel = new JPanel();
buttJPanel.setLayout(new GridLayout(5, 4));//面板设置网格布局
buttJPanel.setBounds(0, 80, 255, 270);//设置按钮面板位置及大小
win.add(buttJPanel);//将面板加入到窗体
//文本框设置
screen.setSize(252, 80);
win.add(screen);
//给按钮增加侦听事件
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton b = (JButton) e.getSource();//获取当前点击的按钮
//AC
if(b.getText() == "AC") {
AC();
}
//+/-
else if(b.getText() == "+/-") {
opp();
}
//%
else if(b.getText() == "%") {
percent();
}
//除法
else if(b.getText() == "/") {
div();
}
//乘法
else if(b.getText() == "×") {
mul();
}
//减法
else if(b.getText() == "-") {
sub();
}
//加法
else if(b.getText() == "+") {
add();
}
//等于
else if(b.getText() == "=") {
result();
}
//删除
else if(b.getText() == "<-") {
del();
}
//输入小数点(1.文本框为空时不能输入。2.不能同时存在多个小数点)
else if(b.getText() == ".") {
if(screen.getText().isEmpty()) {//防止文本框为空时,不能输入小数点
s = "";
screen.setText(s);
}
else {//文本框不为空时
//防止输入多个小数点
if(docin){
s = screen.getText() + b.getText();
screen.setText(s);
docin = false;
}
}
}
//输入数字
else {
if(st) {
screen.setText(null);
st = false;
}
s = screen.getText() + b.getText();
res = Double.valueOf(s);
screen.setText(s);
}
}
};
JButton bAC = new JButton();
bAC.setText("AC");
bAC.addActionListener(listener);
buttJPanel.add(bAC);
JButton bsgin = new JButton();
bsgin.setText("+/-");
bsgin.addActionListener(listener);
buttJPanel.add(bsgin);
JButton bper = new JButton();
bper.setText("%");
bper.addActionListener(listener);
buttJPanel.add(bper);
JButton bdiv = new JButton();
bdiv.setText("/");
bdiv.addActionListener(listener);
buttJPanel.add(bdiv);
JButton button7 = new JButton();
button7.setText("7");
button7.addActionListener(listener);
buttJPanel.add(button7);
JButton button8 = new JButton();
button8.setText("8");
button8.addActionListener(listener);
buttJPanel.add(button8);
JButton button9 = new JButton();
button9.setText("9");
button9.addActionListener(listener);
buttJPanel.add(button9);
JButton bmul = new JButton();
bmul.setText("×");
bmul.addActionListener(listener);
buttJPanel.add(bmul);
JButton button4 = new JButton();
button4.setText("4");
button4.addActionListener(listener);
buttJPanel.add(button4);
JButton button5 = new JButton();
button5.setText("5");
button5.addActionListener(listener);
buttJPanel.add(button5);
JButton button6 = new JButton();
button6.setText("6");
button6.addActionListener(listener);
buttJPanel.add(button6);
JButton bsub = new JButton();
bsub.setText("-");
bsub.addActionListener(listener);
buttJPanel.add(bsub);
JButton button1 = new JButton();
button1.setText("1");
button1.addActionListener(listener);
buttJPanel.add(button1);
JButton button2 = new JButton();
button2.setText("2");
button2.addActionListener(listener);
buttJPanel.add(button2);
JButton button3 = new JButton();
button3.setText("3");
button3.addActionListener(listener);
buttJPanel.add(button3);
JButton badd = new JButton();
badd.setText("+");
badd.addActionListener(listener);
buttJPanel.add(badd);
JButton button0 = new JButton();
button0.setText("0");
button0.addActionListener(listener);
buttJPanel.add(button0);
JButton bdoc = new JButton();
bdoc.setText(".");
bdoc.addActionListener(listener);
buttJPanel.add(bdoc);
JButton bdel = new JButton();
bdel.setText("<-");
//bequal.setSize(63, 54);
bdel.addActionListener(listener);
buttJPanel.add(bdel);//将按钮加入到面板
JButton bequal = new JButton();
bequal.setText("=");
//bequal.setSize(63, 54);
bequal.addActionListener(listener);
buttJPanel.add(bequal);//将按钮加入到面板
win.setVisible(true);//窗体可视化
}
//归零方法(AC)
public void AC() {
s = null;
res = 0;
headnum = 0;
flag = true;
sign = null;
st = false;
docin = true;
screen.setText(s);
}
//取相反数(+/-)
public void opp() {
if(flag == true) {
s = "-"+screen.getText();
res = Double.valueOf(s);
flag = false;//令当前数值为负数
}
else {
s = String.valueOf(res*(-1));
res = Double.valueOf(s);
flag = true;//令当前数值为正数
}
screen.setText(s);
}
//除百(%)
public void percent() {
res = Double.valueOf(screen.getText())/100;
s = String.valueOf(res);
screen.setText(s);
}
//加法
public void add() {
if(sign != null) {//执行运算操作(等于操作)
result();
headnum = res;
res = 0;
sign = "+";
}
else {
sign = "+";
s = "";
headnum = res;
res = 0;
flag = true;//当前数值为正
docin = true;
screen.setText(s);
}
}
//减法
public void sub() {
if(sign != null) {//执行运算操作(等于操作)
result();
headnum = res;
res = 0;
sign = "-";
}
else {
sign = "-";
s = "";
headnum = res;
res = 0;
flag = true;//当前数值为正
docin = true;
screen.setText(s);
}
}
//乘法
public void mul() {
if(sign != null) {//执行运算操作(等于操作)
result();
headnum = res;
res = 0;
sign = "×";
}
else {
sign = "×";
s = "";
headnum = res;
res = 0;
flag = true;//当前数值为正
docin = true;
screen.setText(s);
}
}
//除法
public void div() {
if(sign != null) {//执行运算操作(等于操作)
result();
headnum = res;
res = 0;
sign = "/";
}
else {
sign = "/";
s = "";//输出为空
headnum = res;//记录运算符前一个数值
res = 0;//运算符后的数值为0
flag = true;//当前数值为正
docin = true;
screen.setText(s);
}
}
//运算方法(=)
public void result() {
if(sign == "+") {
res = headnum + res;//运算过程
if(res < 0) flag = false;
}
if(sign == "-") {
res = headnum - res;
if(res < 0) flag = false;
}
if(sign == "×") {
res = headnum * res;
if(res < 0) flag = false;
}
if(sign == "/") {
res = headnum / res;
if(res < 0) flag = false;
}
s = String.valueOf(res);
screen.setText(s);//显示运算结果
sign = null;
s = null;
st = true;
docin = true;
}
//删除
public void del(){
s = screen.getText();
if(s.length() != 0) {//文本框不为空时进行删除操作
if(s.substring(s.length()-1).equals(".")) {//如果删除小数点,将docin设为真,允许下次小数点输入
docin = true;
}
s = s.substring(0, s.length()-1);//删除
if(s.equals("")) {//删除的为最后一个数字
res = 0;
}
else if(s.equals("-")) {//删除后只剩负号,文本框直接清空
res = 0;
s = "";
flag = true;
}
else {//删除后还有数字
res = Double.valueOf(s);
}
}
screen.setText(s);
}
}