?? calculator.java
字號:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.LinkedList;
import java.text.NumberFormat;
public class Calculator extends Frame implements ActionListener
{
NumberButton numberButton[];
OperationButton operationButton[];
Button dian,zhengfu,tuige,daoshu,dengyu,qingling;
Panel panel;
JTextField resultShow;
String yunsuan[]={"+","-","*","/"};
LinkedList lianbiao;
boolean flag=false;
public Calculator()
{
super("金芳計數器");
lianbiao=new LinkedList();
numberButton=new NumberButton[10];
for(int i=0;i<=9;i++)
{
numberButton[i]=new NumberButton(i);
numberButton[i].addActionListener(this);
}
operationButton=new OperationButton[4];
//將yunsuan[i]中的+、-、*、/賦予operationButton數組
for(int i=0;i<=3;i++)
{
operationButton[i]=new OperationButton(yunsuan[i]);
operationButton[i].addActionListener(this);
}
dian=new Button(".");
zhengfu=new Button("+/-");
dengyu=new Button("=");
daoshu=new Button("1/x");
tuige=new Button("退格");
qingling=new Button("C");
//前景色
qingling.setForeground(Color.red);
tuige.setForeground(Color.red);
dengyu.setForeground(Color.red);
daoshu.setForeground(Color.blue);
zhengfu.setForeground(Color.blue);
dian.setForeground(Color.blue);
//添加事件
tuige.addActionListener(this);
qingling.addActionListener(this);
dengyu.addActionListener(this);
dian.addActionListener(this);
zhengfu.addActionListener(this);
daoshu.addActionListener(this);
//顯示結果文本框的設計
resultShow=new JTextField(10);
resultShow.setHorizontalAlignment(JTextField.RIGHT);
resultShow.setForeground(Color.blue);
resultShow.setFont(new Font("TimesRoman",Font.PLAIN,14));
resultShow.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
resultShow.setBackground(Color.white);
resultShow.setEditable(false);
panel=new Panel();
panel.setLayout(new GridLayout(4,5));
//第一行顯示的按鈕
panel.add(numberButton[1]);
panel.add(numberButton[2]);
panel.add(numberButton[3]);
panel.add(operationButton[0]);
panel.add(qingling);
//第二行顯示的按鈕
panel.add(numberButton[4]);
panel.add(numberButton[5]);
panel.add(numberButton[6]);
panel.add(operationButton[1]);
panel.add(tuige);
//第三行顯示的按鈕
panel.add(numberButton[7]);
panel.add(numberButton[8]);
panel.add(numberButton[9]);
panel.add(operationButton[2]);
panel.add(daoshu);
//第四行顯示的按鈕
panel.add(numberButton[0]);
panel.add(zhengfu);
panel.add(dian);
panel.add(operationButton[3]);
panel.add(dengyu);
add(panel,BorderLayout.CENTER);
add(resultShow,BorderLayout.NORTH);
//添加關閉事件
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{System.exit(0);}
}
);
setVisible(true);
setBounds(100,50,240,180);
setResizable(false);
validate();
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() instanceof NumberButton)//如果鼠標單擊數字按鈕
{
NumberButton btn=(NumberButton)e.getSource();
if(lianbiao.size()==0)//如果鏈表中沒有節點
{
int number=btn.getNumber();//從NumberButton方法中獲取按鈕上的字
lianbiao.add(""+number);
resultShow.setText(""+number);
flag=false;//等號沒有被按下
}
else if(lianbiao.size()==1&&flag==false)
{
int number=btn.getNumber();
String num=(String)lianbiao.getFirst();
String s=num.concat(""+number);//將兩個數字首位相接
lianbiao.set(0,s);
resultShow.setText(s);
}
else if(lianbiao.size()==1&&flag==true)
{
int number=btn.getNumber();
lianbiao.removeFirst();
lianbiao.add(""+number);//將數據添加到鏈表
flag=false;
resultShow.setText(""+number);
}
else if(lianbiao.size()==2)//鏈表中已經有兩個接點
{
int number=btn.getNumber();//獲取按鈕上的數字
lianbiao.add(""+number);//鏈表中添加第三個接點,第二個是符號
resultShow.setText(""+number);
}
else if(lianbiao.size()==3)//鏈表中已經有三個接點
{
int number=btn.getNumber();
String num=(String)lianbiao.getLast();
String s=num.concat(""+number);//與第三個接點的數字首尾相連
lianbiao.set(2,s);
resultShow.setText(s);
}
}
else if(e.getSource() instanceof OperationButton)//如果單擊運算符號按鈕
{
OperationButton b=(OperationButton)e.getSource();
if(lianbiao.size()==1)
{
String fuhao=b.getOperator();
lianbiao.add(fuhao);//鏈表添加第二個接點:運算符號
}
else if(lianbiao.size()==2)
{
String fuhao=b.getOperator();
lianbiao.set(1,fuhao);//改變運算符號
}
else if(lianbiao.size()==3)//當有三個接點并且還要輸入符號時,要將前面的進行運算
{
String fuhao=b.getOperator();
String number1=(String)lianbiao.getFirst();
String number2=(String)lianbiao.getLast();
String yunsuan=(String)lianbiao.get(1);
//下面進行運算
try{
double n1=Double.parseDouble(number1);
double n2=Double.parseDouble(number2);
double n=0;//n為運算后的結果
if(yunsuan.equals("+"))//加法
{
n=n1+n2;
}
else if(yunsuan.equals("-"))//減法
{
n=n1-n2;
}
else if(yunsuan.equals("*"))//乘法
{
n=n1*n2;
}
else if(yunsuan.equals("/"))//除法
{
n=n1/n2;
}
lianbiao.clear();//清空鏈表內記錄
lianbiao.add(""+n);
lianbiao.add(fuhao);
resultShow.setText(""+n);
}catch(Exception ee){}
}
}
else if(e.getSource()==dengyu)
{
flag=true;
if(lianbiao.size()==1||lianbiao.size()==2)
{
String num=(String)lianbiao.getFirst();
resultShow.setText(""+num);//當只有一個或者兩個數字,則可能一個是數字,而另外是一個數字和一個符號
}
else if(lianbiao.size()==3)
{
String number1=(String)lianbiao.getFirst();
String number2=(String)lianbiao.getLast();
String yunsuan=(String)lianbiao.get(1);
//下面進行運算
try{
double n1=Double.parseDouble(number1);
double n2=Double.parseDouble(number2);
double n=0;//n為運算后的結果
if(yunsuan.equals("+"))//加法
{
n=n1+n2;
}
else if(yunsuan.equals("-"))//減法
{
n=n1-n2;
}
else if(yunsuan.equals("*"))//乘法
{
n=n1*n2;
}
else if(yunsuan.equals("/"))//除法
{
n=n1/n2;
}
resultShow.setText(""+n);
lianbiao.set(0,""+n);
lianbiao.removeLast();//刪除2,3兩個接點
lianbiao.removeLast();
}catch(Exception ee){}
}
}
else if(e.getSource()==dian)
{
if(lianbiao.size()==0)//鏈表中沒有接點
{
flag=false;
}
else if(lianbiao.size()==1)
{
String dot=dian.getLabel();//獲取按鈕上的小數點
String num=(String)lianbiao.getFirst();
String s=null;
if(num.indexOf(dot)==-1)//當數字中已經無小數點時
{
s=num.concat(dot);
lianbiao.set(0,s);
}
else//當數字中已經有小數點時
{
s=num;
}
lianbiao.set(0,s);
resultShow.setText(s);
}
else if(lianbiao.size()==3)
{
String dot=dian.getLabel();
String num=(String)lianbiao.getLast();
String s=null;
if(num.indexOf(dot)==-1)
{
s=num.concat(dot);
lianbiao.set(2,s);
}
else
{
s=num;
}
resultShow.setText(s);
}
}
else if(e.getSource()==tuige)//退格
{
if(lianbiao.size()==1)//有一個數
{
String num=(String)lianbiao.getFirst();
if(num.length()>=1)//該數的長度》=1
{
num=num.substring(0,num.length()-1);
lianbiao.set(0,num);
resultShow.setText(num);
}
else
{
lianbiao.removeLast();
resultShow.setText("0");
}
}
else if (lianbiao.size()==3)
{
String num=(String)lianbiao.getLast();
if(num.length()>=1)
{
num=num.substring(0,num.length()-1);
lianbiao.set(2,num);
resultShow.setText(num);
}
else
{
lianbiao.removeLast();
resultShow.setText("0");
}
}
}
else if(e.getSource()==zhengfu)//正負
{
if(lianbiao.size()==1)
{
String number1=(String)lianbiao.getFirst();
try{
double d=Double.parseDouble(number1);
d=-1*d;
String str=String.valueOf(d);
lianbiao.set(0,str);
resultShow.setText(str);
}catch(Exception ee){}
}
else if(lianbiao.size()==3)
{
String number2=(String)lianbiao.getLast();
try{
double d=Double.parseDouble(number2);
d=-1*d;
String str=String.valueOf(d);
lianbiao.set(2,str);
resultShow.setText(str);
}catch(Exception ee){}
}
}
else if(e.getSource()==daoshu)//倒數
{
if(lianbiao.size()==1||lianbiao.size()==2)
{
String number1=(String)lianbiao.getFirst();
try{
double d=Double.parseDouble(number1);
d=1.0/d;
String str=String.valueOf(d);
lianbiao.set(0,str);
resultShow.setText(str);
}catch(Exception ee){}
}
else if(lianbiao.size()==3)
{
String number2=(String)lianbiao.getLast();
try{
double d=Double.parseDouble(number2);
d=1.0/d;
String str=String.valueOf(d);
lianbiao.set(0,str);
resultShow.setText(str);
}catch(Exception ee){}
}
}
else if(e.getSource()==qingling)//清零
{
flag=false;
resultShow.setText("0");
lianbiao.clear();
}
}
public static void main(String args[])
{
Calculator calculator=new Calculator();
}
};
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -