GWT单元树右键单击选择

时间:2013-09-03 19:03:28

标签: gwt tree cell

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

2 个答案:

答案 0 :(得分:0)

解决方案包括两个步骤:

1) 将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名称,并将其与您使用该模型设置的项目名称进行比较。

答案 1 :(得分: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);
    }
}