2011-09-12 9 views
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())); 
} 
} 

リンクにクリック - ブタは何も

と第二の質問に起こりませんfloat(divやそれに基づいて、ブラウザウィンドウを区切らない)、そのClickHandlerのテキストコンテンツを持つpupup?

答えて

1

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

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

+0

テーブルセルにあるリンクからクリックイベントを処理するだけで済みます。普通のhtml/jsでは、私は. How can I get it with GWT - adding Anchor widget to the table or coding onBrowserEvent? – yetanothercoder

+0

You can always just add your plain html from the renderer - you don't need a widget. 'sb.append(SafeHtmlUtils.fromTrustedString(""));' –

0

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

ClickableTextCellクラスを使用して列を作成します。セルには何が保存されていますか?ユーザレコードのデータベースへの文字列ID。ユーザの名前と電子メールが含まれます。

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. 
    */ 
    } 

}; 

が実は、私は列のサブクラスを持っていますが、あなたのアイデアを得る:私は列を作成すると、情報が電子メールのリンクとしてレンダリングされるように、私はrenderメソッドをオーバーライドします。

あなたのページのアクティブなHTMLリンクで、下にクリック可能なテキストセルがあります。私は、ブラウザのイベントを扱うよりもずっと簡単だと分かった。

私は多くの自分の細胞に同じ構造を使用しています。その下にあるClickableTextCells、およびタイプ固有のレンダリングコードを使用して、ユーザーに予想される形式で提示します。特に、動的ピックリストタイプのフィールドがあります。つまり、ピックリストはクリックが発生するまで認識されません。標準のselectionCellでは、構築時に一度確立されるピックのリストが必要です。これが私にこの解決策をもたらしました。そのため、標準的なSelectionCellドロップダウンの代わりに、重大な作業**がなければ動作しません**、私はこのテクニックを使用します。 ClickableTextCellが起動すると、DataGridでポップアップを構築するFieldUpdaterを設定しました。このDataGridは、この選択肢の有効な値のセット(データベースの現在の状態によって決まります)をリストしています。ユーザーが選択して保存ボタンを押すと、ポップアップが閉じられ、ミドルウェアが選択肢を更新するために呼び出され、更新された行データがそのRPC呼び出しを介して返され、返されたデータは内部クライアント側データベースを更新するために使用され、これにより、DataGridを駆動するすべてのListDataProviderの更新がトリガーされ、メインDataGrid(および画面上に潜在的に表示されるその他のDataGrid)が自動的に更新されます。

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

**ダイナミックアスペクト以外に、この動的選択は非常に長いリストになる可能性があるため、ドロップダウンは貧弱な選択です。ユーザーがスクロール、検索、フィルタリングなどを行うことができるDataGridを提示する方がよい。

+0

thanks, just wonder if there is an OOP way to code link GWTを使っていましたが、Java Stringsの中でjavascriptをコード化しています... – yetanothercoder

関連する問題