我有一个基本问题。我开发了一个Python组件,它只是将一个简单属性的值打印到控制台屏幕,以及一个只运行该组件的波形。
我正在尝试创建一个显示当前属性值(字符串)的组件控制面板,并允许我更改属性的值。当我更改属性的值时,我希望打印到控制台窗口的值也会改变。我的理解是我需要将属性绑定到控制面板上的文本框。
我尝试按照文档(http://redhawksdr.github.io/Documentation/mainch24.html)的第24.4.1节中的绑定示例,将绑定代码添加到由SCA组件控制面板向导自动生成的refresh()函数中。但是,当我查看控制面板时,出现错误:
在“刷新组件”期间发生内部错误 null参数:验证领域不能为空
我对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 5.8上运行REDHAWK版本1.8.2。
答案 0 :(得分:1)
我认为这里的问题是你试图在Job中创建一个绑定。
绑定的创建应该在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);
请注意示例中如何立即创建绑定。这可以确保绑定在正确的范围内。
控制面板偶尔会改变输入模型。因此,可能需要在refresh或setInput方法中创建绑定。这些方法也是从SWT线程调用的。
请注意,您应该在使用context.dispose重新绑定到新模型并创建新上下文之前释放旧上下文。
有关数据绑定如何工作结帐的示例:http://www.vogella.com/articles/EclipseDataBinding/article.html