5

私は GWT アプリに取り組んでおり、これまでのところ、Java 開発者に優しい UI フレームワークが気に入っています。

これまでのところ、ウィジェットを使ってほとんど何でもできましたが、これには困惑しました。ユーザー入力ソースとして使用するセル テーブルがあります。これは、ユーザーがキーと値のペアを入力してサービスを呼び出す方法にすぎません。ユーザーは行を動的に追加および削除できます。

ここで難しいのは、ユーザーにいくつかのキーの値を入力させたいということです。これらのキーには特定の 4 ~ 5 個の許容値しかないため、これらの行については、editableTextCell を selectionCell に置き換えたいと考えています。列をテーブルに追加するときに列のセル型の宣言が行われた場合、テーブル内でセル型を混在させる方法がわかりません。

どんな入力でも大歓迎です!

ありがとう

4

3 に答える 3

5

<select>時々 をレンダリングし、時には をレンダリングするカスタム Cell を作成する必要があります<input>。EditableTextCell と SelectionCell のコードを見ると、それを達成する方法についてのアイデアを得ることができます。それは非常に単純かもしれません - それぞれの 1 つを構成し、render関数でデータを適切なセルに渡すだけです。

何かのようなもの...

public class ChoosyCell extends AbstractCell<YourData> {
    SelectionCell selectCell = new SelectionCell<YourData>();
    EditableTextCell textCell = new EditableTextCell<YourData>();

    public void render(Context context, YourData data, SafeHtmlBuilder sb) {
        if (data.isTheLimitedType()) {
            selectCell.render(context, data, sb);
        } else {
            textCell.render(context,data, sb);
        }
     }
}

(未テストのコード)

于 2011-05-10T00:13:59.017 に答える
0

非常に便利。これが条件付きでレンダリングされた私の見解ですCheckboxCell


    import com.google.gwt.cell.client.AbstractCell;
    import com.google.gwt.cell.client.CheckboxCell;
    import com.google.gwt.cell.client.ValueUpdater;
    import com.google.gwt.dom.client.Element;
    import com.google.gwt.dom.client.EventTarget;
    import com.google.gwt.dom.client.NativeEvent;
    import com.google.gwt.safehtml.shared.SafeHtmlBuilder;

    /**
     * CheckboxCell that is conditionally rendered if the enclosing column's
     * Boolean com.google.gwt.user.cellview.client.Column.getValue(T object) method returns true.
     */
    public class ConditionallyRenderedCheckboxCell extends AbstractCell {

        public ConditionallyRenderedCheckboxCell() {
        //CheckboxCell と同じイベントを処理します
        super("変更", "キーダウン");
        }

        プライベート CheckboxCell セル = null;

        @オーバーライド
        public void render(Context context, Boolean renderCheckboxCell, SafeHtmlBuilder sb) {
            if (renderCheckboxCell) {            
                this.cell = new CheckboxCell(false,true);  
                //チェックボックスのセルをオフにします
                this.cell.render(context, false, sb);
            }
         }

        @オーバーライド
        public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context,
            要素の親、ブール値、NativeEvent イベント、
            ValueUpdater valueUpdater) {

        //チェックボックス セルを作成した場合はイベント処理を行い、それ以外の場合は無視します。
        if( this.cell != null ){
            super.onBrowserEvent(コンテキスト、親、値、イベント、valueUpdater);

            // 変更イベントを処理します。
            if ("change".equals(event.getType())) {

            // 最も外側の要素の外側で発生するイベントを無視します。
            EventTarget eventTarget = event.getEventTarget();

            if (parent.isOrHasChild(Element.as(eventTarget))) {

                // これを使用して、選択した要素を取得します!!
                要素 el = Element.as(eventTarget);

                // チェックボックスが本当にクリックされたかどうかを確認します
                if (el.getNodeName().equalsIgnoreCase("input") && el.getPropertyString("type").equalsIgnoreCase("checkbox")) {

                //値アップデータが定義されている場合は、それを呼び出します
                if(valueUpdater != null)
                    valueUpdater.update(el.getPropertyBoolean("checked"));          
                }
            }
            }
        }
        }        
    }

于 2012-06-05T21:17:41.317 に答える