SWT文本字段设置和RCP命令绑定到键

时间:2012-04-18 09:11:19

标签: java swt eclipse-rcp jface

我有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”是由我在两个不同的视图中绑定到相同的组合键并且看起来没问题(并在这两个视图中激活不同的命令)。

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

SWT文本字段不绑定到实体的整数字段。使用String字段,一切正常,它们的绑定很好。但是整数字段不是(其中只有空格)。

我尝试了什么:

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

  2. 尝试将整数写入字符串转换器以进行JFace绑定。没有帮助。

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

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

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

    entity.getIntegerField()。toString()=“1234”之前和之后 “setText”之前和之后的“setText”swtTextField.getText =“”

    (当我从Key组合命令调用运行此调试时, 一切看起来不错,“setText”之后的swtTextField.getText =“1234”)

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

  5. 所以,总结一下,当我通过按钮(或上下文菜单)调用我的命令时,一切正常。但是当我通过键组合绑定扩展调用我的命令时,Integer-&gt; Text字段(字符串字段工作正常)存在问题。

    有什么想法吗?

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

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

    这很奇怪,我仍然不明白,为什么那个hanneps ...

1 个答案:

答案 0 :(得分:1)

几个月前我遇到了这个问题。问题出在JFace Data Bindings上。有什么帮助:

  • 使用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并绑定IObservableValue,如下所示:bindingContext.bindValue(yourTextObserveTextObserveWidget, yourModelTemplateObserveValue, null, null)

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

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

如果您有任何其他问题,请查看数据绑定的文档。这适用于我的StringbooleanInteger类型的计划。我还没有测试过任何其他的东西。