1. 程式人生 > 程式設計 >java實現簡易版圖形介面計算器

java實現簡易版圖形介面計算器

經過一個月的Java學習,聽說Java中的第一個小型程式好多都做的是計算器,今天我也來做做吧,把這一個月學習的知識簡單的綜合一下,熟練近期學習的知識點。

我做的計算器如下圖:

java實現簡易版圖形介面計算器

功能:對實數進行加、減、乘、除、餘操作。

介面設定:首先設定一個窗體,一個選單條,三個選單項(無功能),三個標籤(作為顯示資料的地方,第一個標籤作為提示作用,第二個標籤作為輸入資料作用,第三個標籤顯示結果作用),20個按鈕(迴圈進行新增),兩個面板(把三個標籤新增到第一個面板裡,把20個按鈕新增到第二個面板裡,用網格佈局,這樣做不易位置錯亂),再把兩個面板新增到窗體中就OK了。

下面是完整程式碼,在一個類中,註釋非常詳細。

package day7_29;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
 
public class Caculate {
 // 對計算器整體框架的建立
 private JFrame frame = new JFrame("&斌的圖形介面計算器&");// 建立窗體物件
 private JMenuBar menubar = new JMenuBar(); // 建立選單條物件
 private JMenu menu1 = new JMenu("檢視"); // 建立選單物件1
 private JMenu menu2 = new JMenu("編輯"); // 建立選單物件2
 private JMenu menu3 = new JMenu("幫助"); // 建立選單物件3
 private JLabel label_hint = new JLabel(); // 建立提示資訊標籤
 private JLabel label_input = new JLabel(); // 建立輸入資訊標籤
 private JLabel label_result = new JLabel(); // 建立輸出結果標籤3
 private JPanel panel_show = new JPanel(); // 建立顯示面板
 private JPanel panel_operation = new JPanel(); // 建立按鍵面板
 
 private String[] str = { "AC","←","(-)","+","7","8","9","-","4","5","6","*","1","2","3","÷","%","0",".","=" }; // 計算器的按鍵從上到下、從左到右順序表示
 private JButton[] button = new JButton[str.length]; // 建立計算器的按鍵物件
 private double result = 0; // 儲存計算結果
 private boolean flag = true; //
 private boolean find = true; 
 private String command = "=";
 
 public static void main(String[] args) {// 主方法
 new Caculate().initJFrame();
 }
 
