Java 計算器
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class BorderLayoutWindow extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
// private 私密, final 只讀(無法更改),按鈕名稱。
private final String str[] = {
"", "CE", "C", "←", "÷",
"Pi", "7", "8", "9", "×",
"n!", "4", "5", "6", "-",
"+/-", "1", "2", "3", "+",
"(", ")", "0", ".", "="
};
private JButton buttonstr[] = new JButton[str.length];
// 其他未實現功能名稱。
private final String key[] = {
"x^2", "x^y", "sin", "cos", "tan",
"sqrt", "10^x", "log", "Exp", "Mod"
};
private JButton buttonkey[] = new JButton[key.length];
// 文字框
private JTextField resultText = new JTextField("0");
// 標誌使用者按的是否是整個表示式的第一個數字,或者是運算子後的第一個數字
private boolean firstDigit = true;
// 計算的中間結果。
private double resultNum = 0.0;
// 當前運算的運算子
private String operator = "=";
// 操作是否合法
private boolean operateValidFlag = true;
/**
* 建構函式
*/
public BorderLayoutWindow(){
//建立一個名字為“”的視窗
super("計算器(zmy)");
//設定視窗的佈局為邊緣佈局
setLayout(new BorderLayout());
// 編輯選單
JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("編輯");
JMenuItem item = new JMenuItem("標準型");
JMenuItem item1 = new JMenuItem("科學型");
menu.add(item);
menu.add(item1);
bar.add(menu);
this.setJMenuBar(bar);
/*
* setBorderPainted(false);
* 去除此元件的邊框。
* setPreferredSize(Dimension preferredSize)
* 設定此元件的首選大小。
* setBackground(Color bg)
* 設定此元件的背景色。
* setForeground(Color fg)
* 設定此元件的前景色。
* setFont(Font font)
* 設定此元件的字型。
* Font(String name, int style, int size)
* 根據指定名稱、樣式和磅值大小,建立一個新 Font。
* style:ITALIC = 2, BOLD = 1, PLAIN = 0;
*/
//建立具有指定佈局管理器的新皮膚。
JPanel top = new JPanel(new BorderLayout());
top.setPreferredSize(new Dimension(0,150));
JPanel pstr = new JPanel(new GridLayout(5, 5));
JPanel pkey = new JPanel(new GridLayout(2, 5));
pstr.setPreferredSize(new Dimension(0,280));
// 編輯按鈕外觀
for (int i = 0; i < str.length; i++) {
buttonstr[i] = new JButton(str[i]);
if(i==6||i==7||i==8||i==11||i==12||i==13||i==16||i==17||i==18||i==22||i==23){
buttonstr[i].setForeground(Color.blue);
buttonstr[i].setFont(new Font("加粗",1,25));
}
else if(i%5 == 4 || i == 3)
buttonstr[i].setFont(new Font("正常",0,25));
else
buttonstr[i].setFont(new Font("正常",0,20));
buttonstr[i].setBackground(new Color(245,245,245));
buttonstr[i].setBorderPainted(false);
pstr.add(buttonstr[i]);
}
for (int i = 0; i < key.length; i++) {
buttonkey[i] = new JButton(key[i]);
buttonkey[i].setFont(new Font("正常",0,18));
buttonkey[i].setBackground(Color.white);
buttonkey[i].setBorderPainted(false);
pkey.add(buttonkey[i]);
}
top.add("Center", resultText);
// 文字框中的內容採用右對齊方式
resultText.setHorizontalAlignment(JTextField.RIGHT);
// 不允許修改結果文字框
resultText.setEditable(false);
// 設定文字框背景顏色為白色
resultText.setBackground(Color.white);
resultText.setFont(new Font("加粗",1,50));
getContentPane().add(top, BorderLayout.NORTH);
getContentPane().add(pkey, BorderLayout.CENTER);
getContentPane().add(pstr, BorderLayout.SOUTH);
// 為各按鈕新增事件偵聽器
for (int i = 0; i < str.length; i++) {
buttonstr[i].addActionListener(this);
}
for (int i = 0; i < key.length; i++) {
buttonkey[i].addActionListener(this);
}
}
/**
* 處理事件
*/
public void actionPerformed(ActionEvent e) {
// 獲取事件源的標籤
String label = e.getActionCommand();
if (label.equals(str[1])) {
// 使用者按了"CE"鍵
resultText.setText("0");
} else if (label.equals(str[2])) {
// 使用者按了"C"鍵
// 初始化計算器的各種值
resultText.setText("0");
firstDigit = true;
operator = "=";
} else if (label.equals(str[3])) {
// 使用者按了"Backspace"鍵
handleBackspace();
} else if ("0123456789.".indexOf(label) >= 0) {
// 使用者按了數字鍵或者小數點鍵
handleNumber(label);
} else if(label.equals(str[5])) {
// 使用者按了Pi
if (firstDigit) {
resultText.setText("3.1415926");
}
} else {
// 使用者按了運算子鍵
handleOperator(label);
}
}
/**
* 處理Backspace鍵被按下的事件
*/
private void handleBackspace() {
String text = resultText.getText();
int i = text.length();
if (i > 0) {
// 退格,將文字最後一個字元去掉
text = text.substring(0, i - 1);
if (text.length() == 0) {
// 如果文字沒有了內容,則初始化計算器的各種值
resultText.setText("0");
firstDigit = true;
operator = "=";
} else {
// 顯示新的文字
resultText.setText(text);
}
}
}
/**
* 處理數字鍵被按下的事件
*/
private void handleNumber(String key) {
if (firstDigit) {
// 輸入的第一個數字
resultText.setText(key);
} else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) {
// 輸入的是小數點,並且之前沒有小數點,則將小數點附在結果文字框的後面
resultText.setText(resultText.getText() + ".");
} else if (!key.equals(".")) {
// 如果輸入的不是小數點,則將數字附在結果文字框的後面
resultText.setText(resultText.getText() + key);
}
// 以後輸入的肯定不是第一個數字了
firstDigit = false;
}
/**
* 處理運算子鍵被按下的事件
*/
private void handleOperator(String key) {
if (operator.equals("÷")) {
// 除法運算
// 如果當前結果文字框中的值等於0
if (getNumberFromText() == 0.0) {
// 操作不合法
operateValidFlag = false;
resultText.setText("除數不能為零");
} else {
resultNum /= getNumberFromText();
}
} else if (operator.equals("+")) {
// 加法運算
resultNum += getNumberFromText();
} else if (operator.equals("-")) {
// 減法運算
resultNum -= getNumberFromText();
} else if (operator.equals("×")) {
// 乘法運算
resultNum *= getNumberFromText();
} else if (operator.equals("sqrt")) {
// 平方根運算
resultNum = Math.sqrt(resultNum);
} else if (operator.equals("Mod")) {
// 模運算
double temp = getNumberFromText();
if((int)resultNum == resultNum && (int)temp == temp)
resultNum = (int)resultNum%(int)temp;
else{
operateValidFlag = false;
resultText.setText("浮點數不能Mod");
}
} else if (operator.equals("+/-")) {
// 正數負數運算
resultNum = resultNum * (-1);
} else if (operator.equals("=")) {
// 賦值運算
resultNum = getNumberFromText();
}
if (operateValidFlag) {
// 雙精度浮點數的運算
int t1;
double t2;
t1 = (int) resultNum;
t2 = resultNum - t1;
if (t2 == 0) {
resultText.setText(String.valueOf(t1));
} else {
resultText.setText(String.valueOf(resultNum));
}
}
// 運算子等於使用者按的按鈕
operator = key;
firstDigit = true;
operateValidFlag = true;
}
/**
* 從結果文字框中獲取數字
*/
private double getNumberFromText() {
double result = 0;
try {
result = Double.valueOf(resultText.getText()).doubleValue();
} catch (NumberFormatException e) {
}
return result;
}
}
運算這部分是搬別人程式碼的┭┮﹏┭┮
相關文章
- Java語言編寫計算器(簡單的計算器)Java
- 計算器製作JAVA版(綜述)Java
- Java利用Scanner 加Swich實現計算器Java
- java方法練習之簡單計算器Java
- 計算器
- hdu 1237 Java 簡單計算器Java
- Java實現一個簡單的計算器Java
- 日期計算器
- 健康計算器
- 四則運算計算器
- 用java實現一個簡單的計算器Java
- Java計算器(使用逆波蘭表示式演算法)Java演算法
- 【java web】--JavaScript讓計算器無需Switch和if elseWebJavaScript
- 計算素數【Java】Java
- 計算Java日期 (轉)Java
- 【計項02組01號】Java版圖形介面計算器【1.0】Java
- 逆波蘭計算器
- android計算器Android
- web計算器案例Web
- c#計算器C#
- java 簡單工廠模式(實現一個計算器)Java模式
- 商業計算Java高精度計算BigDecimal類JavaDecimal
- 向量點積計算javaJava
- java版複利計算Java
- java計算間隔天數Java
- Java浮點數計算Java
- 簡單混合運算的計算器
- AUTOCAD——快速計算器
- 用VB寫計算器
- 簡單版計算器
- MFC簡單計算器
- PHP簡單計算器PHP
- 計算機器與智慧計算機
- javafx開發計算器Java
- Object-C,四則運算計算器Object
- Java (計算機程式語言)Java計算機
- 【JAVA】多邊形重心計算Java
- java面試--計算機網路Java面試計算機網路