java gui實現(xiàn)計算器小程序
本文實例為大家分享了java gui實現(xiàn)計算器小程序的具體代碼,供大家參考,具體內(nèi)容如下
廢話不多說 , 直接貼代碼 , 有詳細的注釋 , 我也是剛學(xué)GUI沒多久
這個是效果圖 :

代碼:
package gui;
/**
* 導(dǎo)入所需要的包
**/
import java.awt.*; // 這個是java的gui編程里面一個很重要的包
import java.awt.event.*; // 用來處理事件所需要
import java.util.Stack; // 棧 , 我用來處理運算的
public class Calculator extends Frame implements ActionListener{
/**
* 先聲明一個公共類叫Calculator , 繼承自Frame類 , 實現(xiàn)ActionListener接口功能
**/
private static final long serialVersionUID = 1L; // 這個是用來控制版本的序列化
int frame_width = 1000,frame_height = 400; //設(shè)置整個框架的長寬
Panel panel_textfield,panel_number,panel_op,panel_other; // 整個計算器布局我把它分成兩個面板 , 一個是上面的輸入框區(qū) , 一個是下面的按鈕區(qū) , 然后按鈕區(qū)又分成了左邊和右邊兩個區(qū) , 所以有三個panel
Button [] number_buttons; // 聲明數(shù)字按鈕(也就是上面說的左邊區(qū))
Button [] op_buttons; // 聲明操作符按鈕(也就是上面說的右邊區(qū))
TextField textfield; // 輸入框
public Calculator() {
super("計算器"); // 完成實例域參數(shù)的初始化,調(diào)用構(gòu)造器的語句只能作為另一個構(gòu)造器(通常指的是子類構(gòu)造器)的第一條語句出現(xiàn)
init(); // 自己寫的初始化方法
setLayout(); // 設(shè)置布局管理方式
setBackground(); // 設(shè)置背景
setBounds(); // 設(shè)置位置
setFonts(); // 設(shè)置字體
addButtons(); // 添加按鈕
textfield.setEditable(false); // 設(shè)置輸入框為不可手動編輯 , 只能通過按鈕輸入 */
addWindowListener // 添加一個窗口監(jiān)聽器,便于按下關(guān)閉按鈕時能關(guān)閉窗口 , 否則只能在ide里面停止調(diào)試來關(guān)閉程序
(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
setVisible(true); // 設(shè)置框架為可見,不然畫了框你也看不見...一定要放在最后面,放在前面的話,
后面對窗體有改動得縮放拉伸一下窗體進行窗體重繪才能出現(xiàn)效果 , 我在這里卡了很久....
}
public void init() {
panel_textfield = new Panel(); // 實例化一個panel
panel_number = new Panel(); // 實例化一個panel
panel_op = new Panel(); // 實例化一個panel
panel_other = new Panel(); // 實例化一個panel
textfield = new TextField(frame_width);// 實例化一個文本輸入框
setResizable(false); // 設(shè)置整個窗體為不可縮放拉伸
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個像素
panel_textfield.setLayout(null); // 輸入框面板就一個組件,所以設(shè)置null
panel_other.setLayout(new GridLayout(1,2,4,4)); // 下面面板因為分成左邊的數(shù)字區(qū)和右邊的操作符區(qū),所以設(shè)置1*2的網(wǎng)格布局方式,間距4個像素
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]; // 申請15個按鈕對象
op_buttons = new Button[3]; // 申請3個按鈕對象
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()方法,這個方法必須被重載
}
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()方法,這個方法必須被重載
}
}
@Override // 對ActionListener接口的此方法進行重載
public void actionPerformed(ActionEvent e) {
Button button = (Button) e.getSource(); // 獲得按鈕來源
/**
* 如果是數(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;
}
/**
* 如果是回退按鈕 , 則清除最近的一個字符
**/
if(button == op_buttons[0]) {
String s = textfield.getText();
if(s.length() > 0)
textfield.setText(s.substring(0, s.length() - 1));
return;
}
/**
* 如果是=,則計算結(jié)果
**/
if(button == op_buttons[2]) {
textfield.setText(getResult());
return;
}
}
public String getResult() {
/**
* 計算結(jié)果
**/
String s = textfield.getText(); // 先獲得輸入的字符串
String num = "";
Stack<Double> nums = new Stack<Double>();
Stack<String> ops = new Stack<String>();
/**
* 利用regex分離操作數(shù)和操作符,然后用棧進行結(jié)果的計算
**/
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();
}
/**
* 將兩個操作數(shù)根據(jù)操作符進行運算 , 返回結(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;
}
/**
* 比較兩個操作符的優(yōu)先級
**/
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è)置每個組件的字體
**/
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)于計算器的精彩文章請查看《計算器專題》 ,更多精彩等你來發(fā)現(xiàn)!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java操作gaussDB數(shù)據(jù)庫的實現(xiàn)示例
本文主要介紹了java操作gaussDB數(shù)據(jù)庫的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
詳解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),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
SpringBoot+WebSocket向前端推送消息的實現(xiàn)示例
WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議,允許服務(wù)器主動向客戶端推送信息,同時也能從客戶端接收信息,本文主要介紹了SpringBoot+WebSocket向前端推送消息的實現(xiàn)示例,感興趣的可以了解一下2024-08-08
設(shè)置JavaScript自動提示-Eclipse/MyEclipse
自動提示需要2個組件,分別是:ext-4.0.2a.jsb2||spket-1.6.16.jar,需要的朋友可以參考下2016-05-05
Spring?Cloud?使用?Resilience4j?實現(xiàn)服務(wù)熔斷的方法
服務(wù)熔斷是為了保護我們的服務(wù),比如當(dāng)某個服務(wù)出現(xiàn)問題的時候,控制打向它的流量,讓它有時間去恢復(fù),或者限制一段時間只能有固定數(shù)量的請求打向這個服務(wù),這篇文章主要介紹了Spring?Cloud?使用?Resilience4j?實現(xiàn)服務(wù)熔斷,需要的朋友可以參考下2022-12-12
使用注解@Validated和BindingResult對入?yún)⑦M行非空校驗方式
這篇文章主要介紹了使用注解@Validated和BindingResult對入?yún)⑦M行非空校驗方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java使用EasyExcel實現(xiàn)對excel文件的讀寫方式
這篇文章主要介紹了Java使用EasyExcel實現(xiàn)對excel文件的讀寫方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05

