0

我有一个继承自CellTree. 如果节点没有子元素,则可以打开该节点并显示"no data"标签。

我希望看到没有子节点的节点显示为空。

我就是这样填满树的。我的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);
        }
    }
}
...
4

3 回答 3

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

接下来需要显式传递customCellTreeResourcesCellTree类构造函数。

消息不再显示。

强制:在归档列表之前,即在单击节点之前,应该清理列表( 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);
            }
        }
    });
}
于 2014-11-04T11:47:57.923 回答
0

这就是我删除 DataProvider 中的无数据标签的方式

 //Fetch children
  int size = children.size();
  if (size == 0) {
     updateRowCount(-1, true); //Method called on AsyncDataProvider 
     return;
  }  
于 2014-09-23T15:51:50.410 回答
0

在 中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;
    }
}

在这种情况下,一个部门只有在没有员工的情况下才应该将自己声明为叶子,员工将自己声明为叶子,并且默认为 false。

请注意,value many 也是一个内部 GWT 节点。在此示例中,它可能不一定是DepartmentDtoand EmployeeDto

于 2017-12-14T22:22:56.113 回答