4

私はRCPアプリケーションを持っており、いくつかのエンティティのウィザードを起動するコマンドがあります(エンティティのすべてのフィールドを表示するウィザードを編集し、ユーザーはそれを変更してウィザードを終了してこのエンティティを保存できます)。JFace データ バインディングを使用して、エンティティのフィールドを swt テキストとコンボにバインドしています。

そのコマンドにはハンドラー (ウィザード呼び出しを含む) があり、このハンドラーはいくつかのボタンにバインドされ、すべて正常に動作します。

次に、このコマンドをいくつかのキーの組み合わせ (たとえば Ctrl+E) にバインドする必要があります。私はそれのために org.eclipse.ui.bindings エクステンションを使用しています:

<key
commandId="com.project.command"
contextId="com.project.view.context"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="M1+E">
</key>

「com.project.view.context」は、2 つの異なるビューで同じキーの組み合わせにバインドするように私が作成したもので、問題ないように見えます (これら 2 つのビューで異なるコマンドをアクティブにします)。

しかし、このキーの組み合わせでウィザードを開くと、問題が発生します:

SWT テキスト フィールドは、エンティティの整数フィールドにバインドされません。文字列フィールドでは問題なく、バインドも問題ありません。しかし、整数フィールドはそうではありません (そこには空のスペースがあるだけです)。

私が試したこと:

  1. ウィザードとウィザード ページをデバッグしましたが、常にエンティティの状態は良好です (整数フィールドは正しく、0 または null ではありません)。

  2. JFace バインディング用の整数から文字列へのコンバーターの書き込みを試みました。役に立ちませんでした。

  3. このフィールドの JFace バインディングを無効にして、テキスト フィールドの値を手動に設定しようとしました。

    swtTextField.setText(entity.getIntegerField().toString());
    

    しかし、これもうまくいきませんでした!JFace バインディングの問題ではなく、SWT テキストの問題のように見えますか? この状況をデバッグします:

    entity.getIntegerField().toString() = "1234" "setText" 前後 swtTextField.getText = "" "setText" 前後

    (そして、キーの組み合わせコマンド呼び出しからではなく、このデバッグを実行すると、すべてがうまく見え、「setText」の後にswtTextField.getText =「1234」になります)

  4. バインド拡張のコンテキストをデフォルト ("org.eclipse.ui.contexts.window") に変更しようとしましたが、これも役に立ちませんでした。

要約すると、ボタン(またはコンテキストメニュー)からコマンドを呼び出すと、すべて正常に動作します。しかし、キーの組み合わせバインディング拡張を使用してコマンドを呼び出すと、Integer->Text フィールド (文字列フィールドは正常に動作します) に問題があります。

何が問題なのですか?

追加: 問題はキーの組み合わせにあることがわかりました。キーの組み合わせに英語以外のキー記号 (Ctrl + 英語以外のキー、私の言語のキー記号、アプリケーションが英語以外のキーの組み合わせを使用しているため) が含まれている場合、問題が発生します: SWT テキストは整数値を受け入れません。キーの組み合わせが英語 (Ctrl + 英語キー) の場合 - すべて問題ありません。

他のすべてのコマンド (SWT テキスト フィールドを除く) も正常に機能し、Ctrl+非英語キーの組み合わせにもバインドされています...

それは非常に奇妙で、私にはまだ理解できません。

4

1 に答える 1

1

私は数ヶ月前にこの問題にぶつかりました。問題は JFace データ バインディングにありました。何が役に立ったか:

  • org.eclipse.core.databinding.observable.value.IObservableValueを観察するために使用しますText。したがって、次のようなコードを記述できます。IObservableValue yourTextObserveTextObserveWidget = SWTObservables.observeText(yourText, SWT.Modify);
  • org.eclipse.core.databinding.beans.BeansObservables次のようなコードを記述できるように、エンティティの値を観察するために使用します。BeansObservables.observeValue(yourModel, "yourInt");
  • 次のように使用 org.eclipse.core.databinding.DataBindingContextしてバインドしますIObservableValuebindingContext.bindValue(yourTextObserveTextObserveWidget, yourModelTemplateObserveValue, null, null)

したがって、モデルを にバインドする最終的なコードは次のTextようになります。

DataBindingContext bindingContext = new DataBindingContext();
IObservableValue yourTextObserveTextObserveWidget = SWTObservables.observeText(yourText, SWT.Modify);
IObservableValue yourModelTemplateObserveValue = BeansObservables.observeValue(yourModel, "yourInt");
bindingContext.bindValue(yourTextObserveWidget, yourModelTemplateObserveValue, null, null);

さらに質問がある場合は、データ バインディングのドキュメントを確認してください。Stringこれは、 、booleanおよびタイプを使用して私のプログラムで機能していIntegerます。私は他に何もテストしていません。

于 2012-06-15T09:18:30.473 に答える