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('', Font.BOLD, 20)); menu3.setFont(new Font('', Font.BOLD, 20)); frame.setJMenuBar(menubar);// 把菜單添加到菜單條中 label_hint.setText(' '); // 標簽內容初始化為空 label_hint.setHorizontalAlignment(JLabel.RIGHT); // 設置圖標和文本的水平對齊方式為右對齊 label_hint.setFont(new Font('宋體', Font.BOLD, 30));// 設置此標簽的字體。 label_hint.setForeground(Color.RED); // 設置字體顏色為紅色 label_input.setText(' '); // 標簽內容初始化為空 label_input.setHorizontalAlignment(JLabel.RIGHT); // 設置圖標和文本的水平對齊方式為右對齊 label_input.setFont(new Font('宋體', Font.BOLD, 30));// 設置此標簽的字體。 label_input.setForeground(Color.BLACK); // 設置字體顏色為黑色 label_result.setText('0');// 標簽內容初始化內容為0 label_result.setHorizontalAlignment(JLabel.RIGHT); // 設置圖標和文本的水平對齊方式為右對齊 label_result.setFont(new Font('宋體', Font.BOLD, 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, new Color(160, 170, 180), null, SystemColor.scrollbar, null)); // 添加按鈕 for (int i = 0; i < str.length; i++) { button[i] = new JButton(str[i]); button[i].setFont(new Font('宋體', Font.BOLD, 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,←,(-),.,0,1,2,3,4,5,6,7,8,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,1,2,3,4,5,6,7,8,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; //返回格式化后的數據 }}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。
相關文章:
1. 使用Python webdriver圖書館搶座自動預約的正確方法2. SpringBoot整合Redis的步驟3. ASP.NET MVC使用jQuery ui的progressbar實現進度條4. Python3 json模塊之編碼解碼方法講解5. 在線php代碼縮進、代碼美化工具:PHP Formatter6. android H5本地緩存加載優化的實戰7. PHP如何開啟Opcache功能提升程序處理效率8. PHP程序員簡單的開展服務治理架構操作詳解(二)9. 詳解如何使用Net將HTML簡歷導出為PDF格式10.排行榜使用Python webdriver圖書館搶座自動預約的正確方法 1. android H5本地緩存加載優化的實戰 2. ASP.NET MVC使用jQuery ui的progressbar實現進度條 3. 詳解如何使用Net將HTML簡歷導出為PDF格式 4. 5. PHP程序員簡單的開展服務治理架構操作詳解(二) 6. PHP如何開啟Opcache功能提升程序處理效率 7. SpringBoot整合Redis的步驟 8. Python3 json模塊之編碼解碼方法講解 9. IntelliJ IDEA設置自動提示功能快捷鍵的方法 10. 在線php代碼縮進、代碼美化工具:PHP Formatter

網公網安備