欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java gui實(shí)現(xiàn)計(jì)算器小程序

 更新時(shí)間:2021年07月19日 11:26:52   作者:Cyanogen_dom  
這篇文章主要為大家詳細(xì)介紹了java gui實(shí)現(xiàn)計(jì)算器小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java gui實(shí)現(xiàn)計(jì)算器小程序的具體代碼,供大家參考,具體內(nèi)容如下

廢話不多說 , 直接貼代碼 , 有詳細(xì)的注釋 , 我也是剛學(xué)GUI沒多久

這個(gè)是效果圖 :

代碼:

package gui;
 
 
/**
 * 導(dǎo)入所需要的包
 **/
import java.awt.*;      //  這個(gè)是java的gui編程里面一個(gè)很重要的包
import java.awt.event.*;      //  用來(lái)處理事件所需要
import java.util.Stack;        //  棧 , 我用來(lái)處理運(yùn)算的
 
 
public class Calculator extends Frame implements ActionListener{
    /**  
     * 先聲明一個(gè)公共類叫Calculator , 繼承自Frame類 , 實(shí)現(xiàn)ActionListener接口功能  
     **/
    
 
 private static final long serialVersionUID = 1L;  // 這個(gè)是用來(lái)控制版本的序列化  
 int frame_width = 1000,frame_height = 400;  //設(shè)置整個(gè)框架的長(zhǎng)寬 
 Panel panel_textfield,panel_number,panel_op,panel_other;  // 整個(gè)計(jì)算器布局我把它分成兩個(gè)面板 , 一個(gè)是上面的輸入框區(qū) , 一個(gè)是下面的按鈕區(qū) , 然后按鈕區(qū)又分成了左邊和右邊兩個(gè)區(qū) , 所以有三個(gè)panel  
 Button [] number_buttons;  // 聲明數(shù)字按鈕(也就是上面說的左邊區(qū))  
 Button [] op_buttons;      // 聲明操作符按鈕(也就是上面說的右邊區(qū))  
 TextField textfield;        // 輸入框  
 
        public Calculator() {
  super("計(jì)算器");    // 完成實(shí)例域參數(shù)的初始化,調(diào)用構(gòu)造器的語(yǔ)句只能作為另一個(gè)構(gòu)造器(通常指的是子類構(gòu)造器)的第一條語(yǔ)句出現(xiàn)  
  init();       // 自己寫的初始化方法  
  setLayout();   // 設(shè)置布局管理方式 
  setBackground();       // 設(shè)置背景 
  setBounds();         // 設(shè)置位置  
  setFonts();          // 設(shè)置字體 
  addButtons();      // 添加按鈕
  textfield.setEditable(false);    // 設(shè)置輸入框?yàn)椴豢墒謩?dòng)編輯 , 只能通過按鈕輸入  */
  addWindowListener  // 添加一個(gè)窗口監(jiān)聽器,便于按下關(guān)閉按鈕時(shí)能關(guān)閉窗口 , 否則只能在ide里面停止調(diào)試來(lái)關(guān)閉程序
        (
            new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            }
        );
  setVisible(true);   // 設(shè)置框架為可見,不然畫了框你也看不見...一定要放在最后面,放在前面的話,
后面對(duì)窗體有改動(dòng)得縮放拉伸一下窗體進(jìn)行窗體重繪才能出現(xiàn)效果 , 我在這里卡了很久.... 
  
 }
 
        public void init() {      
  panel_textfield = new Panel();         // 實(shí)例化一個(gè)panel 
  panel_number = new Panel();            // 實(shí)例化一個(gè)panel 
  panel_op = new Panel();                // 實(shí)例化一個(gè)panel 
  panel_other = new Panel();             // 實(shí)例化一個(gè)panel  
  textfield = new TextField(frame_width);// 實(shí)例化一個(gè)文本輸入框  
  setResizable(false);                   // 設(shè)置整個(gè)窗體為不可縮放拉伸  
  
  add(panel_textfield);                 // 往窗體中添加輸入框面板 
  add(panel_other);                     // 往窗體中添加按鈕面板  
  
  panel_textfield.add(textfield);       // 在輸入框面板中添加輸入框  
  panel_other.add(panel_number);        // 在下面面板中添加數(shù)字按鈕面板  
  panel_other.add(panel_op);            // 在下面面板中添加操作符按鈕面板  
 }
 

