0

所以我创建了一个 CellTree,我想要做的是选择接收右键单击的单元格,这样当我打开上下文菜单执行操作时,我就会知道我正在使用哪个单元格。也许我走错了路,我可以覆盖 onBrowserEvent 方法并检测何时有人右键单击树,但我无法确定正在单击哪个单元格,因此我可以手动选择它。有没有人找到解决这个问题的方法?

4

2 回答 2

0

解决方案包括两个步骤:

1)将 a 添加TreeViewModel到您的CellTree. 使用该模型,您可以在树中设置元素的名称。这是API的一个简单实现:

private static class CustomTreeModel implements TreeViewModel {

    /**
     * Get the {@link NodeInfo} that provides the children of the specified
     * value.
     */
    public <T> NodeInfo<?> getNodeInfo(T value) {
      /*
       * Create some data in a data provider. Use the parent value as a prefix
       * for the next level.
       */
      ListDataProvider<String> dataProvider = new ListDataProvider<String>();
      for (int i = 0; i < 2; i++) {
        dataProvider.getList().add(value + "." + String.valueOf(i));
      }

      // Return a node info that pairs the data with a cell.
      return new DefaultNodeInfo<String>(dataProvider, new TextCell());
    }

    /**
     * Check if the specified value represents a leaf node. Leaf nodes cannot be
     * opened.
     */
    public boolean isLeaf(Object value) {
      // The maximum length of a value is ten characters.
      return value.toString().length() > 10;
    }
  }

2)当您收到右键单击Event时,获取EventTarget名称并将其与您使用模型设置的该项目的名称进行比较。

于 2013-09-03T23:20:34.927 回答
0

我找到了一个解决方案,我希望这对其他人有帮助,因为我一直在寻找这个。可能有更好的方法,但这是我实现所需功能的方式:

在我在树中使用的单元格中,我对 onbrowserevent 进行了覆盖以捕获鼠标事件并设置选择模型。使用抽象单元,您可以接收您希望它收听的事件,在我的情况下,我选择了鼠标按下。

public class CustomContactCell extends AbstractCell<ContactInfo> {

    private SetSelectionModel<ContactInfo> selectionModel;

    public CustomContactCell(SetSelectionModel<ContactInfo> selectionModel) {
        super("mousedown");
        this.selectionModel = selectionModel;
    }

    @Override
    public void render(Context context, ContactInfo value, SafeHtmlBuilder sb) {
        ...
    }

    @Override
    public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context, Element parent, ContactInfo value, NativeEvent event, ValueUpdater<ContactInfo> valueUpdater) {
        if (event.getButton() == NativeEvent.BUTTON_RIGHT) {
            if (selectionModel != null) {
                selectionModel.clear();
                selectionModel.setSelected(value, true);
            }
        }
        super.onBrowserEvent(context, parent, value, event, valueUpdater);
    }
}
于 2013-09-04T13:49:55.577 回答