0

我在 GWT 2.7.0 中遇到了一个奇怪的问题,我以这种方式在视图中创建了SimplePager一个:DataTableDataTable

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();
        }


    }

我还为表格行的特定点击事件添加了一些处理程序。处理事件,我需要更新一些行,我可以这样做:

public void updateLock(PecMessage message){
        int i=dataProvider.getList().indexOf(message);
        message.setLockedState(0);
        dataProvider.getList().set(i, message);
        dataProvider.flush();
        dataProvider.refresh();
}

当用户触发事件并修改我总是调用的数据表的某些元素时dataProvider.flush()dataProvider.refresh()但有时,DataTable 分页似乎不再起作用,SimplePager 更改其范围值但不更改表格页面,表格被冻结并且用户无法改变页面了。它是随机发生的,因此很难修复。

关于这种奇怪行为的一些建议?

更新 1:我意识到错误应该在setEmails()方法中,因为只有当我完全修改 中的列表时才会出现问题dataProvider,希望这可以限制调查区域。

4

1 回答 1

0

我已经弄清楚了问题所在。我更好地分析了浏览器控制台,发现了一个与 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似乎可以正常工作。

于 2017-02-13T14:59:42.390 回答