1

私のエディタは複数の TextBoxes、CheckBoxes などで構成されています。ウィジェットによってトリガーされた ValueChangeEvents をエディタ自体でリッスンする適切な方法は何ですか?

Developer's Guide - Editorsを理解しようとしていますが、役に立ちません。

4

1 に答える 1

2

(G+ 投稿からの拡張ディスカッション)

あなたが考えるかもしれないいくつかの考え:

  • プラシーボの保存ボタンは悪い考えではありません。ダイアログ ボックスでは、「保存」は「保存して閉じる」を意味することが多く、これは「キャンセルして閉じる」タイプのボタンの隣にある可能性が高いことを意味します。変更が行われていない場合、結果は同じになります。変更がない場合に違いがあることを知る必要があるのはコードだけです。ドキュメントでは、「保存」は最近の変更をフラッシュする方法にすぎず、ボタンの背後にあるコードはそれを無視できます。ユーザーが必要以上に保存するようにソフトウェアに指示できるようにすることは、おそらく悪いことではありません...
  • Editor フレームワークは、訪問者がドライバーが認識しているエディターのツリーをたどることができるように構築されています。これにより、ツリー内の各エディターに HasValueChangeHandlers を実装しているかどうかを尋ね、実装している場合はハンドラーを追加できるビジターを作成できます。しかし...
  • ValueChangeEvents は、ウィジェットが論理的に変更され、新しい値を持つとオフになります。ほとんどの場合、これらの変更は、ユーザーがフィールドからぼやけた場合にのみ発生します。カーソルが、ユーザーが変更した唯一の TextBox 内にあり、ユーザーが保存ボタンの上にカーソルを置くと、ValueChangeEvent がないため、まだぼやけます。発生した。それらがフィールドを離れるのを待つか、アクティブなフィールドをポーリングして新しい値があるかどうかを確認するか、ダーティかどうかをドライバーに問い合わせる必要があります。すべてのウィジェットが適切にポーリングされるわけではないことに注意してください - フォーカスされている間は利用可能な値がないもの (CellWidget など) もあれば、isDirty() を理解できないもの (HasDataEditor など) もあります。

検索する編集者の訪問者の例HasValueChangeHandlers:

driver.accept(new EditorVisitor(){
  @Override
  public <T> void endVisit(EditorContext<T> ctx) {
    Editor<T> ed = ctx.getEditor();
    if (ed instanceof HasValueChangeHandlers) {
      @SuppressWarnings("unchecked")
      HasValueChangeHandlers<T> hasHandlers = (HasValueChangeHandlers<T>) ed;
      hasHandlers.addValueChangeHandler(new ValueChangeHandler<T>() {
        @Override
        public void onValueChange(ValueChangeEvent<T> event) {
          // TODO update button
          // consider comparing event.getValue() with ctx.getFromModel()
          // though that requires seeing which editors have changes...
        }
      });
    }
  }
});

変更のポーリングの例:

Timer t = new Timer(){
  @Override
  public void run() {
    boolean hasChanges = driver.isDirty();
    // TODO update button with the hasChanges value
  }
};
t.schedule(500);
// Don't forget to cancel() this when done, both on save and cancel!
于 2013-05-06T02:39:27.373 に答える