這是我在java課程設計上的一個作品。老師要求很簡單,我盡量做得完善,在要求之外,做了不少。
在小數點,一些windows計算器怪異的地方(3+=+9++4=),參考網上的算法完成。
算法簡介:
[=]的功能:
算法具體鏈接:http://blog.csdn.net/haochen_net/archive/2008/10/25/3143290.aspx
Cal類的實現:
import java.awt.BorderLayout;
import java.awt.CheckboxMenuItem;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.html.HTMLDocument.HTMLReader.IsindexAction;
public class Cal extends JFrame implements ActionListener {
// 菜單
MenuBar myMenuBar = new MenuBar();
// JPanel
JPanel pdisplay = new JPanel();
JPanel pm = new JPanel(new GridLayout(5, 1, 0, 5));
JPanel pc = new JPanel(new GridLayout(1, 3, 5, 0));
JPanel pb = new JPanel(new GridLayout(4, 5, 5, 5));
JPanel pbc = new JPanel(new BorderLayout(5, 5));
JPanel pbcm = new JPanel();
static// 顯示
JTextField tftext = new JTextField(25);
JTextField tfm = new JTextField(5);
// 按鈕字符定義及按鈕
String strB[] = { "MC", "MR", "MS", "M+", "Backspace", "CE", "C", "7", "8",
"9", "/", "sqrt", "4", "5", "6", "*", "%", "1", "2", "3", "-",
"1/x", "0", "+/-", ".", "+", "=" };
JButton[] jb = new JButton[27];
public Cal() {
super("計算機-蕎葉制作");
addMenu();
initDisplay();
initPbcm();
Container pane = this.getContentPane();
pane.setLayout(new BorderLayout(10, 5));
pane.add(pdisplay, BorderLayout.NORTH);
pane.add(pbcm, BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBounds(300, 200, 400, 260);
this.setResizable(false);
this.setVisible(true);
}
// 一些類變量
static StringBuilder text = new StringBuilder("0");// 顯示符
StringBuilder number = new StringBuilder("0");// 當前數.
double rightOper;// 右數
double leftOper;// 左數
double result;// 結果
int operator;// 操作符,默認為0,沒有操作符
int isFloat = 0;// 0不是浮點型,1輸入了一個.2真正的浮點
boolean isZero = true;// 0顯示清空狀態,不能輸入0.輸入1-9進入1狀態.可以輸入0-9進入2;
boolean isNeg;// 默認為正數
boolean isExcp;// 默認沒有異常.
StringBuilder m = new StringBuilder("0");// 存儲數串變量
int isRightInput = 0;// 一次有效右輸入,輸入運算符后=1;再輸入數字后=2;
// //////////////////////////////////////////////////////////////////////////////////////
/**
* number是用于給leftOper和rightOper賦值的.純純的能夠轉化為Double類型的StringBuilder.
* 當然text,number,m考慮到大量的String連接和轉換,StringBuilder效率更高.
* */
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd == "0" || cmd == "1" || cmd == "2" || cmd == "3" || cmd == "4"
|| cmd == "5" || cmd == "6" || cmd == "7" || cmd == "8"
|| cmd == "9") {
if (isExcp)// 如果是三種錯誤之一,就不響應了.只有CE和C能夠響應
return;
if (isRightInput == 1)// 如果是待一次有效右輸入.也就是前一次輸入的是運算符.
isRightInput = 2;// 進階真正的右輸入
if (isZero) {// 處于清空狀態
number = new StringBuilder(cmd);// number直接為一個數字串
isZero = false;// 有一位數字后,不在處于清空.后面就可以輸入運算符,單目,.,+/-
} else {
if (isFloat == 1) {// 待浮點狀態,前一次輸入的是.
number.append('.');// number這時加入.
isFloat = 2;// 真正的浮點.
}
number.append(cmd);// 數字后連接數字.
if (number.charAt(0) == '0' && isFloat != 2)// 如果不是浮點,
number.deleteCharAt(0);// 但以0開頭就刪去.這種方法不優雅,但想不出更好的.
}
text = number;// 只要輸入數字,無條件地顯示.
} else if (cmd == ".") {
if (isExcp)
return;
if (isFloat == 0)// 如果不是浮點型
isFloat = 1;// 待浮點型.
} else if (cmd == "+/-") {
if (isZero || isExcp)// 清空狀態或異常.
return;
if (isNeg) {// 如果是負數就變為正數,如果是正數就變為負數.
isNeg = false;
number.deleteCharAt(0);// delete和insert操作可以推遲到完成數字輸入狀態后,根據isNeg來判斷更好.
} else {
isNeg = true;
number.insert(0, '-');
}
text = number;
}
// 雙目運算功能
else if (cmd == "+" || cmd == "-" || cmd == "*" || cmd == "/") {
if (isExcp)
return;
if (isRightInput == 0)
isRightInput = 1;// 變為待一次有效右輸入狀態.
if (isRightInput == 2) {// 如果已經是一次有效右輸入了.就相當于'='.比如1+2+的時候.
rightOper = Double.parseDouble(number.toString());// 當前的number給右數.
try {
result = Util.calculate(leftOper, rightOper, operator);// 根據三個變量計算。如果/時右數為0,就拋異常.
} catch (ArithmeticException ae) {
isExcp = true;
if (leftOper == 0)// 左數,右數同時為0時.
text = new StringBuilder("函數結果未定義。");
else
text = new StringBuilder("除數不能為零。");
}
rightOper = leftOper = result;// 把得到的結果給左數,同時也給右數.
text = new StringBuilder(String.valueOf(result));
isZero = true;
isRightInput = 1;// 直接就是1狀態.不經過0
}
if (operator == 0)// 如果運算符沒有.如:1+
rightOper = leftOper = Double.parseDouble(number.toString());// 左數和右數均賦值.
// 據cmd初始化operator.此步一定進行,不管是運算符功能還是=功能.
if (cmd == "+")// 很無奈的是不能用switch.enum太繁.
operator = 1;
else if (cmd == "-")
operator = 2;
else if (cmd == "*")
operator = 3;
else
operator = 4;
isZero = true;
}
// 單目運算
else if (cmd == "sqrt") {
if (isExcp)
return;
double dnum = Double.parseDouble(number.toString());
if (dnum < 0) {// 如果當前數為負,就錯誤.
isExcp = true;
text = new StringBuilder("函數輸入無效。");
} else {
result = Math.sqrt(dnum);
number = text = new StringBuilder(String.valueOf(result));
if (operator == 0)// 有運算符必賦值給右數.
leftOper = result;
else {
rightOper = result;
}
isZero = true;
}
} else if (cmd == "%") {
if (isExcp)
return;
double dnum = Double.parseDouble(number.toString());
result = leftOper * dnum / 100;// 這種規則讓人很難適應,有點小變態.
number = text = new StringBuilder(String.valueOf(result));
if (operator == 0)
leftOper = result;
else {
rightOper = result;
}
isZero = true;
} else if (cmd == "1/x") {
if (isExcp)
return;
double dnum = Double.parseDouble(number.toString());
if (dnum == 0) {
isExcp = true;
text = new StringBuilder("除數不能為零。");
} else {
result = 1 / Double.parseDouble(number.toString());
number = text = new StringBuilder(String.valueOf(result));
if (operator == 0)
leftOper = result;
else {
rightOper = result;
}
isZero = true;
}
} else if (e.getActionCommand() == "=") {
if (isExcp)
return;
double dnum = Double.parseDouble(number.toString());
if (isRightInput == 2) {// 一次有效的右輸入.如1+2=-2.如1+2=3=.就不響應3.
rightOper = dnum;// 當前數賦給右數.
isRightInput = 0;// =號破壞一次右輸入,必須得以+-*/開頭,后接數字
}
if (operator != 0) {// 1+2=
try {
result = Util.calculate(leftOper, rightOper, operator);
} catch (ArithmeticException ae) {
isExcp = true;
if (leftOper == 0)// 左數,右數同時為0時.
text = new StringBuilder("函數結果未定義。");
else
text = new StringBuilder("除數不能為零。");
}
leftOper = result;
} else
// 1=
result = dnum;
text = new StringBuilder(String.valueOf(result));
isZero = true;
} else if (e.getActionCommand() == "關于計算器") {
String temp = "java模擬windows高模仿實用計算器.\n蕎葉制作.qq:494053175 \n blog:sina wangflood";
JOptionPane.showMessageDialog(null, temp, "關于計算器",
JOptionPane.INFORMATION_MESSAGE);
}
// BackSpace功能
else if (cmd == "Backspace") {
if (isExcp)
return;
if ((!isNeg && number.length() < 2)// 正數剩一位時,負數剩二位時.直接跳到0
|| (isNeg && number.length() < 3)) {
isZero = true;
number = new StringBuilder("0");
} else
number = number.deleteCharAt(number.length() - 1);// 每次刪除最后一位.
text = number;
} else if (cmd == "CE") {
isZero = true;
isExcp = false;// 清異常.
text = number;
} else if (cmd == "C") {
operator = 0;// 清運算符.
isZero = true;
leftOper = 0;// 清左數
rightOper = 0;// 清右數.
result = 0;// 清結果.
number = text = new StringBuilder("0");// 清當前數
isExcp = false;// 清異常
isRightInput = 0;// 清一次有效右輸入.
} else if (cmd == "MC") {
if (isExcp)// 同樣也響應不了.異常的時候.
return;
m = new StringBuilder("0");
} else if (cmd == "MR") {// 顯示存儲數到display.
if (isExcp)
return;
isRightInput = 2;
number = text = m;
} else if (cmd == "MS") {
if (isExcp)
return;
m = number;// 將當前數賦給m.
} else if (cmd == "M+") {// 當前數與m相加賦給m
if (isExcp)
return;
m = new StringBuilder(String.valueOf((Double.parseDouble(m
.toString()) + Double.parseDouble(number.toString()))));
} else {// 一般不給出現這種情況.我們都會上天堂的.
System.out.println("歡迎來到地獄!");
}
// 按任何鍵都會觸發的.
tftext.setText(text.toString());
if (m.length() != 0)// m不空的話就顯示M
tfm.setText("M");
else
tfm.setText("");
if (isZero) {// 為清空狀態.浮點狀態和負數狀態回到默認.
isFloat = 0;
isNeg = false;
}
}
private void initDisplay() {
tftext.setHorizontalAlignment(JTextField.RIGHT);
pdisplay.add(tftext);
tftext.setText("0.");
tfm.setHorizontalAlignment(JTextField.CENTER);
tfm.setEditable(false);
pm.add(tfm);
}
private void initPbcm() {
// 生成按鈕
for (int i = 0; i < 27; i++) {
jb[i] = new JButton(strB[i]);
}
for (int i = 0; i < 4; i++) {
jb[i].addActionListener(this);
pm.add(jb[i]);
}
for (int i = 4; i < 7; i++) {
jb[i].addActionListener(this);
pc.add(jb[i]);
}
for (int i = 7; i < 27; i++) {
jb[i].addActionListener(this);
pb.add(jb[i]);
}
pbc.add(pc, BorderLayout.NORTH);
pbc.add(pb, BorderLayout.CENTER);
pbcm.add(pm);
pbcm.add(pbc);
}
private void addMenu() {
this.setMenuBar(myMenuBar);
// 以下是編輯菜單項
Menu editMenu = new Menu("編輯");
myMenuBar.add(editMenu);
MenuItem menuitemcopy = new MenuItem("復制");
MenuItem menuitemplaste = new MenuItem("粘貼");
MenuItem menuitemload = new MenuItem("用戶登錄");
editMenu.add(menuitemload);
editMenu.add(menuitemcopy);
editMenu.add(menuitemplaste);
menuitemload.addActionListener(this);
menuitemcopy.addActionListener(this);
menuitemplaste.addActionListener(this);
// 以下是編輯菜單項
Menu watchMenu = new Menu("查看");
myMenuBar.add(watchMenu);
MenuItem menuitemstandard = new MenuItem("標準型");
MenuItem menuitemsencien = new MenuItem("科學型");
watchMenu.add(menuitemstandard);
watchMenu.add(menuitemsencien);
watchMenu.addSeparator();
watchMenu.add(new MenuItem("數字分組"));
menuitemstandard.addActionListener(this);
menuitemsencien.addActionListener(this);
// 以下是幫助菜單項
Menu helpMenu = new Menu("幫助");
myMenuBar.add(helpMenu);
CheckboxMenuItem menuitemhelp = new CheckboxMenuItem("幫助主題", false);
MenuItem menuitemaboutcal = new MenuItem("關于計算器");
helpMenu.add(menuitemhelp);
helpMenu.addSeparator();
helpMenu.add(menuitemaboutcal);
menuitemhelp.addActionListener(this);
menuitemaboutcal.addActionListener(this);
}
public static void main(String[] args) {
new Cal();
}
}
Util.java輔助類
運行界面:
有些地方還沒有完善。高手飄過,探討改進啊。
在小數點,一些windows計算器怪異的地方(3+=+9++4=),參考網上的算法完成。
算法簡介:
[=]的功能:
1.如果前次為一次有效的右數輸入則將當前數賦給右數變量。
2.檢查符變量是否存在運算符,若存在則計算表達式左數 運算符 右數,并將結果賦給左數變量,同時顯示。若不存在,則不作操作。
3.清空串變量。
1.若前次為一次運算數輸入,則執行[=]。
2.將當前數賦給左右數變量,將運算符賦給符變量。
3.清空串變量。
算法具體鏈接:http://blog.csdn.net/haochen_net/archive/2008/10/25/3143290.aspx
Cal類的實現:
import java.awt.BorderLayout;
import java.awt.CheckboxMenuItem;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.html.HTMLDocument.HTMLReader.IsindexAction;
public class Cal extends JFrame implements ActionListener {
// 菜單
MenuBar myMenuBar = new MenuBar();
// JPanel
JPanel pdisplay = new JPanel();
JPanel pm = new JPanel(new GridLayout(5, 1, 0, 5));
JPanel pc = new JPanel(new GridLayout(1, 3, 5, 0));
JPanel pb = new JPanel(new GridLayout(4, 5, 5, 5));
JPanel pbc = new JPanel(new BorderLayout(5, 5));
JPanel pbcm = new JPanel();
static// 顯示
JTextField tftext = new JTextField(25);
JTextField tfm = new JTextField(5);
// 按鈕字符定義及按鈕
String strB[] = { "MC", "MR", "MS", "M+", "Backspace", "CE", "C", "7", "8",
"9", "/", "sqrt", "4", "5", "6", "*", "%", "1", "2", "3", "-",
"1/x", "0", "+/-", ".", "+", "=" };
JButton[] jb = new JButton[27];
public Cal() {
super("計算機-蕎葉制作");
addMenu();
initDisplay();
initPbcm();
Container pane = this.getContentPane();
pane.setLayout(new BorderLayout(10, 5));
pane.add(pdisplay, BorderLayout.NORTH);
pane.add(pbcm, BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBounds(300, 200, 400, 260);
this.setResizable(false);
this.setVisible(true);
}
// 一些類變量
static StringBuilder text = new StringBuilder("0");// 顯示符
StringBuilder number = new StringBuilder("0");// 當前數.
double rightOper;// 右數
double leftOper;// 左數
double result;// 結果
int operator;// 操作符,默認為0,沒有操作符
int isFloat = 0;// 0不是浮點型,1輸入了一個.2真正的浮點
boolean isZero = true;// 0顯示清空狀態,不能輸入0.輸入1-9進入1狀態.可以輸入0-9進入2;
boolean isNeg;// 默認為正數
boolean isExcp;// 默認沒有異常.
StringBuilder m = new StringBuilder("0");// 存儲數串變量
int isRightInput = 0;// 一次有效右輸入,輸入運算符后=1;再輸入數字后=2;
// //////////////////////////////////////////////////////////////////////////////////////
/**
* number是用于給leftOper和rightOper賦值的.純純的能夠轉化為Double類型的StringBuilder.
* 當然text,number,m考慮到大量的String連接和轉換,StringBuilder效率更高.
* */
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd == "0" || cmd == "1" || cmd == "2" || cmd == "3" || cmd == "4"
|| cmd == "5" || cmd == "6" || cmd == "7" || cmd == "8"
|| cmd == "9") {
if (isExcp)// 如果是三種錯誤之一,就不響應了.只有CE和C能夠響應
return;
if (isRightInput == 1)// 如果是待一次有效右輸入.也就是前一次輸入的是運算符.
isRightInput = 2;// 進階真正的右輸入
if (isZero) {// 處于清空狀態
number = new StringBuilder(cmd);// number直接為一個數字串
isZero = false;// 有一位數字后,不在處于清空.后面就可以輸入運算符,單目,.,+/-
} else {
if (isFloat == 1) {// 待浮點狀態,前一次輸入的是.
number.append('.');// number這時加入.
isFloat = 2;// 真正的浮點.
}
number.append(cmd);// 數字后連接數字.
if (number.charAt(0) == '0' && isFloat != 2)// 如果不是浮點,
number.deleteCharAt(0);// 但以0開頭就刪去.這種方法不優雅,但想不出更好的.
}
text = number;// 只要輸入數字,無條件地顯示.
} else if (cmd == ".") {
if (isExcp)
return;
if (isFloat == 0)// 如果不是浮點型
isFloat = 1;// 待浮點型.
} else if (cmd == "+/-") {
if (isZero || isExcp)// 清空狀態或異常.
return;
if (isNeg) {// 如果是負數就變為正數,如果是正數就變為負數.
isNeg = false;
number.deleteCharAt(0);// delete和insert操作可以推遲到完成數字輸入狀態后,根據isNeg來判斷更好.
} else {
isNeg = true;
number.insert(0, '-');
}
text = number;
}
// 雙目運算功能
else if (cmd == "+" || cmd == "-" || cmd == "*" || cmd == "/") {
if (isExcp)
return;
if (isRightInput == 0)
isRightInput = 1;// 變為待一次有效右輸入狀態.
if (isRightInput == 2) {// 如果已經是一次有效右輸入了.就相當于'='.比如1+2+的時候.
rightOper = Double.parseDouble(number.toString());// 當前的number給右數.
try {
result = Util.calculate(leftOper, rightOper, operator);// 根據三個變量計算。如果/時右數為0,就拋異常.
} catch (ArithmeticException ae) {
isExcp = true;
if (leftOper == 0)// 左數,右數同時為0時.
text = new StringBuilder("函數結果未定義。");
else
text = new StringBuilder("除數不能為零。");
}
rightOper = leftOper = result;// 把得到的結果給左數,同時也給右數.
text = new StringBuilder(String.valueOf(result));
isZero = true;
isRightInput = 1;// 直接就是1狀態.不經過0
}
if (operator == 0)// 如果運算符沒有.如:1+
rightOper = leftOper = Double.parseDouble(number.toString());// 左數和右數均賦值.
// 據cmd初始化operator.此步一定進行,不管是運算符功能還是=功能.
if (cmd == "+")// 很無奈的是不能用switch.enum太繁.
operator = 1;
else if (cmd == "-")
operator = 2;
else if (cmd == "*")
operator = 3;
else
operator = 4;
isZero = true;
}
// 單目運算
else if (cmd == "sqrt") {
if (isExcp)
return;
double dnum = Double.parseDouble(number.toString());
if (dnum < 0) {// 如果當前數為負,就錯誤.
isExcp = true;
text = new StringBuilder("函數輸入無效。");
} else {
result = Math.sqrt(dnum);
number = text = new StringBuilder(String.valueOf(result));
if (operator == 0)// 有運算符必賦值給右數.
leftOper = result;
else {
rightOper = result;
}
isZero = true;
}
} else if (cmd == "%") {
if (isExcp)
return;
double dnum = Double.parseDouble(number.toString());
result = leftOper * dnum / 100;// 這種規則讓人很難適應,有點小變態.
number = text = new StringBuilder(String.valueOf(result));
if (operator == 0)
leftOper = result;
else {
rightOper = result;
}
isZero = true;
} else if (cmd == "1/x") {
if (isExcp)
return;
double dnum = Double.parseDouble(number.toString());
if (dnum == 0) {
isExcp = true;
text = new StringBuilder("除數不能為零。");
} else {
result = 1 / Double.parseDouble(number.toString());
number = text = new StringBuilder(String.valueOf(result));
if (operator == 0)
leftOper = result;
else {
rightOper = result;
}
isZero = true;
}
} else if (e.getActionCommand() == "=") {
if (isExcp)
return;
double dnum = Double.parseDouble(number.toString());
if (isRightInput == 2) {// 一次有效的右輸入.如1+2=-2.如1+2=3=.就不響應3.
rightOper = dnum;// 當前數賦給右數.
isRightInput = 0;// =號破壞一次右輸入,必須得以+-*/開頭,后接數字
}
if (operator != 0) {// 1+2=
try {
result = Util.calculate(leftOper, rightOper, operator);
} catch (ArithmeticException ae) {
isExcp = true;
if (leftOper == 0)// 左數,右數同時為0時.
text = new StringBuilder("函數結果未定義。");
else
text = new StringBuilder("除數不能為零。");
}
leftOper = result;
} else
// 1=
result = dnum;
text = new StringBuilder(String.valueOf(result));
isZero = true;
} else if (e.getActionCommand() == "關于計算器") {
String temp = "java模擬windows高模仿實用計算器.\n蕎葉制作.qq:494053175 \n blog:sina wangflood";
JOptionPane.showMessageDialog(null, temp, "關于計算器",
JOptionPane.INFORMATION_MESSAGE);
}
// BackSpace功能
else if (cmd == "Backspace") {
if (isExcp)
return;
if ((!isNeg && number.length() < 2)// 正數剩一位時,負數剩二位時.直接跳到0
|| (isNeg && number.length() < 3)) {
isZero = true;
number = new StringBuilder("0");
} else
number = number.deleteCharAt(number.length() - 1);// 每次刪除最后一位.
text = number;
} else if (cmd == "CE") {
isZero = true;
isExcp = false;// 清異常.
text = number;
} else if (cmd == "C") {
operator = 0;// 清運算符.
isZero = true;
leftOper = 0;// 清左數
rightOper = 0;// 清右數.
result = 0;// 清結果.
number = text = new StringBuilder("0");// 清當前數
isExcp = false;// 清異常
isRightInput = 0;// 清一次有效右輸入.
} else if (cmd == "MC") {
if (isExcp)// 同樣也響應不了.異常的時候.
return;
m = new StringBuilder("0");
} else if (cmd == "MR") {// 顯示存儲數到display.
if (isExcp)
return;
isRightInput = 2;
number = text = m;
} else if (cmd == "MS") {
if (isExcp)
return;
m = number;// 將當前數賦給m.
} else if (cmd == "M+") {// 當前數與m相加賦給m
if (isExcp)
return;
m = new StringBuilder(String.valueOf((Double.parseDouble(m
.toString()) + Double.parseDouble(number.toString()))));
} else {// 一般不給出現這種情況.我們都會上天堂的.
System.out.println("歡迎來到地獄!");
}
// 按任何鍵都會觸發的.
tftext.setText(text.toString());
if (m.length() != 0)// m不空的話就顯示M
tfm.setText("M");
else
tfm.setText("");
if (isZero) {// 為清空狀態.浮點狀態和負數狀態回到默認.
isFloat = 0;
isNeg = false;
}
}
private void initDisplay() {
tftext.setHorizontalAlignment(JTextField.RIGHT);
pdisplay.add(tftext);
tftext.setText("0.");
tfm.setHorizontalAlignment(JTextField.CENTER);
tfm.setEditable(false);
pm.add(tfm);
}
private void initPbcm() {
// 生成按鈕
for (int i = 0; i < 27; i++) {
jb[i] = new JButton(strB[i]);
}
for (int i = 0; i < 4; i++) {
jb[i].addActionListener(this);
pm.add(jb[i]);
}
for (int i = 4; i < 7; i++) {
jb[i].addActionListener(this);
pc.add(jb[i]);
}
for (int i = 7; i < 27; i++) {
jb[i].addActionListener(this);
pb.add(jb[i]);
}
pbc.add(pc, BorderLayout.NORTH);
pbc.add(pb, BorderLayout.CENTER);
pbcm.add(pm);
pbcm.add(pbc);
}
private void addMenu() {
this.setMenuBar(myMenuBar);
// 以下是編輯菜單項
Menu editMenu = new Menu("編輯");
myMenuBar.add(editMenu);
MenuItem menuitemcopy = new MenuItem("復制");
MenuItem menuitemplaste = new MenuItem("粘貼");
MenuItem menuitemload = new MenuItem("用戶登錄");
editMenu.add(menuitemload);
editMenu.add(menuitemcopy);
editMenu.add(menuitemplaste);
menuitemload.addActionListener(this);
menuitemcopy.addActionListener(this);
menuitemplaste.addActionListener(this);
// 以下是編輯菜單項
Menu watchMenu = new Menu("查看");
myMenuBar.add(watchMenu);
MenuItem menuitemstandard = new MenuItem("標準型");
MenuItem menuitemsencien = new MenuItem("科學型");
watchMenu.add(menuitemstandard);
watchMenu.add(menuitemsencien);
watchMenu.addSeparator();
watchMenu.add(new MenuItem("數字分組"));
menuitemstandard.addActionListener(this);
menuitemsencien.addActionListener(this);
// 以下是幫助菜單項
Menu helpMenu = new Menu("幫助");
myMenuBar.add(helpMenu);
CheckboxMenuItem menuitemhelp = new CheckboxMenuItem("幫助主題", false);
MenuItem menuitemaboutcal = new MenuItem("關于計算器");
helpMenu.add(menuitemhelp);
helpMenu.addSeparator();
helpMenu.add(menuitemaboutcal);
menuitemhelp.addActionListener(this);
menuitemaboutcal.addActionListener(this);
}
public static void main(String[] args) {
new Cal();
}
}
Util.java輔助類
package wang.window.impl;
public class Util {
/** DoubleString格式化顯示.如果有小數點,只對小數點前面進行格式化. */
private String DoubleFormat(String str) {
StringBuilder sb = new StringBuilder();
int length = str.length();
int left = length % 3;
int count = 0;
if (left == 0)
left = 3;
String tail = "";
if (str.contains(".")) {
int index = str.indexOf('.');
tail = str.substring(index);
str = str.substring(0, index);
}
for (int i = 0; i < str.length(); i++) {
if (i == left)
sb.append(",");
else if (i > left) {
count++;
if (count % 3 == 0)
sb.append(",");
}
sb.append(str.charAt(i));
}
sb.append(tail);
return sb.toString();
}
private void display() {
}
/** 根據兩double類型的操作數,和操作符,計算后返回double類型結果 */
public static double calculate(double leftOper, double rightOper,
int operator) {
double result = 0;
switch (operator) {
case 1:
result = leftOper + rightOper;
break;
case 2:
result = leftOper - rightOper;
break;
case 3:
result = leftOper * rightOper;
break;
case 4:
if (leftOper == 0)
throw new ArithmeticException();
result = leftOper / rightOper;
break;
default:
System.out.println("歡迎來到地獄!");
break;
}
return result;
}
public String format(int isfloat, boolean isNeg, StringBuilder text) {
int start = 0;//.前一個位置
int end;//-后一個位置
int count = 0;//計數
if (isfloat != 2)
start = text.length() - 1;//java里數組的長度不用掃描?
if (isNeg)
end = 1;
else
end = 0;
StringBuilder sb = new StringBuilder();
for (int i = text.length() - 1; i >= 0; i++) {
char temp = text.charAt(i);
if (isfloat == 2) {
if (temp == '.')
start = i - 1;
}
if (i == start && i <= end) {
if (count == 2)
sb.append(",");//插入,的條件
count = (count + 1) % 3;
}
sb.append(temp);
}
return sb.reverse().toString();//逆序
}
}
public class Util {
/** DoubleString格式化顯示.如果有小數點,只對小數點前面進行格式化. */
private String DoubleFormat(String str) {
StringBuilder sb = new StringBuilder();
int length = str.length();
int left = length % 3;
int count = 0;
if (left == 0)
left = 3;
String tail = "";
if (str.contains(".")) {
int index = str.indexOf('.');
tail = str.substring(index);
str = str.substring(0, index);
}
for (int i = 0; i < str.length(); i++) {
if (i == left)
sb.append(",");
else if (i > left) {
count++;
if (count % 3 == 0)
sb.append(",");
}
sb.append(str.charAt(i));
}
sb.append(tail);
return sb.toString();
}
private void display() {
}
/** 根據兩double類型的操作數,和操作符,計算后返回double類型結果 */
public static double calculate(double leftOper, double rightOper,
int operator) {
double result = 0;
switch (operator) {
case 1:
result = leftOper + rightOper;
break;
case 2:
result = leftOper - rightOper;
break;
case 3:
result = leftOper * rightOper;
break;
case 4:
if (leftOper == 0)
throw new ArithmeticException();
result = leftOper / rightOper;
break;
default:
System.out.println("歡迎來到地獄!");
break;
}
return result;
}
public String format(int isfloat, boolean isNeg, StringBuilder text) {
int start = 0;//.前一個位置
int end;//-后一個位置
int count = 0;//計數
if (isfloat != 2)
start = text.length() - 1;//java里數組的長度不用掃描?
if (isNeg)
end = 1;
else
end = 0;
StringBuilder sb = new StringBuilder();
for (int i = text.length() - 1; i >= 0; i++) {
char temp = text.charAt(i);
if (isfloat == 2) {
if (temp == '.')
start = i - 1;
}
if (i == start && i <= end) {
if (count == 2)
sb.append(",");//插入,的條件
count = (count + 1) % 3;
}
sb.append(temp);
}
return sb.reverse().toString();//逆序
}
}
運行界面:

有些地方還沒有完善。高手飄過,探討改進啊。