Ячейка электронной таблицы GWT

Я пытаюсь воспроизвести поведение ячейки электронной таблицы с помощью 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(). Критика кода приветствуется.

Не будет ли разумнее включить TextBox и Label в качестве закрытых переменных класса Cell, а затем просто добавить или удалить соответствующий объект по мере необходимости?


person Michael Balint    schedule 19.01.2010    source источник


Ответы (2)


Мы столкнулись с похожей проблемой: эффективное отображение таблицы, похожей на excel (много строк и столбцов, каждая ячейка редактируется на месте).

Окончательное решение было таким: отображать таблицу как строку: каждая ячейка отображается как текст, помещать все через innerHTML. Когда пользователь выбирает ячейку с помощью мыши или клавиатуры, над выбранной ячейкой появляется специальная скрытая TextArea (с тем же размером), и фокус переходит на TextArea. OnBlur — введенный текст возвращается в ячейку, а TextArea снова скрывается.

Мы не используем виджеты для ячеек. TextArea только один для всей таблицы.

См. также "Эффективный GWT: разработка сложного высокопроизводительного приложения с помощью Google Web Toolkit" http://code.google.com/events/io/2009/sessions/EffectiveGwt.html

person zmila    schedule 20.01.2010

Еще более простым способом было бы добавить их обоих на вашу панель (но не simplePanel) и использовать методы setVisable для изменения видимости.

person mrras    schedule 19.01.2010
comment
Не думал об этом, но да, это, вероятно, было бы даже лучше. Мне любопытно с точки зрения эффективности (как в моем коде, так и в рендеринге страницы), какой метод будет лучшим? - person Michael Balint; 19.01.2010
comment
вы можете создать 2 простых примера и использовать трассировщик скорости для их мониторинга. - person mrras; 19.01.2010