Виджеты клеток GWT с проблемами наложений
-
15-10-2019 - |
Вопрос
Я взял пример таблицы ячейки из Руководство разработчика Google и внесли следующие изменения:
- Используйте наложения вместо Java Pojos
- Используйте EditTextCell, чтобы редактировать один столбец
Для моего удивления, при запуске кода таблица ячейки добавляет дополнительное свойство к наложенным объектам. Они должны выглядеть как:
{"Имя": "Джон", "Адрес": "123 Четвертая дорога"} {"name": "mary", "адрес": "222 Lancer Lane"}
Но вместо этого они выглядят как:
{"имя": "Джон", "Адрес": "123 Четвертая дорога", "$ h": 1} {"name": "mary", "адрес": "222 Lancer Lane", "$ H": 2}
Вот измененный код, который демонстрирует проблему:
import java.util.Arrays;
import java.util.List;
import com.google.gwt.cell.client.EditTextCell;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.ui.RootPanel;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class Overlay implements EntryPoint {
private static class Contact extends JavaScriptObject {
protected Contact() {}
public static native Contact create(String name, String address) /*-{
return {"name" : name , "address" : address};
}-*/;
public final native String getName() /*-{
return this["name"];
}-*/;
public final native void setName(String name) /*-{
this["name"] = name;
}-*/;
public final native String getAddress() /*-{
return this["address"];
}-*/;
public final native void setAddress(String address) /*-{
this["address"] = address;
}-*/;
}
private static List<Contact> CONTACTS = Arrays.asList(
Contact.create("John", "123 Fourth Road"),
Contact.create("Mary", "222 Lancer Lane"));
/**
* This is the entry point method.
*/
public void onModuleLoad() {
CellTable<Contact> table = new CellTable<Contact>();
// Create name column.
Column<Contact, String> nameColumn = new Column<Contact, String>(new EditTextCell()) {
public String getValue(Contact object) {
return object.getName();
}
};
// Create address column.
TextColumn<Contact> addressColumn = new TextColumn<Contact>() {
public String getValue(Contact contact) {
return contact.getAddress();
}
};
// Add the columns.
table.addColumn(nameColumn, "Name");
table.addColumn(addressColumn, "Address");
table.setRowCount(CONTACTS.size(), true);
// Push the data into the widget.
printList();
table.setRowData(0, CONTACTS);
printList();
RootPanel.get().add(table);
}
private void printList() {
for(Contact contact : CONTACTS) {
GWT.log(new JSONObject(contact).toString());
}
}
}
Я проверил, что это редактируемый столбец, который вызывает проблему. Если я удалю его, таблица не изменяет мои наложения.
Во всяком случае, это очень странное поведение. Я не чувствую, что безопасно работать с наложениями, если ваши виджеты могут добавить их неожиданные свойства.
Кто -нибудь сталкивался с этой проблемой раньше или это поведение задокументировано где -нибудь? Какие -нибудь подсказки для его решения?
Большое спасибо
Решение
Правильный ответ на этот вопрос был опубликован на форуме развития GWT (ссылка на сайт):
Свойство $ H происходит от реализации javascriptObject#hashcode () (в com.google.gwt.cire.client.impl.impl#gethashcode (Object)).
В вашем случае это связано с тем, что AbstractItAbleCell поддерживает карту клавиш значения для их «просмотра данных», а ваше использование (я думаю) реализации по умолчанию (SimpleProvideskey), которая непосредственно возвращает элемент.
Таким образом, при рендеринге editTextCell вызывает getViewData, который просматривает ключ на карте (и, следовательно, нуждается в хэшкоде ключа, отсюда и призыв к хашкоду), а ключ - ваш JSO (отсюда и новое свойство $ H).
Я полагаю, что предоставление реализации DeviceKey (в вас, например, возврат имени свойства) в Cltlatable решит вашу проблему.
Другие советы
Я сомневаюсь, что CellTable может ощутить от редактирования ваших JSONS. Проверьте эти наложения в Firebug/Chrome_developer_tools/... если они в порядке, то, скорее всего, ошибка в этой строке:
GWT.log(new JSONObject(contact).toString());
Есть как минимум две проблемы для JSONObject.toString
: Передача списка в/из JSNI работает в веб -режиме, но не сбои в размещенном режиме & tostring () и jsni.
Во втором выпуске есть комментарий Согласно которому вы можете попробовать:
GWT.log( (String) new JSONObject(contact) );