java fx 计算器_Java 小练习(1) -- Java FX 编写计算器

本文介绍了使用JavaFX技术编写一个简单计算器的过程,遵循MVC模式。通过FXML文件定义显示层界面,Java代码实现逻辑层。计算器界面包括按钮区和显示区,使用Stack存储数字和操作符,通过事件监听处理数字和运算符的输入,实现加减乘除及清除功能。
摘要由CSDN通过智能技术生成

引言:

最近在学习java ,在学习的过程中想找几个简单的小程序练手。用Java写一个计算器算一个难度非常低的练习,它将我之前学过的 Java 的知识重新地拾起来了。在这个小练习中,我选择了逻辑层和显示层分离(MVC模式)的JavaFX 技术。在javafx 中,用fxml文件来表示显示层内容,用Java 来编写程序的业务逻辑。

文章结构

|-- 显示层设计

|-- 逻辑层设计

|-- 源代码

显示层

显示层的设计中只存在一个简单的界面,界面中包含两部分 -- 按钮区和显示区。具体的界面如图:

5eb5d7f45b906b7e28f23a209e4ba4b4.png

具体的布局为 :

SpiltPane--|--VBox--|--HBox

| |--HBox

| |--HBox

|

|--GridPane

在整个JavaFX程序中,显示层的界面和布局都是由fxml 文件生成的,在idea中可以直接由集成的Java Scene Builder 拖拽和配置相应的参数完成。

逻辑层

在这次的练习中计算器的设计逻辑是这样的:

1. 用一个Stack 去存储输入的数字和操作符,并将输入input1,input2分别用两个StringBuffer类存储,并实时更新到显示区域。

2. 每点击一个数字,都会在显示区域的标签中, 并分别存入输入栈和 输入字符串的StringBuffer中。

3. 用操作符来区分输入的数字是第一个还是第二个。

4. 当点击删除(DEL)时,从栈中将栈顶的元素删除,从输入的StringBuffer类中去掉这个字符。当点击Clear 时,清空输入栈(inputStack)和输入字符串(firstInputStr,secondInputStr)。并将对应的结果实时更新到显示区。

5. 当点击  ' = ' 时,开始进行计算,并把计算的结果反馈到显示区域。每次计算之后,都会对相应的参数进行清空。

源代码文件

GitHub仓库:https://github.com/XDKejin/java_files_of_my_study

1. Calculator.java

package calculator;

import javafx.application.Application;

import javafx.fxml.FXMLLoader;

import javafx.scene.Parent;

import javafx.scene.Scene;

import javafx.stage.Stage;

public class Calculator extends Application {

@Override

public void start(Stage primaryStage) throws Exception{

Parent root = FXMLLoader.load(getClass().getResource("calculator.fxml"));

primaryStage.setTitle("Calculator");

primaryStage.setScene(new Scene(root, 400, 500));

primaryStage.show();

}

public static void main(String[] args) {

launch(args);

}

}

2. CalculatorController.java

package calculator;

import javafx.event.ActionEvent;

import javafx.fxml.FXML;

import javafx.fxml.Initializable;

import javafx.scene.control.Label;

import java.net.URL;

import java.util.ResourceBundle;

import java.util.Stack;

