将组件控制面板中的文本框绑定到组件属性的问题

时间:2013-10-29 21:24:33

标签: redhawksdr

我有一个基本问题。我开发了一个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。

1 个答案:

答案 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