 // 對介面進行初始化
 public void initJFrame() {
 Container con = frame.getContentPane();
 con.setBackground(Color.green); // 設定顏色
 // 設定窗體位置及大小(下面一段程式碼實現居中)
 frame.setSize(600,550); 
 //方法一
// Toolkit toolKit = Toolkit.getDefaultToolkit(); // 獲取預設工具包
// Dimension dimension = toolKit.getScreenSize(); // 獲取螢幕物件
// double screenWidth = dimension.getWidth(); // 獲取螢幕的寬和高
// double screenHight = dimension.getHeight();
// int jframeWidth = frame.getWidth(); // 獲取窗體的寬和高
// int jframeHight = frame.getHeight();
// int x = (int) ((screenWidth - jframeWidth) / 2); // 得到窗體真正位置
// int y = (int) ((screenHight - jframeHight) / 2);
// frame.setLocation(x,y); // 設定窗體居中
 //方法二
 frame.setLocationRelativeTo(null);//設定視窗相對於指定元件的位置。如果元件當前未顯示,或者 c 為 null,則此視窗將置於螢幕的中央。
 
 menubar.add(menu1);// 把選單新增到選單條中
 menubar.add(menu2);
 menubar.add(menu3);
 menu1.setFont(new Font("",Font.BOLD,20));// 設定選單字型樣式
 menu2.setFont(new Font("",20));
 menu3.setFont(new Font("",20));
 frame.setJMenuBar(menubar);// 把選單新增到選單條中
 
 label_hint.setText(" "); // 標籤內容初始化為空
 label_hint.setHorizontalAlignment(JLabel.RIGHT); // 設定圖示和文字的水平對齊方式為右對齊
 label_hint.setFont(new Font("宋體",30));// 設定此標籤的字型。
 label_hint.setForeground(Color.RED); // 設定字型顏色為紅色
 
 label_input.setText(" "); // 標籤內容初始化為空
 label_input.setHorizontalAlignment(JLabel.RIGHT); // 設定圖示和文字的水平對齊方式為右對齊
 label_input.setFont(new Font("宋體",30));// 設定此標籤的字型。
 label_input.setForeground(Color.BLACK); // 設定字型顏色為黑色
 
 label_result.setText("0");// 標籤內容初始化內容為0
 label_result.setHorizontalAlignment(JLabel.RIGHT); // 設定圖示和文字的水平對齊方式為右對齊
 label_result.setFont(new Font("宋體",35));// 設定此標籤的字型。
 label_result.setForeground(Color.BLUE); // 設定字型顏色為藍色
 
 panel_show.setLayout(new BorderLayout()); // 設定為邊界佈局
 panel_show.add(label_hint,BorderLayout.NORTH); // 把錯誤提示標籤放在上面
 panel_show.add(label_input,BorderLayout.CENTER);// 把輸入資訊標籤放在中間
 panel_show.add(label_result,BorderLayout.SOUTH);// 把輸出結果標籤放在下面
 // 建立具有指定型別、高亮顯示和陰影顏色的斜面邊框。
 panel_show.setBorder(
 new BevelBorder(BevelBorder.RAISED,new Color(160,170,180),null,SystemColor.scrollbar,null));
 panel_operation.setLayout(new GridLayout(5,4,8,8));// 按鍵設定為網格佈局5行5列間距為8
 // 建立具有指定型別、高亮顯示和陰影顏色的斜面邊框。凸出斜面型別。為滾動條提供的背景色。
 panel_operation.setBorder(
 new BevelBorder(BevelBorder.RAISED,null));
 // 新增按鈕
 for (int i = 0; i < str.length; i++) {
 button[i] = new JButton(str[i]);
 button[i].setFont(new Font("宋體",30)); // 設定按鈕中字型樣式
 if (str[i].equals("+") || str[i].equals("-") || str[i].equals("*") || str[i].equals("÷")
  || str[i].equals("%") || str[i].equals("=")) {
 button[i].addActionListener(new OperationListener());// 給按鈕+,-,*,/,%,=註冊監聽器
 } else {
 button[i].addActionListener(new DataListener());//給按鈕AC,←,(-),.,1,2,3,5,6,7,9註冊監聽器
 }
 
 panel_operation.add(button[i]);// 把每個按鈕分別新增到面板上
 }
 // 把面板新增到窗體框架裡
 frame.add(panel_operation,BorderLayout.CENTER);
 frame.add(panel_show,BorderLayout.NORTH);
 //frame.setResizable(false); // 設定窗體不能改變大小
 frame.setVisible(true); // 設定窗體可見
 frame.setDefaultCloseOperation(frame.DISPOSE_ON_CLOSE);// 釋放視窗
 }
 
 public class DataListener implements ActionListener {
 @Override
 public void actionPerformed(ActionEvent e) {
 String str = e.getActionCommand();//返回與此動作相關的命令字串。
 if (Caculate.this.flag == true) {//當想輸入新的數字時,清空輸入顯示標籤
 label_input.setText(" ");
 Caculate.this.flag = false;
 
 }
 if (str.equals("(-)")) {//當點選(-)時
 if (label_input.getText().indexOf("(-)") == -1) {//如果此時顯示框裡還沒出現(-)時
  label_input.setText(str);
 }
 }
 if (!str.equals("(-)")) {//當命令不是(-)時
 if (str.equals("AC")) { //點選清零鍵時
  clear();
 } else if (str.equals("←")) { //點選返回鍵時
  getBack();
 } else if (str.equals(".")) { // 點選小數點時,小數點只能出現一次,不能在首位
  if (label_input.getText().indexOf(".") == -1 && !label_input.getText().equals(" ")) {
  label_input.setText(label_input.getText() + str);
  } else {
  //clear();
  label_input.setText(label_input.getText() + str);
  label_hint.setText("小數點不合法,請重新輸入");
  }
 } else { //點選0,9時顯示原數
  label_input.setText(label_input.getText() + str);
 }
 }
 }
 }
 