public class CalculatorController implements Initializable{

@FXML private Label firstInput;

@FXML private Label secondInput;

@FXML private Label showResult;

@FXML private Label showOperator;

Stack inputStack ;

StringBuffer firstInputStr;

StringBuffer secondInputStr;

char operator;

boolean isChanged = false;

int result; //store result

@Override

public void initialize(URL location, ResourceBundle resources) {

firstInputStr = new StringBuffer();

secondInputStr = new StringBuffer();

inputStack = new Stack();

}

/*

* number button action code is below here:

* */

@FXML protected void pressNumZero(ActionEvent event){

if (!isChanged)

firstInputStr.append('0');

else

secondInputStr.append('0');

inputStack.push('0');

putStrToLabel();

}

@FXML protected void pressNumOne(ActionEvent event){

if (!isChanged)

firstInputStr.append('1');

else

secondInputStr.append('1');

inputStack.push('1');

putStrToLabel();

}

@FXML protected void pressNumTwo(ActionEvent event){

if (!isChanged)

firstInputStr.append('2');

else

secondInputStr.append('2');

inputStack.push('2');

putStrToLabel();

}

@FXML protected void pressNumThree(ActionEvent event){

if (!isChanged)

firstInputStr.append('3');

else

secondInputStr.append('3');

inputStack.push('3');

putStrToLabel();

}

@FXML protected void pressNumFour(ActionEvent event){

if (!isChanged)

firstInputStr.append('4');

else

secondInputStr.append('4');

inputStack.push('4');

putStrToLabel();

}

@FXML protected void pressNumFive(ActionEvent event){

if (!isChanged)

firstInputStr.append('5');

else

secondInputStr.append('5');

inputStack.push('5');

putStrToLabel();

}

@FXML protected void pressNumSix(ActionEvent event){

if (!isChanged)

firstInputStr.append('6');

else

secondInputStr.append('6');

inputStack.push('6');

putStrToLabel();

}

@FXML protected void pressNumSeven(ActionEvent event){

if (!isChanged)

firstInputStr.append('7');

else

secondInputStr.append('7');

inputStack.push('7');

putStrToLabel();

}

@FXML protected void pressNumEight(ActionEvent event){

if (!isChanged)

firstInputStr.append('8');

else

secondInputStr.append('8');

inputStack.push('8');

putStrToLabel();

}

@FXML protected void pressNumNine(ActionEvent event){

if (!isChanged)

firstInputStr.append('9');

else

secondInputStr.append('9');

inputStack.push('9');

putStrToLabel();

}

/*

* operator button action code is below here;

*

* */

@FXML protected void pressOperatorAdd(ActionEvent event){

operator = '+';

inputStack.push('+');

showOperator.setText("+");

isChanged = true;

}

@FXML protected void pressOperatorMinus(ActionEvent event){

operator = '-';

inputStack.push('-');

showOperator.setText("-");

isChanged = true;

}

@FXML protected void pressOperatorMultiply(ActionEvent event){

operator = '*';

inputStack.push('*');

showOperator.setText("*");

isChanged = true;

}

@FXML protected void pressOperatorDivide(ActionEvent event){

operator = '/';

inputStack.push('/');

showOperator.setText("/");

isChanged = true;

}

@FXML protected void pressOperatorMod(ActionEvent event){

operator = '%';

inputStack.push('%');

showOperator.setText("%");

isChanged = true;

}

/*

* function key action code is below here

* */

@FXML protected void pressFunckeyDel(ActionEvent event){

if (inputStack.empty()){

clearCache();

updateDisplay();

return;

}

if ( (int)(inputStack.peek()) >= (int)('0') && (int)(inputStack.peek()) <= (int)('9')){

if (!isChanged)

firstInputStr.deleteCharAt( firstInputStr.length() - 1 );

else

secondInputStr.deleteCharAt( secondInputStr.length() - 1 );

}else {

showOperator.setText("");

isChanged = false;

}

inputStack.pop();

updateDisplay();

}

@FXML protected void pressFunckeyClear(ActionEvent event){

clearCache();

updateDisplay();

}

/*

* press '=' button get RESULT

* */

@FXML protected void getResult(ActionEvent event){

int first = Integer.parseInt(firstInputStr.toString());

int second = Integer.parseInt(secondInputStr.toString());

switch (operator){

case '+' :

result = first + second;

break;

case '-' :

result = first - second;

break;

case '*' :

result = first * second;

break;

case '/' :

if (0 == second)

break;

result = first / second;

break;

case '%' :

result = first % second;

break;

}

showResult.setText(result+"");

//清空各种参数的缓存

clearCache();

}

/*

* extra method

*

* */

void putStrToLabel(){

firstInput.setText(firstInputStr.toString());

secondInput.setText(secondInputStr.toString());

}

void updateDisplay(){

if (inputStack.empty()){

setDisplayNull();

return;

}

firstInput.setText(firstInputStr.toString());

secondInput.setText(secondInputStr.toString());

showOperator.setText(operator+"");

if ( 0 == result )

showResult.setText("");

else

showResult.setText(result+"");

}

void clearCache(){

isChanged = false;

firstInputStr.delete( 0,(firstInputStr.length()) );

secondInputStr.delete( 0, (secondInputStr.length()));

result = 0;

while(!inputStack.empty()){

inputStack.pop();

System.out.println(inputStack.toString());

}

}

void setDisplayNull(){

firstInput.setText("");

secondInput.setText("");

showOperator.setText("");

showResult.setText("");

}

}

3. calculator.fxml

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值