4

我有 RCP 应用程序,并且我有一个命令,它启动某个实体的向导(编辑向导,显示实体的所有字段,用户可以更改它并完成向导以保存该实体)。我正在使用 JFace 数据绑定将实体的字段绑定到 swt Texts 和 Combos。

该命令具有处理程序(包含向导调用),并且该处理程序绑定到某个按钮并且一切正常。

然后我需要将此命令绑定到某个组合键(例如 Ctrl+E)。我正在使用 org.eclipse.ui.bindings 扩展:

<key
commandId="com.project.command"
contextId="com.project.view.context"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="M1+E">
</key>

“com.project.view.context”是我制作的,用于在 2 个不同的视图中绑定到相同的组合键,看起来还可以(并在这 2 个视图中激活不同的命令)。

但是当我通过这个组合键打开我的向导时,出现了一个问题:

SWT 文本字段不绑定到实体的整数字段。使用 String 字段一切正常,并且它们绑定得很好。但是整数字段没有(里面只有空白)。

我试过的:

  1. 我调试了我的向导和向导页面,并且所有时间实体状态都很好(它们的整数字段是正确的,而不是 0 或 null)

  2. 试图为 JFace 绑定编写整数到字符串转换器。没有帮助。

  3. 我尝试禁用此字段的 JFace 绑定,并手动设置文本字段值:

    swtTextField.setText(entity.getIntegerField().toString());
    

    但这也没有用!看起来不是 JFace 绑定问题,而是 SWT 文本问题?调试这种情况:

    entity.getIntegerField().toString() = "1234" 在 "setText" 之前和之后 swtTextField.getText = "" 在 "setText" 之前和之后

    (当我不是从组合键命令调用中运行此调试时,一切看起来都很好,并且在“setText”之后 swtTextField.getText =“1234”)

  4. 试图将绑定扩展的上下文更改为默认值(“org.eclipse.ui.contexts.window”),但这也没有帮助。

所以,总而言之,当我通过按钮(或上下文菜单)调用我的命令时,一切正常。但是当我通过键组合绑定扩展调用我的命令时,整数->文本字段(字符串字段工作正常)存在问题。

有什么想法吗?

补充:我发现问题出在组合键上。当组合键包含非英语键符号(Ctrl+non-english-key 我的语言键符号,导致我们的应用程序使用非英语键组合)时,就会出现问题:SWT 文本不接受整数值。当组合键为英语时(Ctrl+english-key)- 一切正常。

所有其他命令(没有 SWT 文本字段)也可以正常工作,并且它们也绑定到 Ctrl+非英语键组合......

这很奇怪,我还是不明白,为什么那汉内普......

4

1 回答 1

1

几个月前我遇到了这个问题。问题出在 JFace 数据绑定上。有什么帮助:

  • 用于org.eclipse.core.databinding.observable.value.IObservableValue观察您的Text. 所以你可以这样写代码:IObservableValue yourTextObserveTextObserveWidget = SWTObservables.observeText(yourText, SWT.Modify);
  • 用于org.eclipse.core.databinding.beans.BeansObservables观察实体的值,以便您可以编写如下代码:BeansObservables.observeValue(yourModel, "yourInt");
  • 像这样使用 org.eclipse.core.databinding.DataBindingContext和绑定你的IObservableValuebindingContext.bindValue(yourTextObserveTextObserveWidget, yourModelTemplateObserveValue, null, null)

因此,将模型绑定到 a 的最终代码Text将如下所示:

DataBindingContext bindingContext = new DataBindingContext();
IObservableValue yourTextObserveTextObserveWidget = SWTObservables.observeText(yourText, SWT.Modify);
IObservableValue yourModelTemplateObserveValue = BeansObservables.observeValue(yourModel, "yourInt");
bindingContext.bindValue(yourTextObserveWidget, yourModelTemplateObserveValue, null, null);

如果您有任何其他问题,请查看数据绑定的文档。这在我的程序中使用String,booleanInteger类型。我还没有测试过其他任何东西。

于 2012-06-15T09:18:30.473 回答