public void setLayout() {
  setLayout(new GridLayout(2,1,4,4));       // 設(shè)置窗體布局方式為網(wǎng)格布局,2*1的網(wǎng)格,網(wǎng)格之間間距為4個(gè)像素  
  panel_textfield.setLayout(null);       // 輸入框面板就一個(gè)組件,所以設(shè)置null  
  panel_other.setLayout(new GridLayout(1,2,4,4));  // 下面面板因?yàn)榉殖勺筮叺臄?shù)字區(qū)和右邊的操作符區(qū),所以設(shè)置1*2的網(wǎng)格布局方式,間距4個(gè)像素  
  panel_number.setLayout(new GridLayout(5,3,4,4));  //  數(shù)字區(qū)布局設(shè)置為5*3的網(wǎng)格布局  
  panel_op.setLayout(new GridLayout(3,1,4,4));  // 操作符區(qū)設(shè)置為3*1的網(wǎng)格布局方式  
 }
 
 
        public void setBackground() {  // 設(shè)置背景,沒什么好說的....
  panel_textfield.setBackground(Color.red);  
  panel_number.setBackground(Color.green);
  panel_op.setBackground(Color.blue);
 }
 
 
        public void setBounds() {   // 設(shè)置組件位置,沒什么好說的.... 
  setBounds(0, 0, frame_width, frame_height);
  textfield.setBounds(0, 0, frame_width, frame_height / 2);
 }
 
 
        public void addButtons() {
  String [] titles1 = {"/", "*", "-",   // 數(shù)字區(qū)按鈕的label值 
       "7", "8", "9",
       "4", "5", "6",
       "1", "2", "3",
       "0", ".", "c"};
  String [] titles2 = {"x", "+", "="};   // 操作符區(qū)按鈕的label值  
  number_buttons = new Button[15];   // 申請(qǐng)15個(gè)按鈕對(duì)象  
  op_buttons = new Button[3];        // 申請(qǐng)3個(gè)按鈕對(duì)象  
  
  for(int i = 0; i < this.number_buttons.length; i++) {
   number_buttons[i] = new Button(titles1[i]);
   panel_number.add(number_buttons[i]);  //  往數(shù)字區(qū)中添加按鈕  
   number_buttons[i].addActionListener(this);  // 按鈕的事件監(jiān)聽器,處理方法為this,也就是下面重載的actionPerformed()方法,這個(gè)方法必須被重載
  }
  
  for(int i = 0; i < this.op_buttons.length; i++) {
   op_buttons[i] = new Button(titles2[i]);   // 往操作符區(qū)中添加按鈕
   panel_op.add(this.op_buttons[i]);
   op_buttons[i].addActionListener(this);   // 按鈕的事件監(jiān)聽器,處理方法為this,也就是下面重載的actionPerformed()方法,這個(gè)方法必須被重載
  }
  
 }
 
 
