- 相關推薦
java計算器綜合實例學習教程
下面是百分網小編帶來的Java計算器綜合實例學習教程,歡迎學習!
本節給出了一個計算器的綜合實例,該實例主要利用了本章及上一章所涉及的SWING組件及組件事件的處理來實現的,在實現的過程中還使用到了異常處理的知識。
[例8-14]
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Calculator extends JFrame{
String[] buttons =
new String[]{"7","8","9","/","4","5","6","*","1","2","3","-","0","+/-",".","+"};
JPanel pWest = new JPanel();
JPanel pMain = new JPanel();
JPanel pNorth = new JPanel();
JPanel pMain_North = new JPanel();
JPanel pMain_Center = new JPanel();
JPanel pMain_East = new JPanel();
JButton buttonMain[];//包括數字0-9以及'+','-','*','+'/'.','+/-'
JButton buttonNorth[];//包括Back,CE,C
JButton buttonEast[];//包括sqrt,%,1/x,=
JTextField fieldResult = new JTextField();
//
static private String value1="";//第一個操作數
static private String value2="";//第二個操作數
static private String oper="";//操作符
static private String result="";//運算結果
static private String lastChar="";//相比當前,其上一個按下按鈕的字符
static private boolean value1Input=true;//處于第一個操作數輸入情況
static private boolean value2Input=false;//出于第二個操作數輸入情況
static private boolean start = false;//是否開始計算,主要是用于檢測剛開始時按下非數字鍵的情況。
public Calculator(String title){
super(title);
Container contentPane = this.getContentPane();
fieldResult.setHorizontalAlignment(JTextField.RIGHT);//右對齊
pMain_Center.setLayout(new GridLayout(4,4,5,5));
buttonMain= new JButton[buttons.length];
for(int i=0;i
buttonMain[i] = new JButton(buttons[i]);
pMain_Center.add(buttonMain[i]);
}
buttonNorth = new JButton[3];
buttonNorth[0] = new JButton("Back");
buttonNorth[1] = new JButton("CE");
buttonNorth[2] = new JButton("C");
pMain_North.setLayout(new GridLayout(1,3,5,5));
pMain_North.add(buttonNorth[0]);
pMain_North.add(buttonNorth[1]);
pMain_North.add(buttonNorth[2]);
buttonEast = new JButton[4];
buttonEast[0] = new JButton("sqrt");
buttonEast[1] = new JButton("%");
buttonEast[2] = new JButton("1/x");
buttonEast[3] = new JButton("=");
pMain_East.setLayout(new GridLayout(4,1,5,5));
pMain_East.add(buttonEast[0]);
pMain_East.add(buttonEast[1]);
pMain_East.add(buttonEast[2]);
pMain_East.add(buttonEast[3]);
contentPane.add(fieldResult,BorderLayout.NORTH);
pMain.setLayout(new BorderLayout(5,5));
pMain.add(pMain_Center,BorderLayout.WEST);
pMain.add(pMain_East,BorderLayout.EAST);
pMain.add(pMain_North,BorderLayout.NORTH);
contentPane.add(pMain,BorderLayout.CENTER);
pack();
setVisible(true);
//注冊監x器
MyActionListener listener = new MyActionListener();
for(int i=0;i
buttonMain[i].addActionListener(listener);
}
buttonNorth[0].addActionListener(listener);//Back
buttonEast[3].addActionListener(listener);//"="
buttonNorth[2].addActionListener(listener);//"C"
buttonMain[13].setEnabled(false);//設置+/-不可用
buttonMain[14].setEnabled(false);//設置.不可用
buttonNorth[1].setEnabled(false);//設置CE不可用
buttonEast[0].setEnabled(false);//設置sqrt不可用
buttonEast[1].setEnabled(false);//設置%不可用
buttonEast[2].setEnabled(false);//設置1/x不可用
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private class MyActionListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
String str = e.getActionCommand();
//數字鍵
if(Character.isDigit(str.charAt(0))){
handalDigit(str);
}
if(start == true){
if(str.equals("=")){//"="鍵
handalEqual(str);
return;
}
//Back、C鍵處理,完善本程序時可在下面的語句中添加對其他按鈕的處理
if(str.equals("Back")||str.equals("C")){
handalNonOper(str);
}
//'+','-','*','+'/'的處理,完善本程序時可添加sqrt,%等操作符的處理
if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
handalOper(str);
}
}
}
//處理數字,str表示按鈕上的文字
private void handalDigit(String str){
char currentChar=str.charAt(0);//獲得按下的字符;
if(!lastChar.equals("=")){
if(value2Input == false){
value1+=String.valueOf(currentChar);
if(value1.charAt(0)=='0'){//第一個數字為0
value1="0";
}
fieldResult.setText(value1);
}
else{
value2+=String.valueOf(currentChar);
if(value2.charAt(0)=='0'){//第一個數字為0
value2="0";
}
fieldResult.setText(value2);
}
start = true;
lastChar = str;
}
else{//是=
resetAllValue();
value1+=str;
fieldResult.setText(value1);
}
printAllValue();
}
//處理"="鍵
private void handalEqual(String str){
if(Character.isDigit(lastChar.charAt(0)) && value2.length()>0){
handalOper(str);
}
}
//處理運算符,暫時只處理+,-,*,/str表示按鈕上的文字
private void handalOper(String str){
if(start == true){
if(value1.length()>0 && value2.length()>0){
result=operationResult(value1,value2,oper.charAt(0));
fieldResult.setText(result);
if(!result.equals("除數不能為零")){
value1=result;
value2="";
}
}
else{//說明第一個操作數輸入結束,操作符結束,開始輸入第二個操作數
value1Input=false;
value2Input=true;
}
oper = str;//記錄操作符
lastChar = str;//記錄最后一個字符
printAllValue();
}
}
//處理非運算符,但不是數字,如Back,C等鍵,str表示按鈕上的文字
private void handalNonOper(String str){
if(str.equals("Back")){//Back鍵處理
if(Character.isDigit(lastChar.charAt(0)) == true){//必須是前一個字符是數字
if(value2Input == true){
if(value2.length()>0){
value2 = value2.substring(0,value2.length()-1);
}
fieldResult.setText(value2);
}
else{
if(value1.length()>0){
value1 = value1.substring(0,value1.length()-1);
}
else{
resetAllValue();
}
fieldResult.setText(value1);
}
}
printAllValue();
}
if(str.equals("C")){//C鍵處理
resetAllValue();
fieldResult.setText("");
printAllValue();
}
}
//對兩個字符串value1和value2表示的整數做運算,oper表示運算符
private String operationResult(String value1,String value2,char oper){
String result;
try{
switch(oper){
case '+':
result = String.valueOf(Integer.parseInt(value1)+Integer.parseInt(value2));
break;
case '-':
result = String.valueOf(Integer.parseInt(value1)-Integer.parseInt(value2));
break;
case '*':
result = String.valueOf(Integer.parseInt(value1)*Integer.parseInt(value2));
break;
case '/':
if(value2.equals("0")){
result="除數不能為零";
resetAllValue();//所有值置初值
}
else{
result = String.valueOf(Integer.parseInt(value1)/Integer.parseInt(value2));
}
break;
default:
result="error";
}
}
catch(Exception ex){
result = "操作數或結果超過整數范圍";
resetAllValue();
}
return result;
}
//重置變量值
private void resetAllValue(){
value1="";//第一個操作數
value2="";//第二個操作數
oper="";//操作符
result="";//運算結果
lastChar="";//相比當前,其上一個按下按鈕的字符
value1Input=true;//處于第一個操作數輸入情況
value2Input=false;//出于第二個操作數輸入情況
start = false;
}
//打印變量值
private void printAllValue(){
System.out.println("| --------Values display----------------");
System.out.println("| value1:" + value1);
System.out.println("| value2:" + value2);
System.out.println("| oper:" + oper);
System.out.println("| result:" + result);
System.out.println("| lastChar:" + lastChar);
System.out.println("| value1Input:" + value1Input);
System.out.println("| value2Input:" + value2Input);
System.out.println("| start:" + start);
System.out.println("| --------------------------------------");
}
}
}
public class Calculator{
public static void main(String[] args) {
new Calculator("計算器");
}
}
程序運行主界面如下:
圖8-18 計算器程序運行主界面
該程序實現了加減乘除運算,且充分考慮了各種異常情況,一般不會出現在按下某個按鍵時出現程序報異常的錯誤,對于程序中未實現的按鈕功能,運行界面中都以灰色按鈕的形式出現,讀者可在研究本程序的基礎上完成這些按鍵的功能。
【java計算器綜合實例學習教程】相關文章:
Java的特點學習教程08-27
Java數組的基礎學習教程08-12
Java對話框學習教程05-31
java教程之Java編程基礎09-12
Java菜單和工具欄學習教程07-26
Java for循環語句使用實例08-26
Java中的Spring入門實例09-15
Java實現多繼承的實例07-18
java動態方法調度實例10-01
java調用c函數的實例09-16