1

CellTable があり、セル内にハイパー リンクと onclick ハンドラーを含む列が必要です。最初の質問、私が持っている場合、何が間違っているのですか:

Column<MyObject, Anchor> linkColumn = new Column<MyObject, Anchor>(
    new AnchorCell()) {
    @Override
    public Anchor getValue(final obj) {
    Anchor link = new Anchor("link");
    link.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
        Window.alert("clicked ");
        }
    });
    return link;
    }
};
cellTable.addColumn(linkColumn, "link column");

...

public class AnchorCell extends AbstractCell<Anchor> {
@Override
public void render(Context context, Anchor h, SafeHtmlBuilder sb) {
    sb.append(SafeHtmlUtils.fromTrustedString(h.toString()));
}
}

-しかしクリックしてリンク - 何も起こらない

そして2番目の質問:そのClickHandlerからのテキストコンテンツでフロート(divなどに基づいて、分離されたブラウザウィンドウではない)の子犬を開くより良い方法は何ですか?

4

2 に答える 2

1

CellTable では、アンカー ウィジェットをテーブルに追加していません。HTML を追加しているだけです。ウィジェットは実際にはテーブルにないため、ウィジェットの機能はどれも通常どおりには機能しません。

onBrowserEvent をオーバーライドして、セルのクリックなどのイベントを取得できます。これらのイベントはブラウザにネイティブであり、伝播するためにウィジェット フレームワークを必要としないため、引き続き発生します。これがあなたが望む効果を達成するための最良の方法だと思います。

于 2011-09-12T14:31:34.237 に答える
0

私はあなたと同じような設定をしています。ハイパーリンクを含むCellTable(現在はDataGrid)ですが、ユーザーがセルをクリックしてもリンクyビットではなく、エディターウィジェットをポップアップしたいです。彼がリンクをクリックすると、通常の HTML 動作が必要になります。

ClickableTextCell クラスを使用して列を作成します。セルには何が保存されていますか? ユーザー レコードのデータベースへの文字列 ID。これには、ユーザーの名前と電子メールが含まれます。列を作成するときに、render メソッドをオーバーライドして、情報が電子メール リンクとしてレンダリングされるようにします。

Column<RowType, ColumnType> emailColumn = new Column<RowType, ColumnType>(new ClickableTextCell()){

    @Override
    public void render(Context context, T object, SafeHtmlBuilder sb) {
    /* Code that pulls the value in this column at this row, uses 
     * it to look up the name and the email, then does sb.appendX 
     * to build up the "<a href='emaillink'>name</a>" SafeHtml
     * construction.
     */
    }

 };

実は、私は Column のサブクラスを持っていますが、お分かりいただけたでしょうか。

ほら、ページ上のアクティブな HTML リンクですが、その下にクリック可能なテキスト セルがあります。これは、ブラウザ イベントを処理するよりもはるかに簡単であることがわかりました。

私は自分の細胞の多くに同じ構造を使用しています。下にある ClickableTextCells と、期待される形式でユーザーに表示するための型固有のレンダリング コード。特に、動的ピックリスト タイプのフィールドがあります。つまり、ピックリストはクリックが発生するまでわかりません。標準の selectionCell では、ピックのリストを構築時に一度確立する必要があります。これが、このソリューションにたどり着いた理由です。したがって、標準の SelectionCell ドロップダウンの代わりに、深刻な作業がなければ機能しません**、私はこの手法を使用します。ClickableTextCell が起動すると、DataGrid を含むポップアップを作成するように FieldUpdater を設定しました。この DataGrid には、この選択に対する現在の有効な値のセットがリストされます (データベースの現在の状態によって決定されます)。ユーザーが選択を行って [保存] ボタンをクリックすると、

実際、私のソリューションでは ClickableTextCell を DoubleClickableTextCell に拡張しているため、ダブルクリックしてエディターをアクティブにする必要があります。もちろん必須ではありませんが、ユーザーが目の前でポップアップが爆発することなく、グリッドの周りをぼんやりとクリックできるようにします。

** 動的な側面に加えて、この動的選択は非常に長いリストになる可能性があるため、ドロップダウンは適切な選択ではありません。ユーザーがスクロール、検索、フィルター処理などを行える DataGrid を提示することをお勧めします。

于 2011-09-12T16:57:26.990 に答える