@Override   // 對(duì)ActionListener接口的此方法進(jìn)行重載 
 public void actionPerformed(ActionEvent e) {
  Button button = (Button) e.getSource();   // 獲得按鈕來(lái)源
 
  /**
   * 如果是數(shù)字鍵和操作符 , 則直接顯示
   **/
  for(int i = 0; i < 14; i++) { 
   if(button == number_buttons[i] || button == op_buttons[1]) {
    textfield.setText(textfield.getText() + button.getLabel());
    return;
   }
  }
  
  /**
   * 如果是c,則清空
   **/
  if(button == number_buttons[14]) {
   textfield.setText("");
   return;
  }
  
  /**
   * 如果是回退按鈕 , 則清除最近的一個(gè)字符
   **/
  if(button == op_buttons[0]) {
   String s = textfield.getText();
   if(s.length() > 0)
    textfield.setText(s.substring(0, s.length() - 1));
   return;
  }
  
  
  /**
   * 如果是=,則計(jì)算結(jié)果
   **/
  if(button == op_buttons[2]) {
   textfield.setText(getResult());
   return;
  }
 }
 
 
 public String getResult() {
  
  /**
   * 計(jì)算結(jié)果
   **/
  String s = textfield.getText();   // 先獲得輸入的字符串
  String num = "";
  Stack<Double> nums = new Stack<Double>();
  Stack<String> ops = new Stack<String>();
  
  /**
   * 利用regex分離操作數(shù)和操作符,然后用棧進(jìn)行結(jié)果的計(jì)算
   **/
  for(int i = 0; i < s.length(); i++) {
   String temp = s.charAt(i) + "";
   if(temp.matches("[0-9]") || temp.matches("[.]")) {
    num += temp;
   }
   else if(temp.matches("[*+]") || temp.matches("[-]") | temp.matches("[/]")) {
    if(!num.equals(""))
     nums.push(Double.parseDouble(num));
    if(ops.isEmpty() || cmpLevel(temp,ops.peek())) {
     ops.push(temp);
    }
    else {
     Double num1 = nums.pop();
     Double num2 = nums.pop();
     String op2 = ops.pop();
     nums.push(compute(num2,num1,op2));
     i--;
    } 
    num = "";
   }
  }
 
  while(!ops.isEmpty()) {
   
   if(!num.equals("")) {
    nums.push(compute(nums.pop(),Double.parseDouble(num),ops.pop()));
    num = "";
   }
   else {
    Double num1 = nums.pop();
    Double num2 = nums.pop();
    nums.push(compute(num2,num1,ops.pop()));
   }
   
  }
  return nums.pop().toString();
 }
 
  /**  
   * 將兩個(gè)操作數(shù)根據(jù)操作符進(jìn)行運(yùn)算 , 返回結(jié)果  
   ** /
    public Double compute(double num1,double num2,String op) {
  if(op.equals("+")) {
   return num1 + num2;
  }
  else if(op.equals("-")) {
   return num1 - num2;
  }
  else if(op.equals("*")) {
   return num1 * num2;
  }
  else
   return num1 / num2;
 }
 
 /**
  *  比較兩個(gè)操作符的優(yōu)先級(jí)  
  **/
 public boolean cmpLevel(String s1,String s2) {
  if(s1.equals("+") || s1.equals("-")) {
   return false;
  }
  else {
   if(s2.equals("+") || s2.equals("-"))
    return true;
   return false;
  }
 }
 
 /**  
  * 設(shè)置每個(gè)組件的字體  
  **/
 public void setFonts() {
  panel_number.setFont(new Font("微軟雅黑",Font.PLAIN,24));
  panel_op.setFont(new Font("微軟雅黑",Font.PLAIN,24));
  panel_other.setFont(new Font("微軟雅黑",Font.PLAIN,24));
  textfield.setFont(new Font("微軟雅黑",Font.PLAIN,48));
 }
 
 /**
  *  main方法  
  **/
 public static void main(String [] args) {
  new Calculator();
 }
 
}

