2017-02-07 4 views
0

У меня странная проблема с SimplePager из DataTable в GWT 2.7.0 Я создал в представлении таким образом в DataTable:GWT DataTable с SimplePager заморожен после DataProvider модификации

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

Когда пользователь запускает события и изменить некоторые элементы DataTable я всегда называю dataProvider.flush() и dataProvider.refresh(), но иногда и DataTable нумерации страниц, кажется, не SimplePager меняет свои значения диапазона, но не меняет страницы таблицы, таблица замораживается, и пользователь больше не может изменять страницу. Случается случайным образом, поэтому его трудно исправить.

Некоторые предложения по этому странному поведению?

UPDATE 1: Я понимаю, что ошибка sould быть в setEmails() методе, потому что проблема возникает только тогда, когда я изменить полностью список в dataProvider, надеюсь, что это может ограничить область расследования.

ответ

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 работает нормально.

Смежные вопросы