0

我有一个基本问题。我开发了一个 Python 组件,该组件仅将一个简单属性的值打印到控制台屏幕,并开发了一个仅运行该组件的波形。

我正在尝试创建一个显示当前属性值(字符串)并允许我更改属性值的组件控制面板。当我更改属性的值时,我希望打印到控制台窗口的值也发生更改。我的理解是我需要将属性绑定到控制面板上的一个文本框。

我尝试按照文档(http://redhawksdr.github.io/Documentation/mainch24.html)第 24.4.1 节中的绑定示例,将它们的绑定代码添加到由SCA 组件控制面板向导。但是,当我查看控制面板时,出现错误:

在“刷新组件”期间发生内部错误。
null 参数:验证领域不能为 null

我对 Java 相当陌生,但我猜我收到错误是因为在创建 SCA 组件的本地副本时出现了一些问题(在下面的代码中名为“组件”的变量)。

这是我的控制面板代码:

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。

4

1 回答 1

1

我相信这里的问题是您正在尝试从作业中创建绑定。

绑定的创建应该在 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

于 2013-10-31T12:36:38.330 回答