0

基本的な質問があります。単純なプロパティの値をコンソール画面に出力するだけの Python コンポーネントと、コンポーネントを実行するだけの波形を開発しました。

現在のプロパティ値 (文字列) を表示し、プロパティの値を変更できるコンポーネント コントロール パネルを作成しようとしています。プロパティの値を変更すると、コンソール ウィンドウに出力される値も変更されます。私の理解では、プロパティをコントロール パネルのテキスト ボックスにバインドする必要があります。

ドキュメント ( http://redhawksdr.github.io/Documentation/mainch24.html )のセクション 24.4.1 のバインディングの例に従ってみました。 SCA コンポーネント コントロール パネル ウィザード。ただし、コントロール パネルを表示すると、次のエラーが表示されます。

「コンポーネントのリフレッシュ」中に内部エラーが発生しました。
null 引数: 検証レルムを 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 を実行しています。

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 に答える