【问题标题】:JGoodies binding, no commit on focus lost and no commit on every character typedJGoodies 绑定,没有提交焦点丢失并且没有提交每个键入的字符
【发布时间】:2012-12-08 03:10:42
【问题描述】:
在 JGoodies Bindings API (Link to API) 中,有一个 commitOnFocusLost 参数:
commitOnFocusLost - true 在焦点丢失时提交文本更改,false
对输入的每个字符提交文本更改
我想要没有提交焦点丢失并且在键入字符时没有提交的行为。我只希望在调用 Bindings.commitImmediately() 时进行提交。我能做到吗?
【问题讨论】:
标签:
java
swing
user-interface
binding
jgoodies
【解决方案1】:
我不是 100% 确定,但是你可以做到。
你需要使用 BasicComponentFactory 来创建你的组件
并使用不带 bool 参数的 BasicComponentFactory.createTextField(ValueModel)。
那么您将需要弄清楚如何以及何时在您的价值模型上调用保险箱,以便相应地进行保存。
【解决方案2】:
你可能正在寻找BufferedValueModel:
包装另一个 ValueModel 的 ValueModel,即主题,并延迟主题值的更改。返回主题的值,直到设置了值。在触发通道更改为 Boolean.TRUE 之前,缓冲值不会写入对象。
PresentationModel.getBufferedValue() 对创建它们很有用。
但是,通常我会避免使用缓冲模型,因为它会为已经相当复杂的架构模型增加额外的复杂性。此外,它不适用于模型验证。我建议不考虑绑定的自动提交行为,并围绕它构建您的代码。
Karsten Lentzsch on buffering:
我个人更喜欢通过复制域对象图来缓冲。
在许多应用程序中,客户端上的域对象是
后端域对象的副本。在这种情况下,您可以操作
在没有任何进一步缓冲的客户端域对象上。
刷新对客户端域对象所做的所有更改
你可以从后端重新加载它们。
无论如何,如果你想在表示模型(PM)层缓冲,
您应该在 PM 中提供它。你的演示逻辑
然后对缓冲状态进行操作,而不是对域状态进行操作。
您可以在绑定教程中找到一个示例。见
BufferedAlbumPresentationModel。它演示了如何
监听缓冲的“经典”属性的变化
更新缓冲的“composerEnabled”属性。
请注意,BufferedClassicalChangeHandler 复制
在 Album#setClassical 中实现的行为
如果专辑不是古典专辑,则作曲家为 null。
您可以在 JGoodies download archive 的旧包中找到教程。