2010-01-19 9 views
3

Я пытаюсь воспроизвести поведение ячейки электронной таблицы с использованием GWT. Я смог создать виджет Composite под названием «Cell», который по умолчанию является виджлетом «Label». Когда пользователь нажимает на этот виджет, он становится виджетами «TextBox». В случае размытия виджет снова становится виджлетом «Ярлык».Ячейка электронных таблиц 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; 
    } 
} 

... 

Когда есть onBlurEvent на TextBox или когда происходит событие OnClick на этикетке, то switchMode(). Критический код приветствуется.

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

ответ

4

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

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

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

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

2

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

+0

Если бы не подумал об этом, но да, это, вероятно, будет еще лучше. Мне любопытно с точки зрения эффективности (как в моем коде, так и в рендеринге страницы), который был бы лучшим методом? –

+0

вы можете создать 2 простых примера и использовать скорость Tracer, чтобы контролировать их. – mrras

Смежные вопросы