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

图形重绘与数组学习小结

在开发画图工具的过程中,我遇到了一个问题:为什么画好的图形在窗口最小化或被遮挡后就会消失?我利用“数组”和“重绘机制”解决了这个问题。

  1. 问题的根源:
    最初,我的绘图逻辑非常直接:在鼠标事件(如 mouseReleased)中,直接通过 Graphics 对象调用 drawLine 或 drawRect 方法。
    然而,我很快发现,一旦窗口需要刷新(例如被其他窗口遮挡后重新显示,或最小化后还原),所有绘制的内容都会消失。这是因为:
    绘图上下文是临时的:Graphics 对象就像一块画布,我们直接在上面画画。但操作系统或窗口管理器在需要时(如窗口刷新),会清空这块画布并调用组件的 paint() 方法,要求组件“重绘”自己。
    缺乏数据记忆:我的程序只记录了“画”这个动作,但没有记录“画了什么”。当 paint() 方法被系统自动调用时,它不知道之前画过哪些图形,因此只能呈现一个空白的面板。
  2. 解决方案:数据与视图分离
    为了解决这个问题,我采用了“数据与视图分离”的思想。核心思路是:不再直接“画”图,而是“记录”图形数据,然后让程序根据数据自动“重绘”。
    这个方案主要包含三个步骤:
    (1)创建数据模型 (Shapes 类)
    我创建了一个 Shapes 类,它不再负责绘制,而是作为一个纯粹的数据容器。它包含了描述一个图形所需的所有属性,例如:
    name: 图形的类型,如“直线”、“矩形”。
    x1, y1, x2, y2…: 图形的顶点坐标。
    这个类就像一张“图纸”,只记录图形的规格,不负责施工。
    (2)使用数组 (shapeArr)
    在事件监听器 DrawListener 中,我定义了一个 Shapes 类型的数组 shapeArr。
    每当用户完成一个图形的绘制(例如,在 mouseReleased 方法中画完一条直线后),程序会:
    创建一个新的 Shapes 对象。
    将图形的类型和坐标等信息填充到这个对象中。
    将这个对象存入 shapeArr 数组,并让索引 index 加一。
    这样,所有绘制过的图形信息都被持久化地保存在了内存的数组中,即使窗口刷新,数据也不会丢失。
    重写 paint 方法实现自动重绘 (Mpanel 类)
    这是实现持久化显示的关键一步。我创建了一个自定义面板 Mpanel,并重写了它的 paint 方法。
    paint 方法是Swing组件的绘制方法。每当组件需要显示时,系统就会自动调用它。通过在这个方法里遍历 shapeArr 数组,程序就能根据数组中保存的所有“图纸”,将图形一个不落地重新绘制出来。
    3.总结
    通过这次实践,我深刻理解到,在Swing等GUI编程中,所有持久的视觉内容都应该在 paint 或 paintComponent 方法中生成。
    错误做法:在事件处理方法中直接获取 Graphics 对象进行绘制。这只适合临时性的视觉效果(如鼠标拖拽时的预览)。
    正确做法:在事件中更新数据模型(如将图形信息存入数组),然后调用 repaint() 方法(在我的代码中,窗口刷新会自动触发 paint),通知系统“数据变了,请调用 paint 方法重绘”。paint 方法会根据最新的数据模型,完整地重建整个界面。
http://www.jsqmd.com/news/1402937/

相关文章:

  • 第四篇:交叉编译与工具链文件——一套代码,多个平台
  • PDF怎么解密,删除保护?我又找到了一款免费办公神器!内置几百种功能,可离线使用,赶紧冲!
  • ros2 从零开始zed双目相机在rviz显示出图像和深度信息
  • Java顺序表实现:从静态数组到动态扩容的底层原理与实战
  • PyCharm中利用Mermaid与PlantUML实现Markdown流程图绘制全攻略
  • 代码随想录day13
  • Grok 4.6智能体长时运行能力解析与工程实践指南
  • OpenClaw技能系统实战:构建可扩展、安全的AI智能体
  • ARCH与交叉编译器的关系
  • Day5语法:循环-分支语句
  • 南宁防水修缮品牌怎么选?漏水维修科普、避坑与靠谱服务商参考 - 收录优先
  • PCB镀铜均匀性怎么做?工程师揭秘关键工艺
  • 停车场道闸系统选购避坑指南:选对设备,大幅降低后期运维难题
  • 纯WINDOWS API的C++2D小游戏Subterra(目前还未开发,实时更新)
  • 从PID到模型预测:管道小球摆杆控制的核心难点与工程实现
  • Linux vsftpd匿名FTP服务器搭建:安全配置与被动模式故障排查
  • OpenClaw像素风赛博办公室:AI Agent工作流可视化与实时监控实践
  • 华为eNSP设备启动失败:从虚拟化冲突到权限配置的完整排错指南
  • 工业陶瓷零件的材料选型与精度控制:从氧化锆到氮化硅的几个技术点
  • 【无标题】买房收房别只看颜值,这些坑你根本看不见 在本地房产交易活跃的当下,越来越多人意识到:房子表面光鲜不代表住得安心。尤其是二手房翻新或精装交付,墙面平整、地板漂亮背后,可能藏着水电隐患、防水失效
  • Quartus内置ModelSim‑Altera报错Error: Failure to obtain a Verilog simulation license. Unable to checkout
  • Cursor 修复循环校验翻车:3次追问后账单超预算200%,我这样设熔断
  • 居家如何养护艾草暖宫精油日常养护感受海艾独有的温润体感
  • PDF 临时处理总要四处找工具?常用操作放进一个工具箱
  • 脱皮腰果色选怎样减少黑斑、碎仁与异色料混入
  • 上海市口碑好的防水补漏维修公司怎么找_屋面防水本地维修队伍水准盘点,挑选要点深度剖析 - 雨婺虹修缮
  • 网络安全入门:小白必学的极简框架与实战指南
  • OpenClaw部署运维指南:从安装到稳定运行的AI智能体实践
  • Windows鼠标异常唤醒电脑的排查与解决全攻略
  • IDEA代码报红但能运行?深度解析索引缓存机制与系统化解决方案