如何在Griffon(Groovy/Swing)中实现JList与模型的绑定?
解决Griffon中JList绑定Observable集合不更新的问题
嘿,我看你在Griffon里把JList绑定到模型集合时遇到麻烦了。问题出在你用的普通HashSet上——虽然给字段加了@Observable注解,但这个注解只能监听字段引用本身的变化(比如把整个集合换成新的HashSet),但集合内部的添加/删除元素操作并不会触发属性变更事件,所以JList根本不知道集合内容变了。
这里有个简单的修复方案,用Griffon自带的可观察集合类型替换普通HashSet就行:
第一步:修改模型,使用ObservableSet
Griffon提供了ObservableSet(还有ObservableList、ObservableMap),这些集合内部会自动监听元素的增删操作,并触发对应的属性变更事件,绑定就能正常工作了。修改后的模型代码:
package com.halcon.scheduler import com.halcon.scheduler.domain.EventType import griffon.core.artifact.GriffonModel import griffon.metadata.ArtifactProviderFor import griffon.transform.Observable import griffon.collections.ObservableSet // 导入Griffon的可观察集合 @ArtifactProviderFor(GriffonModel) class EventTypeListModel { @Observable String newEventType = ""; @Observable ObservableSet<EventType> eventTypes = ObservableSet.create(); // 替换为ObservableSet }
第二步:完善控制器的添加逻辑
在你的控制器addNewEventType动作里,直接往model.eventTypes里添加元素即可,不需要重新赋值集合,ObservableSet会自动通知视图更新:
@ControllerAction void addNewEventType() { // 先校验输入不为空 if (!model.newEventType.trim().isEmpty()) { // 假设EventType有对应的属性构造方式 EventType newType = new EventType(name: model.newEventType) model.eventTypes.add(newType) // 清空输入框 model.newEventType = "" } }
为什么这样能解决问题?
普通HashSet没有任何事件通知机制,哪怕修改了集合内容,模型的eventTypes字段引用还是原来的对象,@Observable不会触发变更。而ObservableSet会在每次元素增删时主动触发PropertyChangeEvent,Griffon的绑定机制能捕捉到这个变化,自动更新JList的内容。
另外,如果以后需要让JList感知到EventType对象本身的属性变化(比如修改EventType的名称),记得给EventType类的对应属性也加上@Observable注解哦。
内容的提问来源于stack exchange,提问作者spierepf
相关产品推荐
相关产品推荐

