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