關(guān)于計(jì)算器的精彩文章請(qǐng)查看《計(jì)算器專題》 ,更多精彩等你來(lái)發(fā)現(xiàn)!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java操作gaussDB數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    java操作gaussDB數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    本文主要介紹了java操作gaussDB數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • java實(shí)現(xiàn)驗(yàn)證碼類生成中文驗(yàn)證碼

    java實(shí)現(xiàn)驗(yàn)證碼類生成中文驗(yàn)證碼

    java實(shí)現(xiàn)的漢字輸入驗(yàn)證碼,主要包含兩個(gè)類,一個(gè)是生成驗(yàn)證碼,一個(gè)是判斷驗(yàn)證碼輸入是否正確,實(shí)現(xiàn)原理非常簡(jiǎn)單,將漢字和干擾線生成圖片并將漢字保存到session,前臺(tái)獲取每次生成驗(yàn)證碼圖片并用文本框值和session值比較,功能就怎么簡(jiǎn)單
    2014-01-01
  • 詳解spring cloud構(gòu)建微服務(wù)架構(gòu)的網(wǎng)關(guān)(API GateWay)

    詳解spring cloud構(gòu)建微服務(wù)架構(gòu)的網(wǎng)關(guān)(API GateWay)

    這篇文章主要介紹了詳解spring cloud構(gòu)建微服務(wù)架構(gòu)的網(wǎng)關(guān)(API GateWay),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-01-01
  • SpringBoot+WebSocket向前端推送消息的實(shí)現(xiàn)示例

    SpringBoot+WebSocket向前端推送消息的實(shí)現(xiàn)示例

    WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,允許服務(wù)器主動(dòng)向客戶端推送信息,同時(shí)也能從客戶端接收信息,本文主要介紹了SpringBoot+WebSocket向前端推送消息的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-08-08
  • Java實(shí)現(xiàn)Linux下雙守護(hù)進(jìn)程

    Java實(shí)現(xiàn)Linux下雙守護(hù)進(jìn)程

    這篇文章主要介紹了Java實(shí)現(xiàn)Linux下雙守護(hù)進(jìn)程的思路、原理以及具體實(shí)現(xiàn)方式,非常的詳細(xì),希望對(duì)大家有所幫助
    2014-10-10
  • 設(shè)置JavaScript自動(dòng)提示-Eclipse/MyEclipse

    設(shè)置JavaScript自動(dòng)提示-Eclipse/MyEclipse

    自動(dòng)提示需要2個(gè)組件,分別是:ext-4.0.2a.jsb2||spket-1.6.16.jar,需要的朋友可以參考下
    2016-05-05
  • Spring?Cloud?使用?Resilience4j?實(shí)現(xiàn)服務(wù)熔斷的方法

    Spring?Cloud?使用?Resilience4j?實(shí)現(xiàn)服務(wù)熔斷的方法

    服務(wù)熔斷是為了保護(hù)我們的服務(wù),比如當(dāng)某個(gè)服務(wù)出現(xiàn)問題的時(shí)候,控制打向它的流量,讓它有時(shí)間去恢復(fù),或者限制一段時(shí)間只能有固定數(shù)量的請(qǐng)求打向這個(gè)服務(wù),這篇文章主要介紹了Spring?Cloud?使用?Resilience4j?實(shí)現(xiàn)服務(wù)熔斷,需要的朋友可以參考下
    2022-12-12
  • 使用注解@Validated和BindingResult對(duì)入?yún)⑦M(jìn)行非空校驗(yàn)方式

    使用注解@Validated和BindingResult對(duì)入?yún)⑦M(jìn)行非空校驗(yàn)方式

    這篇文章主要介紹了使用注解@Validated和BindingResult對(duì)入?yún)⑦M(jìn)行非空校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 記一次在idea離線使用maven問題(推薦)

    記一次在idea離線使用maven問題(推薦)

    這篇文章主要介紹了記一次在idea離線使用maven問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java使用EasyExcel實(shí)現(xiàn)對(duì)excel文件的讀寫方式

    Java使用EasyExcel實(shí)現(xiàn)對(duì)excel文件的讀寫方式

    這篇文章主要介紹了Java使用EasyExcel實(shí)現(xiàn)對(duì)excel文件的讀寫方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論