当前位置: 首页 > news >正文

计算器4.0:新增页签功能梳理页面,通过IO流实现在用户本地存储数据

前言:

在 计算器3.0:实现用户自定义组件-CSDN博客中,马总给我提出的一些改进措施与问题:页面上的内容重新梳理一下,分分类,用页签的方式呈现不同的分类。另外,你新加的组件是保存到本地电脑了吗?   下次打开是否还会显示用户新增加的组件?

一、引入JTabbedPane来创建两个垂直排列的页签,一个用于计算器面板,另一个用于版本信息。

1、引入 JTabbedPane:在 calculator4类中添加了一个 JTabbedPane 成员变量 tabbedPane,并将其设置为垂直排列的页签。

      public calculator4() {// 创建页签面板tabbedPane = new JTabbedPane(JTabbedPane.LEFT);// 添加计算器面板页签tabbedPane.addTab("计算器面板", createCalculatorPanel());// 添加版本信息页签tabbedPane.addTab("版本信息", createVersionInfoPanel());// 将页签面板添加到窗口add(tabbedPane);
}


2.创建计算器面板:createCalculatorPanel 方法用于创建计算器面板,将原来的topPanel顶部面板、带有滚动条scrollPane的mainPane主面板以及带有buttonPanel组件面板、带滚动条scorllPanel2的newComponesPane新增组件面板和newInputPanel新增组件面板的jp_below底部面板等组件添加到该页签中。

 private JPanel createCalculatorPanel() {JPanel calculatorPanel = new JPanel(new BorderLayout());// 创建顶部面板(BorderLayout布局,用于放置版本信息和提示文字)JPanel topPanel = new JPanel(new BorderLayout());// 创建版本信息面板(FlowLayout左对齐,放置版本标签和切换按钮)JPanel versionPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));// 初始化版本标签为"版本: 3.0"versionLabel = new JLabel("版本: 4.0");// 将版本标签添加到版本面板versionPanel.add(versionLabel);// 创建提示标签:显示表达式构建提示文字,居中对齐JLabel hintLabel = new JLabel("点击下方按钮构建表达式:[数字][+][数字][*][数字]... =", SwingConstants.CENTER);// 设置提示文字字体为宋体、常规、16号hintLabel.setFont(new Font("宋体", Font.PLAIN, 16));// 将提示标签添加到顶部面板的中间(Center区域)topPanel.add(hintLabel, BorderLayout.CENTER);// 将顶部面板添加到计算器面板的北部(North区域)calculatorPanel.add(topPanel, BorderLayout.NORTH);// 将滚动面板(包含主面板)添加到计算器面板的中间(Center区域)JScrollPane scrollPane = new JScrollPane(mainPanel);scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);calculatorPanel.add(scrollPane, BorderLayout.CENTER);// 将底部面板添加到计算器面板的南部(South区域)calculatorPanel.add(jp_below, BorderLayout.SOUTH);return calculatorPanel;}


3.版本信息面板:createVersionInfoPanel 方法用于创建版本信息面板,将buttonPanel4个版本按钮面板和一个用于显示版本信息的versionInfoLabel标签添加到该页签中。

  /*** 创建版本信息面板*/private JPanel createVersionInfoPanel() {JPanel versionInfoPanel = new JPanel(new BorderLayout());//按钮面板标签JLabel buttonLable = new JLabel("版本按钮:");// 创建版本按钮面板JPanel buttonPanel = new JPanel(new FlowLayout());buttonPanel.add(buttonLable);// 创建版本1.0切换按钮JButton version1Button = new JButton("1.0");// 创建版本2.0切换按钮JButton version2Button = new JButton("2.0");// 创建版本3.0切换按钮JButton version3Button = new JButton("3.0");JButton version4Button = new JButton("4.0");// 版本信息显示标签versionInfoLabel = new JLabel("点击版本按钮,显示版本信息");// 给版本1按钮绑定点击事件:显示1.0版本信息version1Button.addActionListener(e -> showVersionInfo(1));// 给版本2按钮绑定点击事件:显示2.0版本信息version2Button.addActionListener(e -> showVersionInfo(2));// 给版本3按钮绑定点击事件:显示3.0版本信息version3Button.addActionListener(e -> showVersionInfo(3));version4Button.addActionListener(e -> showVersionInfo(4));// 将版本按钮添加到按钮面板buttonPanel.add(version4Button);buttonPanel.add(version3Button);buttonPanel.add(version2Button);buttonPanel.add(version1Button);// 将按钮面板添加到版本信息面板的北部(North区域)versionInfoPanel.add(buttonPanel, BorderLayout.NORTH);// 将版本信息显示标签添加到版本信息面板的中间(Center区域)versionInfoPanel.add(versionInfoLabel, BorderLayout.CENTER);return versionInfoPanel;}


二、用io流的方法解决用户保存新增组件到本地的问题:

1.添加文件路径常量:定义了一个常量 COMPONENT_FILE,用于指定保存自定义组件的文件路径。

private static final String COMPONENT_FILE = "custom_components.dat";


2.加载保存的自定义组件:在构造方法中调用 loadCustomComponents() 方法,用于在程序启动时加载之前保存的自定义组件。

// 新增:加载保存的自定义组件
loadCustomComponents();


3.添加窗口关闭事件监听器:在 initComponents() 方法中添加窗口关闭事件监听器,当窗口关闭时调用 saveCustomComponents() 方法保存自定义组件。

// 新增:添加窗口关闭事件监听器,用于保存自定义组件
addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {saveCustomComponents();}
});

