You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:59:21