ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

图形重绘与数组学习小结

图形重绘与数组学习小结 在开发画图工具的过程中我遇到了一个问题为什么画好的图形在窗口最小化或被遮挡后就会消失我利用“数组”和“重绘机制”解决了这个问题。问题的根源最初我的绘图逻辑非常直接在鼠标事件如 mouseReleased中直接通过 Graphics 对象调用 drawLine 或 drawRect 方法。然而我很快发现一旦窗口需要刷新例如被其他窗口遮挡后重新显示或最小化后还原所有绘制的内容都会消失。这是因为绘图上下文是临时的Graphics 对象就像一块画布我们直接在上面画画。但操作系统或窗口管理器在需要时如窗口刷新会清空这块画布并调用组件的 paint() 方法要求组件“重绘”自己。缺乏数据记忆我的程序只记录了“画”这个动作但没有记录“画了什么”。当 paint() 方法被系统自动调用时它不知道之前画过哪些图形因此只能呈现一个空白的面板。解决方案数据与视图分离为了解决这个问题我采用了“数据与视图分离”的思想。核心思路是不再直接“画”图而是“记录”图形数据然后让程序根据数据自动“重绘”。这个方案主要包含三个步骤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 方法会根据最新的数据模型完整地重建整个界面。
返回列表