2014-09-23 2 views
0

У меня есть виджет, который наследуется от CellTree. Если узел не имеет дочерних элементов, этот узел может быть открыт и отображается метка "no data".GWT-2.4.0, CellTree: удаление метки «без данных» из пустых узлов

enter image description here

Я хотел бы видеть узлы без ребенка отображается как пустой.

Вот как я заполняю дерево. Мой DictionaryTreeDataProvider класс (соответствующая часть):

public class DictionaryTreeDataProvider extends ListDataProvider<MValue> { 
    private final DictionariesServiceAsync service = GWT.create(DictionariesService.class); 

    ...  

    @Override 
    public void onRangeChanged(HasData<MValue> result) { 
     service.queryDictionaryValues(range, query, new AsyncCallback<SubsetResult<MValue>>() { 
      @Override 
      public void onFailure(Throwable t) { 
      } 

      @Override 
      public void onSuccess(SubsetResult<MValue> result) { 
       getList().clear(); 
       for (MValue value : result.items) { 
        getList().add(value); 
       } 
      } 
     }); 
    } 
} 

На стороне сервера я делаю EJB вызов, который заполняет SubsetResult. Я обнаружил, что эта проблема исправлена ​​в версии GWT-2.5.0-rc2 (см. https://groups.google.com/forum/#!topic/google-web-toolkit/d-rFUmyHTT4).

Кажется, что нужно сделать обходной путь ..


Теперь все в порядке, спасибо @moutellou. Я сделал, как он предложил:

... 
@Override 
public void onSuccess(SubsetResult<MValue> result) { 
    if (result.length == 0) { 
     updateRowCount(-1, true); 
     return; 
    } else { 
     for (MValue value : result.items) { 
      // some checks here 
      getList().add(value); 
     } 
    } 
} 
... 

enter image description here

+0

Как вы извлекаете данные. Вы используете AsyncDataProvider? – outellou

+0

Спасибо за ваш комментарий. Да, я использую его, я обновил свой вопрос, спасибо. –

ответ

1

Это, как я удалил ярлык не данных в моем DataProvider

//Fetch children 
    int size = children.size(); 
    if (size == 0) { 
    updateRowCount(-1, true); //Method called on AsyncDataProvider 
    return; 
    } 
+0

Благодарим вас за ответ. Теперь я постараюсь сделать это. –

+0

Извините, но ваше решение не работает .. –

+0

Извините еще раз: -) Я не понял, что вы предложили. Теперь все в порядке. Спасибо! –

1

Некоторые альтернативные решения. Может быть определен интерфейс, который расширяет интерфейс CellTree.Resources. В этом интерфейсе должен быть указан путь к CSS, который переопределяет желаемый стиль.

Интерфейс CellTree.Resources:

public class CellTree extends AbstractCellTree implements HasAnimation, 
    Focusable { 
    ... 
    /** 
    * A ClientBundle that provides images for this widget. 
    */ 
    public interface Resources extends ClientBundle { 

    /** 
    * An image indicating a closed branch. 
    */ 
    @ImageOptions(flipRtl = true) 
    @Source("cellTreeClosedArrow.png") 
    ImageResource cellTreeClosedItem(); 

    /** 
    * An image indicating that a node is loading. 
    */ 
    @ImageOptions(flipRtl = true) 
    ImageResource cellTreeLoading(); 

    /** 
    * An image indicating an open branch. 
    */ 
    @ImageOptions(flipRtl = true) 
    @Source("cellTreeOpenArrow.png") 
    ImageResource cellTreeOpenItem(); 

    /** 
    * The background used for selected items. 
    */ 
    @ImageOptions(repeatStyle = RepeatStyle.Horizontal, flipRtl = true) 
    ImageResource cellTreeSelectedBackground(); 

    /** 
    * The styles used in this widget. 
    */ 
    @Source(Style.DEFAULT_CSS) 
    Style cellTreeStyle(); 
    } 
... 
} 

Интерфейс CustomCellTreeResources, основанный на CellTree.Resources:

import com.google.gwt.resources.client.ClientBundle; 
import com.google.gwt.user.cellview.client.CellTree; 

public interface CustomCellTreeResources extends CellTree.Resources { 
    static final String STYLE_PATH = "components/common/client/static/custom-cell-tree.css"; 

    @Override 
    @ClientBundle.Source({CellTree.Style.DEFAULT_CSS, STYLE_PATH}) 
    CellTree.Style cellTreeStyle(); 
} 

Перекрытие правило:

.cellTreeEmptyMessage { 
    display: none; 
} 

Создание экземпляра:

private final static CellTree.Resources customCellTreeResources = 
    GWT.create(CustomCellTreeResources.class); 

И далее нужно явно передать customCellTreeResources в конструктор класса CellTree.

Сообщение больше не отображается.

enter image description here

Обязательно: до подачи списка, то есть, прежде чем нажать на узел, список должен быть очищен (getList().clear();):

@Override 
public void onRangeChanged(HasData<MValue> result) { 
    service.queryDictionaryValues(range, query, 
      new AsyncCallback<SubsetResult<MValue>>() { 
     @Override 
     public void onFailure(Throwable t) {} 
     @Override 
     public void onSuccess(SubsetResult<MValue> result) { 
      getList().clear(); 
      for (MValue value : result.items) { 
       getList().add(value); 
      } 
     } 
    }); 
} 
1

В TreeViewModel, убедитесь, что метод isLeaf возвращает true, если значение аргумента не имеет детей.Пример:

@Override 
public boolean isLeaf(Object value) { 
    if (value instanceof DepartmentDto) { 
     DepartmentDto department = (DepartmentDto) value; 
     return department.getEmployees().isEmpty(); 
    } else if (value instanceof EmployeeDto) { 
     return true; 
    } else { 
     return false; 
    } 
} 

В этом случае отдел должен заявить о себе, как лист, только если он не имеет работников, работник заявит о себе, как лист, и по умолчанию в ложь.

Обратите внимание, что значение many также является внутренним узлом GWT. В этом примере это может быть необязательно только DepartmentDto и EmployeeDto.

+0

Большое спасибо за ваш ответ! .. –