package jisuanji;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.accessibility.AccessibleAction;
import javax.swing.JButton;
import javax.swing.JTextField;
public class jisuanjicalc extends JFrame{
JButton equalJB,divJB,button0JB,button1JB,button2JB,button3JB,button4JB,button5JB,button6JB,
button7JB,button8JB,button9JB,addJB,subJB,mulJB,dotJB,CEJB,EXITJB,bsJB;//窗口組件(按鈕)
JButton numJB[]=new JButton[10];
JPanel panelJP,panel2JP,panel3JP;//定義面板
JLabel equalJL,errorJL;//創造窗口需要顯示組件
JTextField num1JT;
//GUI開發+的一般步驟:
//1.創建窗口類,繼承自JFrame
//2.定義相關組件的引用名(包括面板的引用名)
//3.在構造器方法中創建組件對象并且與引用名關聯。
//4.創建面板,將將組件添加到面板(中間容器)
//5.將面板,添加到窗口(頂層容器)
//6.設置窗口大小,可見性,標題欄…… (詳細,仔細參考JDK文檔 )
//7.創建內部類(組件的事件響應代碼)
//8.添加相應組件的事件監聽
double a=0,b=0,c;
boolean dotflag=false;
String operator;
public jisuanjicalc() {
errorJL=new JLabel("");
num1JT=new JTextField(26);//數字的作用是調用構造文本框寬度
num1JT.setPreferredSize(new Dimension(50, 50));//數字的作用是調用構造文本框高度
//num1JT.setEditable(false);//不可改寫窗口
//divJB.addActionListener(new exitAction() );
/*button0JB=new JButton("0");//添加按妞
button1JB=new JButton("1");
button2JB=new JButton("2");
button3JB=new JButton("3");
button4JB=new JButton("4");
button5JB=new JButton("5");
button6JB=new JButton("6");
button7JB=new JButton("7");
button8JB=new JButton("8");
button9JB=new JButton("9");*/
for(int i=0;i<numJB.length;i++) {
numJB[i]=new JButton(i+"");
}
addJB=new JButton("+");
subJB=new JButton("-");
mulJB=new JButton("*");
divJB=new JButton("÷");
dotJB=new JButton(".");
equalJB=new JButton("=");
CEJB=new JButton("CE");
EXITJB=new JButton("EXIT");
bsJB=new JButton("←―");
dotJB.addActionListener(new dotAction());
equalJB.addActionListener(new equalAction() );
addJB.addActionListener(new operatorAction() );//使按鈕有效(監聽)
subJB.addActionListener(new operatorAction() );
mulJB.addActionListener(new operatorAction() );
divJB.addActionListener(new operatorAction() );
CEJB.addActionListener(new CEAction() );
EXITJB.addActionListener(new EXITAction() );
bsJB.addActionListener(new bsAction() );
for(int i=0;i<numJB.length;i++) {
numJB[i].addActionListener(new numAction());
}
/*button0JB.addActionListener(new numAction() );
button1JB.addActionListener(new numAction() );
button2JB.addActionListener(new numAction() );
button3JB.addActionListener(new numAction() );
button4JB.addActionListener(new numAction() );
button5JB.addActionListener(new numAction() );
button6JB.addActionListener(new numAction() );
button7JB.addActionListener(new numAction() );
button8JB.addActionListener(new numAction() );
button9JB.addActionListener(new numAction() );*/
panelJP=new JPanel();//添加面板
panel2JP=new JPanel();
panel3JP=new JPanel();//讓相應組件在相應的面板
panelJP.add(num1JT);
for(int i=1;i<=3;i++) {
panel2JP.add(numJB[i]);
}
panel2JP.add(addJB);
for(int i=4;i<=6;i++) {
panel2JP.add(numJB[i]);
}
panel2JP.add(subJB);
for(int i=7;i<=9;i++) {
panel2JP.add(numJB[i]);
}
panel2JP.add(mulJB);
panel2JP.add(numJB[0]);
/*panel2JP.add(button1JB);
panel2JP.add(button2JB);
panel2JP.add(button3JB);
panel2JP.add(button4JB);
panel2JP.add(button5JB);
panel2JP.add(button6JB);
panel2JP.add(button7JB);
panel2JP.add(button8JB);
panel2JP.add(button9JB);
panel2JP.add(button0JB);*/
panel2JP.add(dotJB);
panel2JP.add(divJB);
panel2JP.add(equalJB);
panel2JP.setLayout(new GridLayout(5,8,8,8));
panel3JP.add(errorJL);
panel2JP.add(CEJB);
panel2JP.add(EXITJB);
panel2JP.add(bsJB);
//this.add(CEJB,BorderLayout.CENTER);
//this.add(panelJP,BorderLayout.NORTH);//邊界布局的北邊.布局方式:流式布局(FloatLayout)、邊界布局(BorderLayout)、網格布局(GirLayout)
this.add(panelJP,BorderLayout.NORTH);//為不同的面板布局,顯示不同面板的內容
this.add(panel2JP,BorderLayout.CENTER);
this.add(panel3JP,BorderLayout.SOUTH);
this.setTitle("計算器");
this.setSize(300,450);//設置窗口大小
this.setResizable(false);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// class calcAction implements ActionListener{
// public void actionPerformed(ActionEvent m) {
// errorJL.setText("數字格式錯誤");
// num1JT.setText("");
// c=a+b;
// c=(double)(Math.round(c*100))/100;//設置保留數字位數
// num1JT.setText(c+"");
// }
// }
//創建事件類部 //實現監聽器接口
class numAction implements ActionListener{
public void actionPerformed(ActionEvent e) {
JButton tempJB=(JButton)e.getSource();//強轉為按妞,接下來與tempJB的getText
num1JT.setText(num1JT.getText()+tempJB.getText());//讓文本框獲取按妞的內容
}
}
class equalAction implements ActionListener{
public void actionPerformed(ActionEvent q) {
try {
b=Double.parseDouble(num1JT.getText());
switch(operator) {
case "+":c=a+b;break;
case "-":c=a-b;break;
case "*":c=a*b;break;
case "÷":c=a/b;break;
}
c=(double)(Math.round(c*100))/100;
num1JT.setText(c+"");
}catch(NumberFormatException m) {
JOptionPane.showMessageDialog(null, "數字格式錯誤");
num1JT.setText("");
}
}
}
class dotAction implements ActionListener{
public void actionPerformed(ActionEvent e) {
if(dotflag==false)
num1JT.setText(num1JT.getText()+e.getActionCommand());
dotflag=true;
}
}
class operatorAction implements ActionListener{
public void actionPerformed(ActionEvent e) {
try {
a=Double.parseDouble(num1JT.getText());
}catch(NumberFormatException m){
num1JT.setText("");//此前應將operator定義為全局變量
}
num1JT.setText("");
operator=e.getActionCommand();//獲取組件標簽、文本
dotflag=false;
}
}
class CEAction implements ActionListener{
public void actionPerformed(ActionEvent e) {
num1JT.setText("");
operator=e.getActionCommand();//獲取組件標簽、文本
dotflag=false;
}
}
class bsAction implements ActionListener{
public void actionPerformed(ActionEvent e) {
String str=num1JT.getText();
num1JT.setText(str.substring(0,str.length()-1));//取數字長度減一位的內容
}
}
class EXITAction implements ActionListener{
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
public static void main (String[] args) {
new jisuanjicalc();
}
}
|