Pharo扫雷项目:如何实现Smalltalk单元格点击显示文本?
解决Pharo扫雷单元格点击显示文本的问题
我之前在Pharo里改造类似的小游戏时也踩过这个坑!从你给出的初始化代码来看,问题出在没有在点击事件中动态更新label内容并触发UI刷新。下面是具体的解决步骤:
1. 完善鼠标点击事件处理
首先,给你的单元格类添加mouseUp:方法,这个方法会处理点击后的文本显示和颜色切换逻辑:
mouseUp: anEvent super mouseUp: anEvent. "根据单元格状态更新显示内容" mineState ifFalse: [ self label: cellValue asString. "将数字值转为字符串显示" self color: onColor ] ifTrue: [ self label: '💣'. "地雷显示特殊符号" self color: Color red darker ]. self changed. "强制触发UI重绘,确保更新生效"
2. 修正初始化代码的细节
你的初始化代码有几处可以优化,确保初始状态正确且响应鼠标事件:
initialize super initialize. self label: ''."初始为空文本" self borderWidth: 4. mineState := false. cellValue := 0. offColor := Color paleYellow. onColor := Color paleBlue darker."补全颜色赋值" self color: offColor."初始设置为未激活颜色" self extent: 32@32."用extent设置尺寸比直接修改bounds更稳妥" self wantsMouseEvents: true."确保Morph响应鼠标事件"
这里的wantsMouseEvents: true很关键,它会告诉Pharo这个Morph需要接收鼠标事件,否则点击不会触发mouseUp:方法。
3. 确保cellValue已正确赋值
别忘了在扫雷的棋盘生成逻辑里,给每个非地雷单元格计算并设置cellValue(周围地雷的数量)。比如在初始化棋盘的时候,遍历每个单元格,统计它周边的地雷数并赋值给cellValue,不然点击后只会显示初始的0。
4. 测试验证
你可以手动在调试器里给某个单元格设置cellValue := 3,然后点击它,看看是否显示"3"并切换到onColor。如果还是不显示,检查是否调用了self changed——这个方法是通知UI系统重绘当前Morph的关键,没有它的话,即使修改了label,界面也不会更新。
内容的提问来源于stack exchange,提问作者user8232299
相关产品推荐
相关产品推荐

