java實(shí)現(xiàn)簡(jiǎn)易版圖形界面計(jì)算器
經(jīng)過(guò)一個(gè)月的Java學(xué)習(xí),聽(tīng)說(shuō)Java中的第一個(gè)小型程序好多都做的是計(jì)算器,今天我也來(lái)做做吧,把這一個(gè)月學(xué)習(xí)的知識(shí)簡(jiǎn)單的綜合一下,熟練近期學(xué)習(xí)的知識(shí)點(diǎn)。
我做的計(jì)算器如下圖:
功能:對(duì)實(shí)數(shù)進(jìn)行加、減、乘、除、余操作。
界面設(shè)置:首先設(shè)置一個(gè)窗體,一個(gè)菜單條,三個(gè)菜單項(xiàng)(無(wú)功能),三個(gè)標(biāo)簽(作為顯示數(shù)據(jù)的地方,第一個(gè)標(biāo)簽作為提示作用,第二個(gè)標(biāo)簽作為輸入數(shù)據(jù)作用,第三個(gè)標(biāo)簽顯示結(jié)果作用),20個(gè)按鈕(循環(huán)進(jìn)行添加),兩個(gè)面板(把三個(gè)標(biāo)簽添加到第一個(gè)面板里,把20個(gè)按鈕添加到第二個(gè)面板里,用網(wǎng)格布局,這樣做不易位置錯(cuò)亂),再把兩個(gè)面板添加到窗體中就OK了。
下面是完整代碼,在一個(gè)類(lèi)中,注釋非常詳細(xì)。
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 { // 對(duì)計(jì)算器整體框架的建立 private JFrame frame = new JFrame('&斌的圖形界面計(jì)算器&');// 創(chuàng)建窗體對(duì)象 private JMenuBar menubar = new JMenuBar(); // 創(chuàng)建菜單條對(duì)象 private JMenu menu1 = new JMenu('查看'); // 創(chuàng)建菜單對(duì)象1 private JMenu menu2 = new JMenu('編輯'); // 創(chuàng)建菜單對(duì)象2 private JMenu menu3 = new JMenu('幫助'); // 創(chuàng)建菜單對(duì)象3 private JLabel label_hint = new JLabel(); // 創(chuàng)建提示信息標(biāo)簽 private JLabel label_input = new JLabel(); // 創(chuàng)建輸入信息標(biāo)簽 private JLabel label_result = new JLabel(); // 創(chuàng)建輸出結(jié)果標(biāo)簽3 private JPanel panel_show = new JPanel(); // 創(chuàng)建顯示面板 private JPanel panel_operation = new JPanel(); // 創(chuàng)建按鍵面板 private String[] str = { 'AC', '←', '(-)', '+', '7', '8', '9', '-', '4', '5', '6', '*', '1', '2', '3', '÷', '%', '0', '.', '=' }; // 計(jì)算器的按鍵從上到下、從左到右順序表示 private JButton[] button = new JButton[str.length]; // 創(chuàng)建計(jì)算器的按鍵對(duì)象 private double result = 0; // 存儲(chǔ)計(jì)算結(jié)果 private boolean flag = true; // private boolean find = true; private String command = '='; public static void main(String[] args) {// 主方法 new Caculate().initJFrame(); } // 對(duì)界面進(jìn)行初始化 public void initJFrame() { Container con = frame.getContentPane(); con.setBackground(Color.green); // 設(shè)置顏色 // 設(shè)置窗體位置及大小(下面一段代碼實(shí)現(xiàn)居中) frame.setSize(600, 550); //方法一// Toolkit toolKit = Toolkit.getDefaultToolkit(); // 獲取默認(rèn)工具包// Dimension dimension = toolKit.getScreenSize(); // 獲取屏幕對(duì)象// 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); // 設(shè)置窗體居中 //方法二 frame.setLocationRelativeTo(null);//設(shè)置窗口相對(duì)于指定組件的位置。如果組件當(dāng)前未顯示,或者 c 為 null,則此窗口將置于屏幕的中央。 menubar.add(menu1);// 把菜單添加到菜單條中 menubar.add(menu2); menubar.add(menu3); menu1.setFont(new Font('', Font.BOLD, 20));// 設(shè)置菜單字體樣式 menu2.setFont(new Font('', Font.BOLD, 20)); menu3.setFont(new Font('', Font.BOLD, 20)); frame.setJMenuBar(menubar);// 把菜單添加到菜單條中 label_hint.setText(' '); // 標(biāo)簽內(nèi)容初始化為空 label_hint.setHorizontalAlignment(JLabel.RIGHT); // 設(shè)置圖標(biāo)和文本的水平對(duì)齊方式為右對(duì)齊 label_hint.setFont(new Font('宋體', Font.BOLD, 30));// 設(shè)置此標(biāo)簽的字體。 label_hint.setForeground(Color.RED); // 設(shè)置字體顏色為紅色 label_input.setText(' '); // 標(biāo)簽內(nèi)容初始化為空 label_input.setHorizontalAlignment(JLabel.RIGHT); // 設(shè)置圖標(biāo)和文本的水平對(duì)齊方式為右對(duì)齊 label_input.setFont(new Font('宋體', Font.BOLD, 30));// 設(shè)置此標(biāo)簽的字體。 label_input.setForeground(Color.BLACK); // 設(shè)置字體顏色為黑色 label_result.setText('0');// 標(biāo)簽內(nèi)容初始化內(nèi)容為0 label_result.setHorizontalAlignment(JLabel.RIGHT); // 設(shè)置圖標(biāo)和文本的水平對(duì)齊方式為右對(duì)齊 label_result.setFont(new Font('宋體', Font.BOLD, 35));// 設(shè)置此標(biāo)簽的字體。 label_result.setForeground(Color.BLUE); // 設(shè)置字體顏色為藍(lán)色 panel_show.setLayout(new BorderLayout()); // 設(shè)置為邊界布局 panel_show.add(label_hint, BorderLayout.NORTH); // 把錯(cuò)誤提示標(biāo)簽放在上面 panel_show.add(label_input, BorderLayout.CENTER);// 把輸入信息標(biāo)簽放在中間 panel_show.add(label_result, BorderLayout.SOUTH);// 把輸出結(jié)果標(biāo)簽放在下面 // 創(chuàng)建具有指定類(lèi)型、高亮顯示和陰影顏色的斜面邊框。 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));// 按鍵設(shè)置為網(wǎng)格布局5行5列間距為8 // 創(chuàng)建具有指定類(lèi)型、高亮顯示和陰影顏色的斜面邊框。凸出斜面類(lèi)型。為滾動(dòng)條提供的背景色。 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)); // 設(shè)置按鈕中字體樣式 if (str[i].equals('+') || str[i].equals('-') || str[i].equals('*') || str[i].equals('÷') || str[i].equals('%') || str[i].equals('=')) { button[i].addActionListener(new OperationListener());// 給按鈕+,-,*,/,%,=注冊(cè)監(jiān)聽(tīng)器 } else { button[i].addActionListener(new DataListener());//給按鈕AC,←,(-),.,0,1,2,3,4,5,6,7,8,9注冊(cè)監(jiān)聽(tīng)器 } panel_operation.add(button[i]);// 把每個(gè)按鈕分別添加到面板上 } // 把面板添加到窗體框架里 frame.add(panel_operation, BorderLayout.CENTER); frame.add(panel_show, BorderLayout.NORTH); //frame.setResizable(false); // 設(shè)置窗體不能改變大小 frame.setVisible(true); // 設(shè)置窗體可見(jiàn) frame.setDefaultCloseOperation(frame.DISPOSE_ON_CLOSE);// 釋放窗口 } public class DataListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String str = e.getActionCommand();//返回與此動(dòng)作相關(guān)的命令字符串。 if (Caculate.this.flag == true) {//當(dāng)想輸入新的數(shù)字時(shí),清空輸入顯示標(biāo)簽 label_input.setText(' '); Caculate.this.flag = false; } if (str.equals('(-)')) {//當(dāng)點(diǎn)擊(-)時(shí) if (label_input.getText().indexOf('(-)') == -1) {//如果此時(shí)顯示框里還沒(méi)出現(xiàn)(-)時(shí) label_input.setText(str); } } if (!str.equals('(-)')) {//當(dāng)命令不是(-)時(shí) if (str.equals('AC')) { //點(diǎn)擊清零鍵時(shí) clear(); } else if (str.equals('←')) { //點(diǎn)擊返回鍵時(shí) getBack(); } else if (str.equals('.')) { // 點(diǎn)擊小數(shù)點(diǎn)時(shí),小數(shù)點(diǎn)只能出現(xiàn)一次,不能在首位 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('小數(shù)點(diǎn)不合法,請(qǐng)重新輸入'); } } else { //點(diǎn)擊0,1,2,3,4,5,6,7,8,9時(shí)顯示原數(shù) label_input.setText(label_input.getText() + str); } } } } // 返回上一級(jí) public void getBack() { if (label_input.getText().length() <= 1) { //長(zhǎng)度小于等于1時(shí)清空顯示框 clear(); } else { String str = ''; if (label_input.getText().length() == 3) { //處理(-)問(wèn)題,我把(-)看成算一個(gè)字符,要返回就整體返回 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 { //長(zhǎng)度大于3時(shí)正常返回上一級(jí) str = label_input.getText().substring(0, label_input.getText().length() - 1); } label_input.setText(str); //設(shè)置輸入顯示框?yàn)閟tr } label_hint.setText(' '); //清空提示顯示框 } // 清屏 public void clear() { label_hint.setText(' '); label_input.setText(' '); label_result.setText('0'); this.result = 0; Caculate.this.flag = true; //恢復(fù)初始化標(biāo)記 Caculate.this.find = true; //恢復(fù)初始化標(biāo)記 } public class OperationListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String str = e.getActionCommand(); // 返回與此動(dòng)作相關(guān)的命令字符串 if (Caculate.this.flag == false) { //當(dāng)?shù)谝淮吸c(diǎn)擊+,-,*,、,%,=時(shí) if (label_input.getText().contains('(-)')) { //把(-)處理為-,然后在進(jìn)行數(shù)據(jù)操作 label_input.setText(label_input.getText().replaceAll('(-)', '-')); } caculate(Double.parseDouble(label_input.getText())); //計(jì)算 Caculate.this.flag = true; //把flag標(biāo)記處理點(diǎn)擊多次操作運(yùn)算符和輸入下一個(gè)數(shù)的情況 Caculate.this.command = str; //供下一次數(shù)據(jù)運(yùn)算操作命令 } else { //多次點(diǎn)擊+,-,*,/,%,=時(shí) Caculate.this.command = str; if (str == '%' && Caculate.this.find == true) { //處理剛開(kāi)始輸入顯示框?yàn)榭諘r(shí)對(duì)0取余的情況 Caculate.this.find = false; //把find標(biāo)記 Caculate.this.command = '='; } } } } //進(jìn)行數(shù)據(jù)運(yùn)算 public void caculate(double ans) { switch (this.command) { case '+': //計(jì)算數(shù)據(jù)的和 this.result += ans; break; case '-': //計(jì)算數(shù)據(jù)的差 this.result -= ans; break; case '*': //計(jì)算數(shù)據(jù)的乘積 this.result *= ans; break; case '÷': //計(jì)算數(shù)據(jù)的商 if (ans == 0) { label_hint.setText('提示:除數(shù)不能為0'); return; } this.result /= ans; break; case '%': //計(jì)算數(shù)據(jù)的余 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('提示:余數(shù)的分子必須為整數(shù)'); } else if (d2 != s2) { label_hint.setText('提示:余數(shù)的分母必須為整數(shù)'); } else if (s2 == 0) { label_hint.setText('提示:余數(shù)的分母不能為0'); } } break; case '=': //計(jì)算結(jié)果 this.result = ans; break; } label_result.setText(' ' + format(this.result)); //顯示計(jì)算結(jié)果 } //計(jì)算結(jié)果格式處理 public String format(double d) { String formatString = ''; NumberFormat nf = NumberFormat.getInstance(); // 放回當(dāng)前默認(rèn)語(yǔ)言環(huán)境的通用數(shù)字格式 formatString = nf.format(d); // 格式規(guī)范化 return formatString; //返回格式化后的數(shù)據(jù) }}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
