GWT Spreadsheet Cell - PullRequest
       8

GWT Spreadsheet Cell

3 голосов
/ 19 января 2010

Я пытаюсь воспроизвести поведение ячейки электронной таблицы, используя GWT. Мне удалось создать составной виджет под названием «Ячейка», который по умолчанию является виджетом «Метка». Когда пользователь нажимает на этот виджет, он становится виджетом «TextBox». В случае размытия виджет снова становится виджетом «Метка».

Мой вопрос касается эффективности и времени рендеринга. Вероятно, было бы проще всего сделать мою «Ячейку» «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;
    }
}

...

При наличии onBlurEvent в TextBox или при событии onClick в Label вызывается метод switchMode (). Критика кода приветствуется.

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

Ответы [ 2 ]

4 голосов
/ 20 января 2010

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

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

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

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

2 голосов
/ 19 января 2010

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

...