修改 DataProvider 后,带有 SimplePager 的 GWT DataTable 被冻结
GWT DataTable with SimplePager freezed after DataProvider modification
我在 GWT 2.7.0 中遇到 SimplePager
of DataTable
的奇怪问题
我用这种方式在视图中创建了一个 DataTable
:
private void initCellTable() {
pecMessageCellTable = new CellTable<>();
dataProvider = new ListDataProvider<>();
dataProvider.addDataDisplay(pecMessageCellTable);
pecMessageCellTable.setPageSize(DEFAULT_PAGE_SIZE);
pecMessageCellTable.setVisibleRange(0,DEFAULT_PAGE_SIZE);
pecMessageCellTable.setWidth("100%", true);
pecMessageCellTable.setAutoHeaderRefreshDisabled(true);
pecMessageCellTable.setAutoFooterRefreshDisabled(true);
pecMessageCellTable.setEmptyTableWidget(new NoResults());
//sort handler
ColumnSortEvent.ListHandler<PecMessage> sortHandler = new ColumnSortEvent.ListHandler<>(dataProvider.getList());
pecMessageCellTable.addColumnSortHandler(sortHandler);
SimplePager.Resources pagerResources = GWT.create(SimplePager.Resources.class);
pager = new SimplePager(SimplePager.TextLocation.CENTER, pagerResources, false, 0, true);
pager.setDisplay(pecMessageCellTable);
pager.setVisible(false);
//from
TextColumn<PecMessage> fromColumn = new TextColumn<PecMessage>() {
@Override
public String getValue(PecMessage message) {
return message.getFrom().iterator().next();
}
};
fromColumn.setSortable(true);
pecMessageCellTable.addColumn(fromColumn, "Mittente");
pecMessageCellTable.setColumnWidth(fromColumn, 18, Unit.PCT);
//subject
TextColumn<PecMessage> subjColumn = new TextColumn<PecMessage>() {
@Override
public String getValue(PecMessage message) {
return message.getSubject();
}
};
subjColumn.setSortable(true);
pecMessageCellTable.addColumn(subjColumn, "Oggetto");
//received date
TextColumn<PecMessage> sentDateColumn = new TextColumn<PecMessage>() {
@Override
public String getValue(PecMessage message) {
return DateTimeFormat.getFormat("dd/MM/yy hh:mm:ss").format(message.getReceived());
}
};
sentDateColumn.setSortable(true);
pecMessageCellTable.addColumn(sentDateColumn, "Data Ricezione");
pecMessageCellTable.setColumnWidth(sentDateColumn, 12, Unit.PCT);
ImageCell imageCell=new ImageCell();
Column<PecMessage,String> iconColumn = new Column<PecMessage, String>(imageCell){
@Override
public String getValue(PecMessage object) {
return object.getImageUrl(object);
}
};
pecMessageCellTable.addColumn(iconColumn,"Lock");
pecMessageCellTable.setColumnWidth(iconColumn, 46, Unit.PX);
//delete Message
ButtonCell buttonCell = new ButtonCell(ButtonType.DANGER, IconType.TRASH);
Column<PecMessage, String> deleteBtn = new Column<PecMessage, String>(buttonCell) {
@Override
public String getValue(PecMessage object) {
return "Elimina";
}
};
pecMessageCellTable.addColumn(deleteBtn, "Elimina");
pecMessageCellTable.setColumnWidth(deleteBtn, 9, Unit.PCT);
pecMessageCellTable.setVisible(false);
}
我稍后在代码中填充了数据提供程序,在寻呼机上做了一些操作:
public void setEmails(Map<String,PecMessage> emails) {
try {
this.emails = emails;
if(pager.isVisible())
pager.startLoading();
if(emails!=null) {
pecMessageCellTable.setVisibleRangeAndClearData(new Range(0, DEFAULT_PAGE_SIZE), true);
List<PecMessage> list=new ArrayList<PecMessage>(emails.values());
dataProvider.setList(list);
pecMessageCellTable.setRowCount(list.size());
}
if(!pecMessageCellTable.isVisible())
pecMessageCellTable.setVisible(true);
loginFildSet.setVisible(false);
loginBtn.setVisible(false);
logoutBtn.setVisible(true);
refreshBtn.setVisible(true);
if(!pager.isVisible())
pager.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
我还为 table 的行的特定点击事件添加了一些处理程序。处理事件,我需要更新一些行,我可以这样做:
public void updateLock(PecMessage message){
int i=dataProvider.getList().indexOf(message);
message.setLockedState(0);
dataProvider.getList().set(i, message);
dataProvider.flush();
dataProvider.refresh();
}
当用户触发事件并修改数据的某些元素时table 我总是调用 dataProvider.flush()
和 dataProvider.refresh()
但有时,DataTable 分页似乎不再起作用,SimplePager 发生变化它的范围值但不更改 table 页,table 被冻结并且用户无法再更改页面。
它是随机发生的,所以很难修复。
对这种奇怪的行为有什么建议吗?
更新 1:
我意识到错误应该在 setEmails()
方法中,因为只有当我完全修改 dataProvider
中的列表时才会出现问题,希望这可以限制调查区域。
我找到问题了。
我更好地分析了浏览器控制台,发现了一个与 java 类:
有关的特定错误
Mon Feb 13 14:59:29 GMT+100 2017 com.google.gwt.logging.client.LogConfiguration
SEVERE: (TypeError) : Cannot read property 'eQ' of nullcom.google.gwt.core.client.JavaScriptException: (TypeError) : Cannot read property 'eQ' of null
at Unknown.ER(Exceptions.java:36)
at Unknown.Nk(PecMessage.java:322)
at Unknown.X(Object.java:66)
at Unknown.VY(HasDataPresenter.java:1017)
at Unknown.aZ(HasDataPresenter.java:1139)
at Unknown.qZ(HasDataPresenter.java:984)
at Unknown.jt(SchedulerImpl.java:185)
at Unknown._s(SchedulerImpl.java:279)
at Unknown.Qs(Impl.java:323)
at Unknown.Ps(Impl.java:314)
at Unknown.anonymous(Impl.java:72)
在PecMessage.java:322
我发现equals()
方法不是最新的并且没有控制空值。对象中添加了一些新属性,修改了其他属性,因此我更新了 equals()
和 hashCode()
方法,现在 CellTable
似乎可以正常工作。
我在 GWT 2.7.0 中遇到 SimplePager
of DataTable
的奇怪问题
我用这种方式在视图中创建了一个 DataTable
:
private void initCellTable() {
pecMessageCellTable = new CellTable<>();
dataProvider = new ListDataProvider<>();
dataProvider.addDataDisplay(pecMessageCellTable);
pecMessageCellTable.setPageSize(DEFAULT_PAGE_SIZE);
pecMessageCellTable.setVisibleRange(0,DEFAULT_PAGE_SIZE);
pecMessageCellTable.setWidth("100%", true);
pecMessageCellTable.setAutoHeaderRefreshDisabled(true);
pecMessageCellTable.setAutoFooterRefreshDisabled(true);
pecMessageCellTable.setEmptyTableWidget(new NoResults());
//sort handler
ColumnSortEvent.ListHandler<PecMessage> sortHandler = new ColumnSortEvent.ListHandler<>(dataProvider.getList());
pecMessageCellTable.addColumnSortHandler(sortHandler);
SimplePager.Resources pagerResources = GWT.create(SimplePager.Resources.class);
pager = new SimplePager(SimplePager.TextLocation.CENTER, pagerResources, false, 0, true);
pager.setDisplay(pecMessageCellTable);
pager.setVisible(false);
//from
TextColumn<PecMessage> fromColumn = new TextColumn<PecMessage>() {
@Override
public String getValue(PecMessage message) {
return message.getFrom().iterator().next();
}
};
fromColumn.setSortable(true);
pecMessageCellTable.addColumn(fromColumn, "Mittente");
pecMessageCellTable.setColumnWidth(fromColumn, 18, Unit.PCT);
//subject
TextColumn<PecMessage> subjColumn = new TextColumn<PecMessage>() {
@Override
public String getValue(PecMessage message) {
return message.getSubject();
}
};
subjColumn.setSortable(true);
pecMessageCellTable.addColumn(subjColumn, "Oggetto");
//received date
TextColumn<PecMessage> sentDateColumn = new TextColumn<PecMessage>() {
@Override
public String getValue(PecMessage message) {
return DateTimeFormat.getFormat("dd/MM/yy hh:mm:ss").format(message.getReceived());
}
};
sentDateColumn.setSortable(true);
pecMessageCellTable.addColumn(sentDateColumn, "Data Ricezione");
pecMessageCellTable.setColumnWidth(sentDateColumn, 12, Unit.PCT);
ImageCell imageCell=new ImageCell();
Column<PecMessage,String> iconColumn = new Column<PecMessage, String>(imageCell){
@Override
public String getValue(PecMessage object) {
return object.getImageUrl(object);
}
};
pecMessageCellTable.addColumn(iconColumn,"Lock");
pecMessageCellTable.setColumnWidth(iconColumn, 46, Unit.PX);
//delete Message
ButtonCell buttonCell = new ButtonCell(ButtonType.DANGER, IconType.TRASH);
Column<PecMessage, String> deleteBtn = new Column<PecMessage, String>(buttonCell) {
@Override
public String getValue(PecMessage object) {
return "Elimina";
}
};
pecMessageCellTable.addColumn(deleteBtn, "Elimina");
pecMessageCellTable.setColumnWidth(deleteBtn, 9, Unit.PCT);
pecMessageCellTable.setVisible(false);
}
我稍后在代码中填充了数据提供程序,在寻呼机上做了一些操作:
public void setEmails(Map<String,PecMessage> emails) {
try {
this.emails = emails;
if(pager.isVisible())
pager.startLoading();
if(emails!=null) {
pecMessageCellTable.setVisibleRangeAndClearData(new Range(0, DEFAULT_PAGE_SIZE), true);
List<PecMessage> list=new ArrayList<PecMessage>(emails.values());
dataProvider.setList(list);
pecMessageCellTable.setRowCount(list.size());
}
if(!pecMessageCellTable.isVisible())
pecMessageCellTable.setVisible(true);
loginFildSet.setVisible(false);
loginBtn.setVisible(false);
logoutBtn.setVisible(true);
refreshBtn.setVisible(true);
if(!pager.isVisible())
pager.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
我还为 table 的行的特定点击事件添加了一些处理程序。处理事件,我需要更新一些行,我可以这样做:
public void updateLock(PecMessage message){
int i=dataProvider.getList().indexOf(message);
message.setLockedState(0);
dataProvider.getList().set(i, message);
dataProvider.flush();
dataProvider.refresh();
}
当用户触发事件并修改数据的某些元素时table 我总是调用 dataProvider.flush()
和 dataProvider.refresh()
但有时,DataTable 分页似乎不再起作用,SimplePager 发生变化它的范围值但不更改 table 页,table 被冻结并且用户无法再更改页面。
它是随机发生的,所以很难修复。
对这种奇怪的行为有什么建议吗?
更新 1:
我意识到错误应该在 setEmails()
方法中,因为只有当我完全修改 dataProvider
中的列表时才会出现问题,希望这可以限制调查区域。
我找到问题了。 我更好地分析了浏览器控制台,发现了一个与 java 类:
有关的特定错误Mon Feb 13 14:59:29 GMT+100 2017 com.google.gwt.logging.client.LogConfiguration
SEVERE: (TypeError) : Cannot read property 'eQ' of nullcom.google.gwt.core.client.JavaScriptException: (TypeError) : Cannot read property 'eQ' of null
at Unknown.ER(Exceptions.java:36)
at Unknown.Nk(PecMessage.java:322)
at Unknown.X(Object.java:66)
at Unknown.VY(HasDataPresenter.java:1017)
at Unknown.aZ(HasDataPresenter.java:1139)
at Unknown.qZ(HasDataPresenter.java:984)
at Unknown.jt(SchedulerImpl.java:185)
at Unknown._s(SchedulerImpl.java:279)
at Unknown.Qs(Impl.java:323)
at Unknown.Ps(Impl.java:314)
at Unknown.anonymous(Impl.java:72)
在PecMessage.java:322
我发现equals()
方法不是最新的并且没有控制空值。对象中添加了一些新属性,修改了其他属性,因此我更新了 equals()
和 hashCode()
方法,现在 CellTable
似乎可以正常工作。