0

Swing アプリケーションを閉じようとして、フィールドで同じ値を変更すると、アプリケーションは変更を保存するかどうかを尋ねます。

私の最初の質問は、RAP アプリケーションが同じ質問をしないのはなぜですか?

2 番目のより重要な問題は、フィールド変更の検証を強制する方法と、これを操作する方法です。

例えば ​​:

行とテーブルの下にいくつかのフィールドがあるテーブルがあります。行をクリックすると、フィールドに値が入力されます。この値を変更して、保存ボタンをクリックします。

行のクリック時に変更の検証を強制したいと思います。したがって、変更が適用され、行をクリックすると、アプリケーションはいくつかの変更が保存されていないことを警告するはずです。しかし、私は変化とそうでないものを操作できるはずです。たとえば、行のテーブルをクリックすると、フィールドが変更されない場合はデータが入力されますが、入力した値が同じフィールドである場合、これは変更されます。

方法を発見しました

checkSaveNeeded();

しかし、それは何もしません。(値を変更するかどうか)

すべての分野に数学があることがわかりました

@Override
public final void checkSaveNeeded() {
    if (isInitialized()) {
      try {
        propertySupport.setPropertyBool(PROP_SAVE_NEEDED, m_touched || execIsSaveNeeded());
      }
      catch (ProcessingException e) {
      SERVICES.getService(IExceptionHandlerService.class).handleException(e);
      }
    }
  }

だから私は変更を操作する必要があります m_touched をスローしますか?

これは Scout でどのように処理されますか?


追加

フォームを閉じるときと同じように、汚れたフィールドをチェックしてメッセージダイアログをポップアップする機能と、フィールドを汚れているかどうかを設定する方法を探しています。

herehereを見ましたが、説明されているのは、ポップアップメッセージの値の保存方法と、このメッセージを起動する方法 (検証) だけです。

4

1 に答える 1

1

私の最初の質問は、RAP アプリケーションが同じ質問をしないのはなぜですか?

どのメッセージ ボックスを意味するのかわかりませんが、そうである必要があります。


Eclipse Scout Forumには、保存されていない変更フォームのライフサイクルに関するいくつかの質問があります。Googleで検索できると思います。

また、時間をかけて Eclipse Wiki で文書化を開始しました。

execIsSaveNeeded()該当する分野で実装するとよいと思います。のデフォルトの実装でAbstractTableFieldは行の状態が使用されますが、必要なロジックは想像できます。

@Order(10.0)
public class MyTableField extends AbstractTableField<MyTableField.Table> {

  @Override
  protected boolean execIsSaveNeeded() throws ProcessingException {
    boolean result;
    //some logic that computes if the table field contains modification (result = true) or not (result = false)
    return result;
  }

  //...

これが役立つことを願っています。


フォームを閉じるときと同じように、ダーティ フィールドをチェックしてメッセージ ダイアログをポップアップする関数を探しています。

ユーザーがフォームで [キャンセル] をクリックしたときに表示されるこのメッセージ ボックスから話しているのですか?

変更を保存しますか

そのために呼び出すことができる特定の関数はありません。ただし、関数の先頭を確認できAbstractForm.doCancel()ます。それはまさにあなたが探しているものです。

私はそれを次のように書き直しました:

// ensure all fields have the right save-needed-state
checkSaveNeeded();
// find any fields that needs save
AbstractCollectingFieldVisitor<IFormField> collector = new AbstractCollectingFieldVisitor<IFormField>() {
  @Override
  public boolean visitField(IFormField field, int level, int fieldIndex) {
    if (field instanceof IValueField && field.isSaveNeeded()) {
      collect(field);
    }
    return true;
  }
};
SomeTestForm.this.visitFields(collector);

MessageBox.showOkMessage("DEBUG", "You have " + collector.getCollectionCount() + " fields containing a change in your form", null);

変更が変更されていないすべての値フィールドを収集するように、訪問者を変更しました。visitField(..)ただし、元の実装に固執することはできます。プライベートなので使えませんP_AbstractCollectingFieldVisitorが、どこかで似たようなフィールドビジターができます。

フィールドをダーティにするかどうかを設定する方法を探しています。

私があなたに言ったように:execIsSaveNeeded()いくつかのカスタムロジックの各フィールドで。フィールドでtouch()/を呼び出して、変更が含まれているかどうかを示すこともできます。markSaved()しかし、そうしなければできない場合を除き、これが正しいアプローチだとは思いません。

于 2015-02-11T12:42:31.907 に答える