 // 返回上一級
 public void getBack() {
 if (label_input.getText().length() <= 1) { //長度小於等於1時清空顯示框
 clear();
 } else {
 String str = "";
 if (label_input.getText().length() == 3) { //處理(-)問題,我把(-)看成算一個字元,要返回就整體返回
 String str1 = label_input.getText().substring(label_input.getText().length() - 3);
 if (str1.equals("(-)")) {
  str = " ";
 } else {
  str = label_input.getText().substring(0,label_input.getText().length() - 1);
 }
 } else { //長度大於3時正常返回上一級
 str = label_input.getText().substring(0,label_input.getText().length() - 1);
 }
 label_input.setText(str); //設定輸入顯示框為str
 }
 label_hint.setText(" "); //清空提示顯示框
 }
 
 // 清屏
 public void clear() {
 label_hint.setText(" ");
 label_input.setText(" ");
 label_result.setText("0");
 this.result = 0;
 Caculate.this.flag = true; //恢復初始化標記
 Caculate.this.find = true; //恢復初始化標記
 }
 
 public class OperationListener implements ActionListener {
 @Override
 public void actionPerformed(ActionEvent e) {
 String str = e.getActionCommand(); // 返回與此動作相關的命令字串
 if (Caculate.this.flag == false) { //當第一次點選+,-,*,、,%,=時
 if (label_input.getText().contains("(-)")) { //把(-)處理為-,然後在進行資料操作
  label_input.setText(label_input.getText().replaceAll("\\(-\\)","-"));
 }
 
 caculate(Double.parseDouble(label_input.getText())); //計算
 Caculate.this.flag = true; //把flag標記處理點選多次操作運算子和輸入下一個數的情況
 Caculate.this.command = str; //供下一次資料運算操作命令
 } else { //多次點選+,=時
 Caculate.this.command = str;
 if (str == "%" && Caculate.this.find == true) { //處理剛開始輸入顯示框為空時對0取餘的情況
  Caculate.this.find = false; //把find標記
  Caculate.this.command = "=";
 }
 }
 }
 }
 //進行資料運算
 public void caculate(double ans) {
 switch (this.command) {
 case "+": //計算資料的和
 this.result += ans;
 break;
 case "-": //計算資料的差
 this.result -= ans;
 break;
 case "*": //計算資料的乘積
 this.result *= ans;
 break;
 case "÷": //計算資料的商
 if (ans == 0) {
 label_hint.setText("提示:除數不能為0");
 return;
 }
 this.result /= ans;
 break;
 case "%": //計算資料的餘
 double s1 = this.result;
 int d1 = (int) s1;
 double s2 = ans;
 int d2 = (int) s2;
 if (d1 == this.result && d2 == ans && d2 != 0) {
 this.result %= ans;
 } else {
 if (d1 != s1) {
  label_hint.setText("提示:餘數的分子必須為整數");
 }
 else if (d2 != s2) {
  label_hint.setText("提示:餘數的分母必須為整數");
 }
 else if (s2 == 0) {
  label_hint.setText("提示:餘數的分母不能為0");
 }
 }
 break;
 case "=": //計算結果
 this.result = ans;
 break;
 }
 label_result.setText(" " + format(this.result)); //顯示計算結果
 }
 //計算結果格式處理
 public String format(double d) {
 String formatString = "";
 NumberFormat nf = NumberFormat.getInstance(); // 放回當前預設語言環境的通用數字格式
 formatString = nf.format(d); // 格式規範化
 return formatString; //返回格式化後的資料
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。