1.0版的计算器使用中发现了大量bug,比如数字大计算会溢出等,故经过改进后发布2.0版本如下:
先上效果图
代码如下:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
class Ans {
private String num1 = "", num2 = ""; // num1、num2分别表示输入的第1、2个数,计算结果将刷新num1
// 赋值与返回num1 num2
public String getNum1() {
return num1;
}
public void setNum1(String num1) {
this.num1 = num1;
}
public String getNum2() {
return num2;
}
public void setNum2(String num2) {
this.num2 = num2;
}
// 判断进行了什么运算
private int operation = 0,equals=0;//运算符 是否按过等号
public int getOperation() {
return operation;
}
public void setOperation(int operation) {
this.operation = operation;
}
public int getEquals() {
return equals;
}
public void setEquals(int equals) {
this.equals = equals;
}
}
public class MyCalculator {
private JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MyCalculator window = new MyCalculator();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public MyCalculator() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
Dimension ScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
double scrh = ScreenSize.getHeight(), scrw = ScreenSize.getWidth();
int frameh = 307, framew = 450;
frame = new JFrame();
frame.setTitle("计算器");
frame.setBounds((int) (scrw - framew) / 2, (int) (scrh - frameh) / 2, frameh, framew);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(null);
frame.setContentPane(panel);
JMenuBar bar = new JMenuBar();
frame.setJMenuBar(bar);
JMenu caidan = new JMenu("菜单");
bar.add(caidan);
JMenuItem exit = new JMenuItem("退出");
caidan.add(exit);
exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int xz = JOptionPane.showConfirmDialog(frame, "要退出计算器吗?", "确定退出", JOptionPane.YES_NO_OPTION);
if (xz == 0)
System.exit(0);
}
});
JMenu bangzhu = new JMenu("帮助");
bar.add(bangzhu);
JMenuItem sm=new JMenuItem("说明");
bangzhu.add(sm);
sm.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String shuoming="Ⅰ.每次运算以等号结束,连续按等号可以连续运算,但按等号后不按数字按运算符无效\nⅡ.最高精确到小数点后16位,数字不要超过10^99999\nⅢ.正负号按钮和百分号运算均不会结束一次运算";
JOptionPane.showMessageDialog(frame, shuoming,"操作说明",JOptionPane.PLAIN_MESSAGE);}
});
JMenuItem gy = new JMenuItem("关于");
bangzhu.add(gy);
gy.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(frame, "软件名:计算器\n版本号:2.0\n制作时间:2017年4月16日\n制作人:muyangren907\n 软件持续更新完善中,敬请期待", "版权信息",
JOptionPane.PLAIN_MESSAGE);
}
});
JButton[] button = new JButton[10];
int j = 0, k = 0;
for (int i = 1; i < 10; i++) {
button[i] = new JButton(String.valueOf(i));
button[i].setBackground(Color.LIGHT_GRAY);
button[i].setBounds(50 + 50 * k, 220 - 50 * j, 50, 50);
k++;
if (k == 3) {
j++;
k = 0;
}
panel.add(button[i]);
}
button[0] = new JButton("0");
button[0].setBackground(Color.LIGHT_GRAY);
button[0].setBounds(50, 270, 100, 50);
panel.add(button[0]);
JButton buttondot = new JButton(".");
buttondot.setBackground(Color.LIGHT_GRAY);
buttondot.setBounds(150, 270, 50, 50);
panel.add(buttondot);
JButton buttonadd = new JButton("+");
buttonadd.setBackground(Color.LIGHT_GRAY);
buttonadd.setBounds(200, 220, 50, 50);
panel.add(buttonadd);
JButton buttonminus = new JButton("-");
buttonminus.setBackground(Color.LIGHT_GRAY);
buttonminus.setBounds(200, 170, 50, 50);
panel.add(buttonminus);
JButton buttonmultiply = new JButton("×");
buttonmultiply.setBackground(Color.LIGHT_GRAY);
buttonmultiply.setBounds(200, 120, 50, 50);
panel.add(buttonmultiply);
JButton buttondivide = new JButton("÷");
buttondivide.setBackground(Color.LIGHT_GRAY);
buttondivide.setBounds(200, 70, 50, 50);
panel.add(buttondivide);
JButton buttonequals = new JButton("=");
buttonequals.setBackground(Color.LIGHT_GRAY);
buttonequals.setBounds(200, 270, 50, 50);
panel.add(buttonequals);
JButton buttonac = new JButton("AC");
buttonac.setBackground(Color.LIGHT_GRAY);
buttonac.setBounds(50, 70, 50, 50);
panel.add(buttonac);
JButton buttonzf = new JButton("+/-");
buttonzf.setBackground(Color.LIGHT_GRAY);
buttonzf.setBounds(100, 70, 50, 50);
panel.add(buttonzf);
JButton buttonbfh = new JButton("%");
buttonbfh.setBackground(Color.LIGHT_GRAY);
buttonbfh.setBounds(150, 70, 50, 50);
panel.add(buttonbfh);
JLabel labelans = new JLabel("0");
labelans.setHorizontalAlignment(SwingConstants.RIGHT);
labelans.setBounds(50, 20, 200, 50);
panel.add(labelans);
Ans ans = new Ans();//创建答案对象
//以下为按钮动作监听
button[0].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getEquals()!=0){
ans.setNum1("");
ans.setNum2("");
ans.setOperation(0);
ans.setEquals(0);
}
if(ans.getOperation()==0){
if(ans.getNum1().charAt(0)=='0'&&ans.getNum1().indexOf(".")==-1){
}
else{
ans.setNum1(ans.getNum1()+"0");
}
labelans.setText(ans.getNum1());
}else{
ans.setNum2(ans.getNum2()+"0");
labelans.setText(ans.getNum2());
}
}
});
button[1].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getEquals()!=0){
ans.setNum1("");
ans.setNum2("");
ans.setOperation(0);
ans.setEquals(0);
}
if(ans.getOperation()==0){
ans.setNum1(ans.getNum1()+"1");
labelans.setText(ans.getNum1());
}else{
ans.setNum2(ans.getNum2()+"1");
labelans.setText(ans.getNum2());
}
}
});
button[2].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getEquals()!=0){
ans.setNum1("");
ans.setNum2("");
ans.setOperation(0);
ans.setEquals(0);
}
if(ans.getOperation()==0){
ans.setNum1(ans.getNum1()+"2");
labelans.setText(ans.getNum1());
}else{
ans.setNum2(ans.getNum2()+"2");
labelans.setText(ans.getNum2());
}
}
});
button[3].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getEquals()!=0){
ans.setNum1("");
ans.setNum2("");
ans.setOperation(0);
ans.setEquals(0);
}
if(ans.getOperation()==0){
ans.setNum1(ans.getNum1()+"3");
labelans.setText(ans.getNum1());
}else{
ans.setNum2(ans.getNum2()+"3");
labelans.setText(ans.getNum2());
}
}
});
button[4].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getEquals()!=0){
ans.setNum1("");
ans.setNum2("");
ans.setOperation(0);
ans.setEquals(0);
}
if(ans.getOperation()==0){
ans.setNum1(ans.getNum1()+"4");
labelans.setText(ans.getNum1());
}else{
ans.setNum2(ans.getNum2()+"4");
labelans.setText(ans.getNum2());
}
}
});
button[5].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getEquals()!=0){
ans.setNum1("");
ans.setNum2("");
ans.setOperation(0);
ans.setEquals(0);
}
if(ans.getOperation()==0){
ans.setNum1(ans.getNum1()+"5");
labelans.setText(ans.getNum1());
}else{
ans.setNum2(ans.getNum2()+"5");
labelans.setText(ans.getNum2());
}
}
});
button[6].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getEquals()!=0){
ans.setNum1("");
ans.setNum2("");
ans.setOperation(0);
ans.setEquals(0);
}
if(ans.getOperation()==0){
ans.setNum1(ans.getNum1()+"6");
labelans.setText(ans.getNum1());
}else{
ans.setNum2(ans.getNum2()+"6");
labelans.setText(ans.getNum2());
}
}
});
button[7].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getEquals()!=0){
ans.setNum1("");
ans.setNum2("");
ans.setOperation(0);
ans.setEquals(0);
}
if(ans.getOperation()==0){
ans.setNum1(ans.getNum1()+"7");
labelans.setText(ans.getNum1());
}else{
ans.setNum2(ans.getNum2()+"7");
labelans.setText(ans.getNum2());
}
}
});
button[8].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getEquals()!=0){
ans.setNum1("");
ans.setNum2("");
ans.setOperation(0);
ans.setEquals(0);
}
if(ans.getOperation()==0){
ans.setNum1(ans.getNum1()+"8");
labelans.setText(ans.getNum1());
}else{
ans.setNum2(ans.getNum2()+"8");
labelans.setText(ans.getNum2());
}
}
});
button[9].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getEquals()!=0){
ans.setNum1("");
ans.setNum2("");
ans.setOperation(0);
ans.setEquals(0);
}
if(ans.getOperation()==0){
ans.setNum1(ans.getNum1()+"9");
labelans.setText(ans.getNum1());
}else{
ans.setNum2(ans.getNum2()+"9");
labelans.setText(ans.getNum2());
}
}
});
//"."按钮
buttondot.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getEquals()==0){
if (ans.getOperation() == 0) {
if (ans.getNum1().indexOf(".") == -1)
ans.setNum1(ans.getNum1() + ".");
labelans.setText(ans.getNum1());
} else {
if (ans.getNum2().indexOf(".") == -1)
ans.setNum2(ans.getNum2() + ".");
labelans.setText(ans.getNum2());
}
}else{
ans.setNum1("0.");
ans.setNum2("");
ans.setOperation(0);
ans.setEquals(0);
labelans.setText(ans.getNum1());
}
}
});
//"+-*/"
buttonadd.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
ans.setOperation(1);
labelans.setText("+");
}
});
buttonminus.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
ans.setOperation(2);
labelans.setText("-");
}
});
buttonmultiply.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
ans.setOperation(3);
labelans.setText("×");
}
});
buttondivide.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
ans.setOperation(4);
labelans.setText("÷");
}
});
//"="的动作监听
buttonequals.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
ans.setEquals(1);
if (ans.getNum1().equals(""))
ans.setNum1("0");
if (ans.getNum2().equals(""))
ans.setNum2("0");
BigDecimal b1 = new BigDecimal(ans.getNum1()).stripTrailingZeros(); // 去除末尾多余的0
BigDecimal b2 = new BigDecimal(ans.getNum2()).stripTrailingZeros();
ans.setNum1(b1.toPlainString());
ans.setNum2(b2.toPlainString()); // 防止科学记数法输出
DecimalFormat df = new DecimalFormat();
String style = "0.00000000000E00000";
df.applyPattern(style);
if (ans.getOperation() == 1) {
if (b1.add(b2).toPlainString().length() <= 27)
ans.setNum1(b1.add(b2).toPlainString());
else
ans.setNum1(df.format(b1.add(b2))); //科学计数法
} else if (ans.getOperation() == 2) {
if (b1.subtract(b2).toPlainString().length() <= 27)
ans.setNum1(b1.subtract(b2).toPlainString());
else
ans.setNum1(df.format(b1.subtract(b2)));
} else if (ans.getOperation() == 3) {
if (b1.multiply(b2).toPlainString().length() <= 27)
ans.setNum1(b1.multiply(b2).toPlainString());
else
ans.setNum1(df.format(b1.multiply(b2)));
} else if (ans.getOperation() == 4) {
if(b1.divide(b2, 16, RoundingMode.HALF_UP).toPlainString().length() <= 27)
ans.setNum1(b1.divide(b2, 16, RoundingMode.HALF_UP).toPlainString());
else
ans.setNum1(df.format(b1.divide(b2, 16, RoundingMode.HALF_UP)));
}
labelans.setText(ans.getNum1().replace("E", "×10^"));
}
});
buttonac.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ans.setNum1("");
ans.setNum2("");
ans.equals(0);
ans.setOperation(0);
labelans.setText("0");
}
});
buttonbfh.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
BigDecimal b1 = new BigDecimal(ans.getNum1()).stripTrailingZeros(); // 去除末尾多余的0
BigDecimal b2 = new BigDecimal("100").stripTrailingZeros();
ans.setNum1(b1.toPlainString()); // 防止科学记数法输出
DecimalFormat df = new DecimalFormat();
String style = "0.0000E00";
df.applyPattern(style);
if (b1.divide(b2, 16, RoundingMode.HALF_UP).toPlainString().length() <= 27)
ans.setNum1(b1.divide(b2, 16, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString());
else
ans.setNum1(df.format(b1.divide(b2, 16, RoundingMode.HALF_UP).stripTrailingZeros()));
labelans.setText(ans.getNum1().replace("E", "×10^"));
}
});
buttonzf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(ans.getOperation()==0){
if(ans.getNum1().indexOf("-")==-1)
ans.setNum1("-"+ans.getNum1());
labelans.setText(ans.getNum1().replace("E", "×10^"));
}else{
if(ans.getNum2().indexOf("-")==-1)
ans.setNum2("-"+ans.getNum2());
labelans.setText(ans.getNum2().replace("E", "×10^"));
}
}
});
//end
}
}
104行改为
frame.setType(Type.UTILITY);
貌似比较好看
源码及打包生成的jar及exe文件均已上传至网盘(2.0为本计算器)
链接: https://pan.baidu.com/s/1skQnqhf
密码: 牛B
仅供交流,引用请注明作者