0

In the JGoodies Bindings API (Link to API), there is a commitOnFocusLost parameter:

commitOnFocusLost - true to commit text changes on focus lost, false to commit text changes on every character typed

I want the behavior where there is no commit on focus lost and there is no commit while characters are being typed. I only want there to be a commit when I call Bindings.commitImmediatly(). Am I able to do that?

4

2 回答 2

0

您可能正在寻找BufferedValueModel

包装另一个 ValueModel 的 ValueModel,即主题,并延迟主题值的更改。返回主题的值,直到设置了值。在触发通道更改为 Boolean.TRUE 之前,缓冲值不会写入对象。

PresentationModel.getBufferedValue()对于创建它们很有用。


但是,通常我会避免使用缓冲模型,因为它会为已经相当复杂的架构模型增加额外的复杂性。此外,它不适用于模型验证。我建议单独保留绑定的自动提交行为,并围绕它构建代码。

Karsten Lentzsch 关于缓冲

我个人更喜欢通过复制域对象图来缓冲。在许多应用程序中,客户端上的域对象是后端域对象的副本。在这种情况下,您可以对客户端域对象进行操作,而无需任何进一步的缓冲。要刷新对客户端域对象所做的所有更改,您只需从后端重新加载它们。

无论如何,如果您想在表示模型(PM)层缓冲,您应该在 PM 中使其可用。然后,您的表示逻辑在缓冲状态上运行,而不是在域状态上运行。

您可以在 Binding 教程中找到一个示例。请参阅 BufferedAlbumPresentationModel。它演示了如何监听缓冲的“经典”属性中的更改以更新缓冲的“composerEnabled”属性。请注意,如果专辑不是经典专辑,则 BufferedClassicalChangeHandler 复制在 Album#setClassical 中实现的行为,该行为将作曲家设置为 null。

您可以在JGoodies 下载档案中的旧包中找到该教程。

于 2012-12-07T19:10:42.237 回答
0

我不是 100% 肯定,但是你可以做到。

您需要使用 BasicComponentFactory 来创建您的组件并使用 BasicComponentFactory.createTextField(ValueModel) 而不使用 bool 参数。

然后,您将需要弄清楚如何以及何时在您的价值模型上调用保险箱,以便相应地保存。

于 2012-05-11T14:10:32.167 回答