4.保存自定义组件:定义了 saveCustomComponents() 方法,用于将自定义组件的文本内容保存到文件中。


/*** 新增:保存自定义组件到文件*/
private void saveCustomComponents() {try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(COMPONENT_FILE))) {List<String> componentTexts = new ArrayList<>();for (Component component : newComponentsPanel.getComponents()) {if (component instanceof JButton) {componentTexts.add(((JButton) component).getText());}}oos.writeObject(componentTexts);} catch (IOException e) {e.printStackTrace();}
}


5.加载自定义组件:定义了 loadCustomComponents() 方法,用于从文件中加载之前保存的自定义组件。

/*** 新增:从文件加载自定义组件*/
private void loadCustomComponents() {try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(COMPONENT_FILE))) {List<String> componentTexts = (List<String>) ois.readObject();for (String text : componentTexts) {JButton newButton = new JButton(text);newButton.addActionListener(e -> handleOperatorClick(text));setupButtonContextMenu(newButton);newComponentsPanel.add(newButton);}newComponentsPanel.revalidate();newComponentsPanel.repaint();} catch (IOException | ClassNotFoundException e) {// 文件不存在或读取失败,忽略}
}

6.在添加和删除组件时保存:
在 handleAddComponent() 和 setupButtonContextMenu() 方法中,当添加或删除自定义组件时,调用 saveCustomComponents() 方法保存最新的自定义组件。

三、小结:


通过使用JTabbedPane页签功能,使得页面逻辑更加清晰直观方便用户使用,在整理页面的同时,也让自己对 “组件层级设计” 有了更清晰的认知,使得自己对页面的理解更加深刻。采用 IO 流中的对象流,解决了 “用户新增组件重启后丢失” 的问题。通过定义存储路径、绑定窗口关闭事件、处理异常场景,确保数据在本地稳定读写,这一机制确保用户下次打开程序时,新增组件仍可正常显示,解决了此前数据丢失的问题。填补了此前对 “程序状态保存” 的知识空白。

http://www.dtcms.com/a/304476.html

相关文章:

  • 点控云数据洞察智能体:让房地产决策有据可循,让业务增长稳健前行
  • 【LLM】——qwen2.5 VL模型导出到onnx
  • Python中二进制文件操作
  • 快速了解逻辑回归
  • 【华为机试】43. 字符串相乘
  • 【LeetCode 随笔】
  • 【深度学习】独热编码(One-Hot Encoding)
  • 开源 Arkts 鸿蒙应用 开发(十一)证书和包名修改
  • C语言在键盘上输入一个3行3列矩阵的各个元素的值(值为整数),然后输出主对角线元素的积,并在fun()函数中输出。
  • 信号上升时间与带宽的关系
  • Leetcode-3361两个字符串的切换距离
  • FastAPI入门:请求体的字段、嵌套模型、额外数据、额外数据类型
  • Linux系统部署k8s集群
  • 在 Web3 时代通过自我主权合规重塑 KYC/AML
  • Git快速入门,完整的git项目管理工具教程,git入门到精通!
  • 青少年软件编程图形化Scratch等级考试试卷(二级)2025年6月
  • 【EDA】Calma--早期版图绘制工具商
  • python案例:基于python 神经网络cnn和LDA主题分析的旅游景点满意度分析
  • 解决mac下git pull、push需要输入密码
  • 半导体企业选用的跨网文件交换系统到底应该具备什么功能?
  • 【007TG洞察】美欧贸易新政下跨境业务的技术破局:从数据治理到智能触达的全链路重构
  • SpringBoot整合RocketMQ(rocketmq-client.jar)
  • 小程序中事件对象的属性与方法
  • IT实施方案书
  • 【dropdown组件填坑指南】—怎么实现三角箭头效果
  • 网络安全第15集
  • 河南地区危化品安全员考试题库及答案
  • 【参考】Re
  • MYSQL难面试
  • 汇总数据(使用聚集函数)