Создание таблицы 10×10 из TableElement, TableRowElement и TableCellElement

#html #gwt

#HTML #gwt

Вопрос:

Я следил за крупномасштабным руководством по разработке приложений и MVP — части II, и в последнем выборе (оптимизированные пользовательские представления) говорится, что таблица должна создаваться не по элементу для каждого элемента, а одним потоком, используя HTML-элемент и создавая таблицу с помощью TableElement, TableRowElement и TableCellElement.

Итак, я создал код на основе их примера, но он просто записывает разные HTML-элементы друг под другом. Я думаю, мой код лучше объясняет, что он должен делать.

 public void onModuleLoad() {
    HTML html = new HTML();
    html.setHTML(createTable());
    RootPanel.get().add(html);
}

public String createTable() {
    //create table
    TableElement table = Document.get().createTableElement();
    //create tbody
    TableSectionElement tbody = Document.get().createTBodyElement();
    table.appendChild(tbody);

    //Create 10 dummy rows
    for (int i = 0; i < 10;   i) {
        //insert at -1, which is per definition the last posiion
        TableRowElement row = tbody.insertRow(-1);
        //create 10 dummy columns
        for (int j = 0; j < 10;   j) {
            //insert at -1, which is per definition the last posiion
            TableCellElement cell = row.insertCell(-1);
            //set a dummy text
            String s = (Integer.toString(i)   " : "
                      Integer.toString(j));
            cell.setInnerHTML(s);
        }
    }

    return table.getInnerHTML();
}
  

Есть идеи, почему он не создает таблицу 10×10?

Ответ №1:

Во-первых, я бы посоветовал вам заменить этот код на SafeHtmlBuilder , который должен быть еще быстрее (вообще без манипуляций с DOM).

Далее, к вашей проблеме, вы должны обернуть таблицу в фиктивный контейнер (скажем, DivElement) и использовать getInnerHTML() для этого контейнера.

Ответ №2:

Ну, простая ошибка… Я возвращал table.getInnerHTML(); , которые возвращают часть, начинающуюся <tbody> и заканчивающуюся </toboy> . Изменив его на table.toString(); исправлено!

Комментарии:

1. Нет, toString() для элемента не гарантирует возврат «outerHTML» (как это называется в IE); см. Мой ответ.