JavaFX入门01 制作简易计算器

news2024/11/13 19:46:14

目录

  • 利用JavaFX Scene Builder 2.0制作图形界面
  • 将fxml文件导入IDEA中,并添加JavaFX相关依赖
  • 定义启动类,呈现界面
  • 定义控制类,实现具体逻辑
  • 运行代码,进行测试

利用JavaFX Scene Builder 2.0制作图形界面

在这里插入图片描述
制作完成后,将其保存,会自动保存为一个FXML文件

将fxml文件导入IDEA中,并添加JavaFX相关依赖

在这里插入图片描述

在这里插入图片描述
右键fxml右键点击此处,可以自动打开SceneBuilder,对应的更新会自动保存到fxml文件

定义启动类,呈现界面

/**
 * Main 类,继承自 Application,是 JavaFX 应用程序的入口
 */
public class Main extends Application {

    /**
     * 主函数,用于启动 JavaFX 应用程序
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 启动 JavaFX 应用程序,传递命令行参数
        launch(args);
    }

    /**
     * 重写 start 方法,用于设置应用程序的初始界面
     *
     * @param stage 应用程序的主舞台
     * @throws Exception 如果在加载 FXML 文件时发生异常
     */
    @Override
    public void start(Stage stage) throws Exception {
        // 设置舞台的标题
        stage.setTitle("Lgt的简易计算器");
        // 创建一个 FXMLLoader 对象,用于加载 FXML 文件
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("calculator.fxml"));
        // 加载 FXML 文件,并将其转换为 Parent 类型的对象
        Parent root = fxmlLoader.load();
        // 创建一个新的 Scene 对象,并将加载的 FXML 作为其根节点
        Scene scene = new Scene(root);
        // 将 Scene 设置到舞台上
        stage.setScene(scene);
        // 显示舞台
        stage.show();
    }
}

定义控制类,实现具体逻辑

public class Controller {

    @FXML
    private Label result;
    @FXML
    private Label expression;

    private boolean lastIsNum = false;
    private StringBuilder expressionBuilder = new StringBuilder();

    @FXML
    public void onClicked(ActionEvent event) {
        Button button = (Button) event.getTarget();
        String text = button.getText();

        if (isNumeric(text) || text.equals(".")) {
            handleNumericInput(text);
        } else {
            handleOperatorInput(text);
        }
    }

    private void handleNumericInput(String text) {
        String resultText = result.getText();
        if (text.equals(".")) {
            if (resultText.contains(".")) {
                return; // Already contains a decimal point
            }
            if (resultText.isEmpty()) {
                resultText = "0"; // If there's no number before the decimal point
            }
        }

        result.setText(resultText + text);
        lastIsNum = true;
    }

    private void handleOperatorInput(String text) {
        switch (text) {
            case "+":
            case "-":
            case "*":
            case "/":
                expressionBuilder.append(result.getText()).append(" ").append(text);
                expression.setText(expressionBuilder.toString());
                result.setText(""); // Clear the result field
                break;
            case "=":
                expressionBuilder.append(" ").append(result.getText()).append(" = ");
                expression.setText(expressionBuilder.toString());

                double resultVal = calculateValue(expressionBuilder.toString().trim());
                result.setText(String.valueOf(resultVal));
                expressionBuilder.setLength(0); // Clear StringBuilder
                break;
            case "CE":
                result.setText("");
                break;
            case "C":
                result.setText("");
                expression.setText("");
                expressionBuilder.setLength(0);
                break;
            case "<=":
                String currentText = result.getText();
                if (!currentText.isEmpty()) {
                    result.setText(currentText.substring(0, currentText.length() - 1));
                }
                break;
            case "X^2":
                if(result.getText()==null)
                {
                    result.setText("ERROR");
                }
                result.setText(Double.toString(Math.pow(Double.parseDouble(result.getText()), 2)));
                break;
            case "X^0.5":
                if(result.getText()==null)
                {
                    result.setText("ERROR");
                }
                result.setText(Double.toString(Math.pow(Double.parseDouble(result.getText()), 0.5)));
                break;
            case "1/X":
                if(result.getText()==null||Double.parseDouble(result.getText())==0)
                {
                    result.setText("ERROR");
                }
                result.setText(Double.toString(Math.pow(Double.parseDouble(result.getText()), -1)));
                break;
            case "%":
                if(result.getText()==null)
                {
                    result.setText("ERROR");
                }
                result.setText(Double.toString(Double.parseDouble(result.getText())*0.01));
                break;
            case "+/-":
                if(result.getText()==null)
                {
                    result.setText("ERROR");
                }
                String s = result.getText();
                if(s.contains("."))
                {
                    double val = Double.parseDouble(result.getText());
                    val*=-1;
                    result.setText(Double.toString(val));
                }else {
                    int val = Integer.parseInt(result.getText());
                    val *= -1;
                    result.setText(Integer.toString(val));
                }
                break;
            default:
                break;
        }
        lastIsNum = false;
    }

