当前位置: 首页 > 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.xdnf.cn/news/1208755.html

相关文章:

  • MySQL数据库 mysql常用命令
  • 再谈亚马逊云科技(AWS)上海AI研究院7月22日关闭事件
  • 实现视频实时马赛克
  • P1098 [NOIP 2007 提高组] 字符串的展开
  • python案例:基于python 神经网络cnn和LDA主题分析的旅游景点满意度分析
  • 小程序中事件对象的属性与方法
  • 微算法科技(NASDAQ:MLGO)应用区块链联邦学习(BlockFL)架构,实现数据的安全传输
  • Django自带的加密算法
  • 3D游戏引擎的“眼睛“:相机系统深度揭秘与技术实现
  • 14、distance_object_model_3d算子
  • 如何用命令行快速提取PPT中的所有图片?
  • 线程崩溃是否导致进程崩溃
  • 【嵌入式电机控制#18】有刷直流串级控制
  • MySQL图解索引篇
  • 大模型技术对部分岗位的影响
  • Apache Ignite 的分布式原子类型(Atomic Types)
  • 在CSS中,如果你想设置一个元素的高度(height)与其宽度(width)相匹配,但又希望宽度使用百分比来定义,你可以通过几种方式来实现。
  • 试用SAP BTP 02C:试用SAP HANA Schemas HDI Containers
  • VSCode使用Code Runner运行C/C++输出[Done] exited with code=0 in xxx seconds
  • SpringBoot整合RocketMQ(rocketmq-client.jar)
  • C++ AI流处理核心算法实战
  • MOGA(多目标遗传算法)求解 ZDT1 双目标优化问题
  • 沪铝本周想法
  • 智能编队重构职场生态:Agentic AI 协同时代来临
  • 基于Blazor进销存管理系统
  • 对College数据进行多模型预测(R语言)
  • thingsboard 自定义动作JS编程
  • 【高阶版】R语言空间分析、模拟预测与可视化高级应用
  • 【C++算法】82.BFS解决FloodFill算法_被围绕的区域
  • Java抽Oracle数据时编码问题