我有一个基本问题。我开发了一个 Python 组件,它只是将简单属性的值打印到控制台屏幕和一个只运行该组件的波形。
我正在尝试创建一个组件控制面板,该面板显示当前属性值(字符串),并允许我更改属性的值。当我更改属性的值时,我希望打印到控制台窗口的值也更改。我的理解是我需要将属性绑定到控制面板上的文本框。
我尝试遵循文档 (http://redhawksdr.github.io/Documentation/mainch24.html) 第 24.4.1 节中的绑定示例,将它们的绑定代码添加到由 SCA 组件控制面板向导自动生成的 refresh() 函数中。但是,当我查看控制面板时,出现错误:
"刷新组件"期间发生内部错误。
空参数:验证领域不能为空
我对 Java 相当陌生,但我的猜测是我收到了错误,因为在创建 SCA 组件(下面代码中名为"component"的变量)的本地副本时出现了一些问题。
这是我的控制面板代码:
public void createPartControl(final Composite main) {
main.setLayout(new GridLayout(2, false));
propValue = new Text(main, SWT.BORDER);
propValue.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
}
public void refresh() {
Job refreshJob = new Job("Refresh Component") {
@Override
protected IStatus run(IProgressMonitor monitor) {
// bind text box to component property value
final ScaComponent component = getInput();
EMFDataBindingContext context = new EMFDataBindingContext();
IObservableValue observable = SCAObservables.observeSimpleProperty(component,"someText");
context.bindValue(WidgetProperties.text().observeDelayed(5000, propValue),observable);
return Status.OK_STATUS;
}
};
refreshJob.setSystem(true);
refreshJob.schedule();
}
作为参考,我在 RHEL 1.8.2 上运行 REDHAWK 版本 5.8。
这里的问题是您正在尝试从作业中创建绑定。
绑定的创建应在 SWT 线程内完成。 您收到的错误表示无法获取要在其中执行的领域。 如果此代码在 SWT 线程中执行,它将正确获取 SWT 领域。
Text propValue = new Text(main, SWT.BORDER);
EMFDataBindingContext context = new EMFDataBindingContext();
IObservableValue observable = SCAObservables.observeSimpleProperty(component, "simplePropId");
context.bindValue(WidgetProperties.text().observeDelayed(5000, propValue), observable);
请注意示例中如何立即创建绑定。 这可确保绑定位于正确的域中。
控制面板将偶尔更改输入模型。 因此,可能需要在刷新或 setInput 方法中创建绑定。 这些方法也从 SWT 线程调用。
请注意,在使用 context.dispose 并创建新上下文之前,应释放旧上下文,然后再重新绑定到新模型。
有关数据绑定如何工作的示例,请查看:http://www.vogella.com/articles/EclipseDataBinding/article.html