3

GWTを使用してスプレッドシートセルの動作を再現しようとしています。デフォルトで「ラベル」ウィジェットである「セル」と呼ばれる複合ウィジェットを作成することができました。ユーザーがこのウィジェットをクリックすると、「TextBox」ウィジェットになります。ぼかしイベントでは、ウィジェットは再び「ラベル」ウィジェットになります。

私の質問は、効率とレンダリング時間に関するものです。私の「セル」を「テキストボックス」にして、CSSを介してユーザーの外観を変更するのがおそらく最も簡単でしょう(ユーザーがデータを入力しているかどうかに応じて)。ただし、これはレンダリング時間に影響すると思うので、入力が不要な場合は常に「ラベル」ウィジェットに戻します。ただし、このメソッドの問題は、基本的に、ユーザーが「セル」に何かを入力する必要があるたびに、新しいTextBox/Labelを作成していることです。

これが私の擬似コードです(私はIDEの周りにいないので)...

public class Cell extends Composite {

private SimplePanel sp;

public Cell() {
    Label l = new Label("");
    sp.add(l);
}

private void switchMode() {
    Widget w = sp.getWidget();
    if (w instanceof Label) {
        // we have a Label, change it to a TextBox
        String text = ((Label) w).getText();
        sp.remove(w);
        sp.add(new TextBox(text));
        // force garbage collection
        w = null;
    } else {
        // we have a TextBox, change it to a Label
        String text = ((TextBox) w).getText();
        sp.remove(w);
        sp.add(new Label(text));
        // force garbage collection
        w = null;
    }
}

...

TextBoxにonBlurEventがある場合、またはLabelにonClickイベントがある場合、switchMode()メソッドが呼び出されます。コードの批評は大歓迎です。

代わりに、Cellクラスのプライベート変数としてTextBoxとLabelを含め、必要に応じて対応するオブジェクトを追加または削除する方が賢明でしょうか。

4

2 に答える 2

4

同様の問題に遭遇しました:Excelのようなテーブルの効率的な表示(多くの行と列、各セルはインプレース編集可能)。

最終的な解決策は次のとおりです。テーブルを文字列としてレンダリングします。各セルはテキストとしてレンダリングされ、すべてinnerHTMLを介して配置されます。ユーザーがマウスまたはキーボードでセルを選択すると、選択したセル(同じサイズ)の上に特別な非表示のTextAreaが表示され、フォーカスがTextAreaに与えられます。OnBlur-入力されたテキストはセルに戻り、TextAreaは再び非表示になります。

セルにはウィジェットを使用しません。TextAreaは、テーブル全体に対して1つだけです。

「EffectiveGWT:GoogleWebToolkitを使用した複雑で高性能なアプリの開発」 http://code.google.com/events/io/2009/sessions/EffectiveGwt.htmlも参照してください。

于 2010-01-20T10:43:47.433 に答える
2

さらに簡単な方法は、両方をパネルに追加し(simplePanelただし)、setVisableメソッドを使用して視認性を変更することです。

于 2010-01-19T17:28:05.760 に答える