当前位置: 首页 > 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() 方法保存最新的自定义组件。

三、源码:

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

四、小结:


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

http://www.lryc.cn/news/604000.html

相关文章:

  • Java注解全面解析与应用实战
  • 三维扫描相机:工业自动化的智慧之眼——迁移科技赋能智能制造新纪元
  • 前端优化之虚拟列表实现指南:从库集成到手动开发
  • MongoDB系列教程-第一章:MongoDB简介、安装 、概念解析、用户管理、连接、实际应用示例
  • Java抽Oracle数据时编码问题
  • Spring Boot with RabbitMQ:四大核心模式指南
  • TDengine 中 TDgpt 异常检测的数据密度算法
  • TDengine 中 TDgpt 异常检测的机器学习算法
  • 中科米堆CASAIM金属件自动3d测量外观尺寸三维检测解决方案
  • 【数据结构初阶】--二叉树(四)
  • C# _列表(List<T>)_ 字典(Dictionary<TKey, TValue>)
  • uniapp 实现全局变量
  • C++与C#实战:FFmpeg屏幕录制开发指南
  • 高级机器学习
  • RTSP协议详解与C++实现实例
  • Witsbb健敏思携手奥运冠军吴敏霞 共启科学分龄育儿新时代
  • ubuntu22.04 安装 petalinux 2021.1
  • Makefile 快速入门指南
  • 用FunASR轻松实现音频转SRT字幕:完整脚本与解析
  • Jenkins 节点连接故障定位及解决方案总结 - PKIX path validation failed
  • VSCode使用Code Runner运行C/C++输出[Done] exited with code=0 in xxx seconds
  • 第二十五节 MATLAB矩阵的加法和减法、除法(左,右)矩阵
  • Curtain MonGuard 屏幕水印-稳住电子支付企业资料安全线
  • 格雷码的应用场景
  • 【Delphi】快速理解泛型(Generics)
  • 科研小tip3|Windows中的CompressAi下载与使用
  • 【Golang】Go语言指针
  • GO 开发环境安装及配置
  • 【工具】图床完全指南:从选择到搭建的全方位解决方案
  • SBB指令的“生活小剧场“