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
僅供交流,引用請註明作者