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