    private double calculateValue(String s) {
        String[] split = s.split(" ");
        BigDecimal a = new BigDecimal(split[0]);
        BigDecimal b = new BigDecimal(split[2]);

        switch (split[1]) {
            case "+":
                return a.add(b).doubleValue();
            case "-":
                return a.subtract(b).doubleValue();
            case "*":
                return a.multiply(b).doubleValue();
            case "/":
                if (b.compareTo(BigDecimal.ZERO) == 0) {
                    return 0; // Handle division by zero
                }
                return a.divide(b, 10, BigDecimal.ROUND_HALF_UP).doubleValue(); // 保留10位小数并四舍五入
            default:
                return 0;
        }
    }

    private boolean isNumeric(String str) {
        return str.matches("-?\\d+(\\.\\d+)?");
    }
}

运行代码,进行测试

在这里插入图片描述
完成!(这只是一个简易的计算器,更加复杂的计算大家可以自行尝试!如有Bug,欢迎指正!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2055576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言之“ 数组 ”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C语言基础 目录 前言 一、数组 二、一维数组 2.1 一维数组的创建和初始化 数组创建 数组初始化 数组类型 2.2 一维数组的使用 数组下标 数组打印 数组输…

Spring由于后端逻辑,前端无法展示数据

1.Spring由于后端逻辑&#xff0c;前端无法展示数据 1.代码详情 后端逻辑&#xff1a;在ctroller层&#xff0c;调用getList方法返回的是List列表 使用枚举类来定义了状态码&#xff1a; 状态码SUCCESS返回result类 前端代码&#xff0c;if条件里面是根据自定义的状态码来进…

RM集团在造船中应用虚拟现实辅助工程技术

船舶内饰中的虚拟现实辅助工程 设计船舶内饰是一项资源密集型任务&#xff0c;全球范围内有数百名工程师参与到大型造船项目中。如今&#xff0c;作为船舶内饰设计领域的专家&#xff0c;R&M集团正在利用虚拟现实辅助工程(VAE)技术&#xff0c;优化开发流程。 从游轮上的餐…

浅谈如何克服编程学习中的挫折感

目录 1.概述 2.心态调整 3.学习方法 3.1. 基础知识的打牢 3.2. 分解问题 3.3. 理论与实践相结合 3.4. 利用在线资源和社区 3.5. 教学 3.6. 定期复习与总结 3.7. 持续学习和适应新技术 3.8. 解决实际问题 4.成功经验 5.总结 1.概述 在编程学习的过程中&#xff0c…

【流媒体】RTMPDump—RTMP_ConnectStream(创建流连接)

目录 1. RTMP_ConnectStream函数1.1 读取packet&#xff08;RTMP_ReadPacket&#xff09;1.2 解析packet&#xff08;RTMP_ClientPacket&#xff09;1.2.1 设置Chunk Size&#xff08;HandleChangeChunkSize&#xff09;1.2.2 用户控制信息&#xff08;HandleCtrl&#xff09;1…

灵创空间:打造健康与创意融合的全新文化体验

近日&#xff0c;备受瞩目的灵创空间品牌正式亮相&#xff0c;致力于为顾客提供健康、舒适且富有文化氛围的环境。灵创空间专注于研发中高端健康饮品&#xff0c;精选国内外优质健康原料&#xff0c;推出符合现代人需求的平价高品质饮品。在满足消费者健康需求的同时&#xff0…

【Word多级标题完整设置】设置各级标题样式将多级列表链接到各级标题样式中

Word多级标题完整设置 一、设置各级标题样式主标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 一级标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 二级标题样式设置中英文字体、字形…

OurTV v3.1.1 — 完全免费,播放流畅的电视直播软件

OurTV是一款专业的魔改大屏版开源电视直播软件&#xff0c;与“我的电视”类似&#xff0c;内含丰富的电视频道&#xff0c;完全免费且无广告&#xff0c;画质清晰&#xff0c;播放流畅&#xff0c;提供良好的观影体验。此外&#xff0c;该软件还提供手机版。 链接&#xff1a…

AM32开源代码之代码分析 - DSHOT/BDSHOT

AM32开源代码之代码分析 - DSHOT/BDSHOT 1. 源由2. 协议设计2.1 位格式2.2 帧结构2.3 CRC计算2.4 帧格式&#xff08;eRPM&#xff09;2.4.1 DSHOT2.4.2 BDSHOT 2.5 EDT编码策略2.5 eRPM传输 3. 框架设计3.1 初始化3.2 动态过程3.2.1 飞控触发3.2.2 定时触发 3.3 协议检测3.3.1…

JS day0820

ok了家人们今天学习Dom对象&#xff0c;和一个综合案例&#xff0c;一起去看看吧。 一.BOM对象 Browser Object Model 浏览器对象模型。 JavaScript 将浏览器的各 个组成部分封装为对象 Window &#xff1a;浏览器窗口对象。 对象表示浏览器中打开的窗口Navigator&#xff1…

(含华为案例) 企业数字化转型规划方案313页PDF限免下载!

一、前言 数字化转型势在必行&#xff0c;这已成为所有企业CIO的共识。但在现实中&#xff0c;很多数字化转型计划还是陷入重重困难&#xff0c;其原因大多在于企业内部对数字化转型的认知还不够透彻。尤其是对于那些业务正处于发展和上升期的公司&#xff0c;各个部门的负责人…

算法学习017 不同的二叉搜索树 c++算法学习 中小学算法思维学习 比赛算法题解 信奥算法解析

目录 C不同的二叉搜索树 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 六、推荐资料 C不同的二叉搜索树 一、题目要求 1、编程实现 给定一个整数n&#xff0c;求以1、2、3、......、n为节点组成的二叉搜索树有多少种…

网络瘫痪幕后黑手:如何应对TCP/IP端口消耗?

TCP/IP 协议是互联网通信的基础&#xff0c;它的稳定性和可靠性使我们使用互联网的十分重要的一点。在网络运行过程中&#xff0c; TCP/IP 的连接问题中&#xff0c; TCP/IP 端口耗尽故障是较为常见的一种。我们要及时有效地排除这些故障来保障网络的正常运行并确保业务顺利开展…

Windows下如何将mmdetection训练好的模型导出为onnx格式?

写在前面 注意:第一部分是踩坑记录,第二部分才是正确的导出步骤!!!! 踩坑方法记录 这一部分的方法看样子好像没啥问题,但是一步步繁琐的操作下来你会发现,你已经入坑了!!! 提醒大家,如果你正在按照这个方法导出模型,劝你尽快放弃,行不通【原因在于后续的pyth…

Linux网络配置的基本原理、常用命令以及实战操作

&#x1f600;前言 本篇博文是关于Linux网络配置的基本原理、常用命令以及实战操作&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您…

elasticsearch pipelineI详解:原理与使用

码到三十五 &#xff1a; 个人主页 在Elasticsearch的数据处理流程中&#xff0c;Pipeline API为数据的预处理和转换提供了强大的工具。随着Elasticsearch 5.x版本之后Ingest Node的引入&#xff0c;Pipeline API的引入为开发者们提供了更多的灵活性和便利性。本文将对Pipeline…

leetcode322. 零钱兑换,完全背包最值问题,附背包问题模板

leetcode322. 零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种…

人机环境系统智能已经超越了传统的空间智能和物理世界的概念

人机环境系统智能已经超越了传统的空间智能和物理世界的概念&#xff0c;进入了更为复杂的层次。在人机环境系统中&#xff0c;智能不仅涉及对物理世界的感知和理解&#xff0c;还包括对人类语言、情感、意图等的理解和生成。人工智能技术的应用&#xff0c;如自然语言处理、机…

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(三)---创建自定义激光雷达Componet组件

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车&#xff0c;并使用通过跨平台的方式进行ROS2和UE5仿真的通讯&#xff0c;达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础&#xff0c;Nav2相关的学习教程可以参考本人的其他博…

Kubernetes的快速安装

一、kubernetes的基本概念 1.kubernetes Kubernetes 是一个开源的开源的分布式编排技术&#xff0c;Kubernetes 致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台&#xff0c;其遵循主从式架构设计、组件可以分为工作节点 (Node) 组件&#xff0c;和控…