前言
學習了 JAVA 的 Swing 編程,不由得興趣做了一個計算器,其中也參考了網上的一些例子,再加上自己的一些想法,花了大概半天的時間總算做出來了,總體來說,寫計算器的邏輯還是讓人受益匪淺的。
由於在代碼中我大部分做了註釋,在這裏就不多說了
package calcutor;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
/**
* 計算器
* @author Mr.W
* @version 1.0
*/
//聲明:沒有按到等於號的運算稱爲連續運算
class CalculatorTest implements ActionListener
{
JFrame f = new JFrame("計算器");
JTextField tf = new JTextField();
Press press = null;
//初始化窗口,構建計算器界面
public void init()
{
JPanel p1 = new JPanel();//此面板放置文本框和清除按鈕
Container ct = f.getContentPane();
//文本框的處理
tf.setPreferredSize(new Dimension(195,50));//設置文本框的理想大小
tf.setHorizontalAlignment(JTextField.RIGHT);//設置文本的水平右對齊
p1.add(tf);
//清除按鈕
JButton C = new JButton("CE");
C.addActionListener(this);
C.setPreferredSize(new Dimension(69,50));
p1.add(C);
//將畫板放置在最上面,北面
ct.add(p1,"North");
JPanel p2 = new JPanel();
ct.add(p2,"Center");
GridLayout c = new GridLayout(5,4); //網格佈局
p2.setLayout(c);
//按鈕的字符
String[] str ={
"sqrt","^","1/x","+/-",
"1", "2", "3", "+",
"4", "5", "6", "-" ,
"7", "8", "9", "x" ,
".", "0", "=", "/"
};
//循環添加按鈕到網格佈局的面板中,並設置按鈕監聽器
for(int i=0 ; i<str.length ; i++){
JButton b = new JButton(str[i]);
p2.add(b);
b.addActionListener(this);
}
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//關閉窗口即關閉程序
f.setSize(290,282);
f.setVisible(true);//窗口可見
}
public CalculatorTest(){
press = new Press(tf);
//其中v只存放四則運算操作,v2是存放所有操作
}
public void actionPerformed(ActionEvent e){
//獲取上次的文本框內容,也就是sum的值
String str=tf.getText();
//獲得按到的鍵
String er = e.getActionCommand();
switch (er) {
case "+":
press.Pressplus(str);//加法
break;
case "-":
press.PressCut(str);//減法
break;
case "x":
press.PressMu(str);//乘法
break;
case "/":
press.PressExc(str);//除法
break;
case "=":
press.Pressequal(str);
break;
case "1/x":
press.PressDown(str);
break;
case "^":
press.Presspow(str);
break;
case "sqrt":
press.Presssqrt(str);
break;
case "CE":
press.PressCE();
break;
case "+/-":
press.Pressagain(str);
break;
default:
press.PressNum(er, str);
break;
}
}
public static void main(String args[])
{
try {
//界面風格
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
new CalculatorTest().init();
}
}
package calcutor;
import java.util.Vector;
import javax.swing.JTextField;
public class Press {
private double sum=0;//用於盛放計算結果
private double mark = 0;//盛放冪數
private JTextField tf = null;
private Vector<String> v=new Vector(1,1);//存放運算符操作
private Vector<String> v2=new Vector(1,1);//存放所有操作
public Press(JTextField tf){
this.tf = tf;
v2.addElement(new String("init"));//addElement添加到末尾且自動加1,默認未按鍵存放init
v.addElement(new String("init"));
}
/*
* 按下等於號
*/
public void Pressequal(String str) {
common(str);
v.addElement(new String("="));
v2.addElement(new String("="));
}
/*
* 按下數字鍵
*/
public void PressNum(String e,String str){
// if (e.equals("1") ||
// e.equals("2") ||
// e.equals("3") ||
// e.equals("4") ||
// e.equals("5") ||
// e.equals("6") ||
// e.equals("7") ||
// e.equals("8") ||
// e.equals("9") ||
// e.equals("0") ||
// e.equals(".")
// ) //1,2,3,4,5,6,7,8,9,0,.的實現;
// {
if(
//第一次是按數字或者在四則運算之後按數字,注意這裏不包括數字前面是等於號
("+").equals((String)v2.lastElement()) ||
("-").equals((String)v2.lastElement()) ||
("x").equals((String)v2.lastElement()) ||
("/").equals((String)v2.lastElement()) ||
("init").equals((String)v2.lastElement())||
("sqrt").equals((String)v2.lastElement()) ||
("1/x").equals((String)v2.lastElement()) ||
("+/-").equals((String)v2.lastElement()) ||
("CE").equals((String)v2.lastElement())
)
{
tf.setText(e.toString());
}
else if(("^").equals((String)v2.lastElement())){
tf.setText(e.toString());
mark = Double.parseDouble(tf.getText());
}
//按了等於號後置sum爲0重新開始新的計算
else if (("=").equals((String)v2.lastElement()))
{
sum=0;
tf.setText(e.toString());//顯示按下的數字
}
//連續按下數字則連成字符串顯示出來
else
{
tf.setText(tf.getText()+e.toString());//調用其父類中的getText()方法
mark = Double.parseDouble(tf.getText());
}
v2.addElement(new String(e.toString()));//將數字添加到向量中
// }
}
/**
* 除法鍵
*/
public void PressExc(String str) {
common(str);
v.addElement(new String("/"));
v2.addElement(new String("/"));
}
/*
* 按下.
*/
// public void Presspoint(String str){
// if((".").equals((String)v2.lastElement()
// )
// }
/**
* 公共方法
* @param str
*/
public void common(String str){
//getActionCommand返回與此命令相關的字符串
if(
/**
* 用戶按了倆次運算符,包括上次的等於號,
也就是用戶不進行連續運算時,則顯示原來的數,
開機第一次按鍵 或者 第二次以後按鍵運算符沒有連續此條件不走
例如6++
*/
//lastELement指向最後一個元素
("+").equals((String)v2.lastElement()) ||
("-").equals((String)v2.lastElement()) ||
("x").equals((String)v2.lastElement()) ||
("/").equals((String)v2.lastElement()) ||
("=").equals((String)v2.lastElement()) ||
("sqrt").equals((String)v2.lastElement()) ||
("1/x").equals((String)v2.lastElement()) ||
("^").equals((String)v2.lastElement()) ||
("+/-").equals((String)v2.lastElement())
)
{
tf.setText(String.valueOf(sum));
}
/**
* 當第一次按鍵是+時,也只有開機第一次纔會執行此語句
*/
else if(("init").equals((String)v2.lastElement()))
{
tf.setText(String.valueOf(sum));//顯示初始化的值
}
/**
* 用戶進行連續運算時
* 或者
* 第一次按+鍵時
* (不是開機的第一次,開機的第一次按+鍵走上面的語句初始化文本框爲0)
* 例如 0+ 而不是+0
*/
else
{
double d=Double.parseDouble(str);
/*************!!!注意:這裏不是第一次相加***************/
//距離上次按+沒有出現其他的三種運算即 X,/,-,可理解爲連加
if (("+").equals((String)v.lastElement()))
{
sum=sum+d;
tf.setText(String.valueOf(sum));
}
//距離上次按-沒有出現其他的三種運算即 X,/,+,可理解爲 先減後加
else if (("-").equals((String)v.lastElement()))
{
//System.out.println("我連續按了倆次運算咯");
sum=sum-d;
tf.setText(String.valueOf(sum));
}
//距離上次按x沒有出現其他的三種運算即 +,/,-,可理解爲 先乘後加
else if(("x").equals((String)v.lastElement()))
{
sum=sum*d;
tf.setText(String.valueOf(sum));
}
//距離上次按/沒有出現其他的三種運算即 X,+,-,可理解爲 先除後加
else if(("/").equals((String)v.lastElement()))
{
sum=sum/d;
tf.setText(String.valueOf(sum));
}
else if(("^").equals((String)v.lastElement()))
{
Presspow();
}
else
{
sum=sum+d;
tf.setText(String.valueOf(sum));
}
}
}
/*
* 按下1/x
*/
public void PressDown(String str){
common(str);
sum = 1.0/sum ;
tf.setText(String.valueOf(sum));
v.addElement(new String("1/x"));
v2.addElement(new String("1/x"));
}
/*
* 按下x號
*/
public void PressMu(String str) {
common(str);
v.addElement(new String("x"));
v2.addElement(new String("x"));
}
/*
* 按下sqrt
*/
public void Presssqrt(String str){
common(str);
//System.out.println(sum);
sum = Math.sqrt(sum);
tf.setText(String.valueOf(sum));
v.addElement(new String("sqrt"));
v2.addElement(new String("sqrt"));
}
/*
* 按下^號
*/
public void Presspow(String str){
common(str);//先獲得sum的值
v.addElement(new String("^"));
v2.addElement(new String("^"));
}
public void Presspow(){
//System.out.println(sum+"sum=====mark"+mark);
sum = Math.pow(sum, mark);
tf.setText(String.valueOf(sum));
}
/**
* 按下加號鍵
*/
public void Pressplus(String str){
common(str);
//將分別按鍵添加到倆個向量去,
v.addElement(new String("+"));
v2.addElement(new String("+"));
}
/*
* 按下減號
*/
public void PressCut(String str){
common(str);
v.addElement(new String("-"));
v2.addElement(new String("-"));
}
/**
* 按下清除鍵
*/
public void PressCE(){
//按下了清除鍵就什麼都沒啦
sum = 0;
tf.setText("0.0");
v.addElement(new String("CE"));
v2.addElement(new String("CE"));
}
/*
* 按下+/-號
*/
public void Pressagain(String str){
common(str);
sum = -1.0*sum;
tf.setText(String.valueOf(sum));
v.addElement(new String("+/-"));
v2.addElement(new String("+/-"));
}
}
下面是程序運行結果哦
最近有點忙可能更新博客的速度會慢了一點,但還是會繼續堅持下去的,希望每天都能進步一點點~~~