我是一个GWT菜鸟,我很欣赏在这个方向上正确的推动。
使用GWT 2.4
我无法弄清楚如何在我的EntryPoint类中监听一个添加了CellTable的事件。 CellTable有一个自定义的AbstractCell,它使用超链接呈现String。 Cell处理点击事件。
我的EntryPoint类如何处理事件以便它可以执行某些操作(比如隐藏CellTable并显示其他一些小部件)?
我能够成功处理Cell和CellTable中的事件,但无法弄清楚如何获取父窗口小部件(EntryPoint类来处理它)。
EntryPoint类:
public class Tags_GWT implements EntryPoint {
private final TagGwtServiceAsync tagService = GWT.create(TagGwtService.class);
final TagCellTable tagCellTable = new TagCellTable();
public void onModuleLoad() {
RootPanel.get("tagCellTable").add(tagCellTable);
// load the table with data
tagService.getTagsAsList(new AsyncCallback<List<TagDto>>() {
public void onFailure(Throwable caught) {
GWT.log("Error loading data");
}
public void onSuccess(List<TagDto> tags) {
tagCellTable.setInput(tags);
}
});
CellTable类:
public class TagCellTable extends CellTable<TagDto>{
code removed for simplicity
// Add a field updater to be notified when the user enters a new name.
nameColumn.setFieldUpdater(new FieldUpdater<TagDto, String>() {
@Override
public void update(int index, TagDto object, String value) {
// Inform the user of the change.
Window.alert("TagCellTable.update is executing for: '" + value + "'");
}
});
AbstractCell类:
public class LinkCell extends AbstractCell<String>{
code omitted for simplicity
@Override
public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event, ValueUpdater<String> valueUpdater) {
super.onBrowserEvent(context, parent, value, event, valueUpdater);
if ("click".equals(event.getType())) {
// Ignore clicks that occur outside of the outermost element.
EventTarget eventTarget = event.getEventTarget();
if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
doAction(value, valueUpdater);
}
}
}
@Override
protected void onEnterKeyDown(Context context, Element parent, String value, NativeEvent event, ValueUpdater<String> valueUpdater) {
doAction(value, valueUpdater);
}
private void doAction(String value, ValueUpdater<String> valueUpdater) {
Window.alert("LinkCell.doAction is executing for: ' " + value + "'");
if (valueUpdater != null) {
valueUpdater.update(value);
}
}
答案 0 :(得分:1)
我认为您必须向LinkCell
提供EventBus
对象的引用。然后,在doAction
中,您可以在Event
上触发一些EventBus
。您的入口点模块可以在相同的EventBus
上收听相关事件,并从那里做出响应。
没有一种好方法可以从已经内置的外部代码中挂入单元格,因为CellTable实际上并不是由小部件组成的。永远不会激活正常的窗口小部件事件层次结构,因此无需添加任何侦听器 - 您必须创建自己的EventBus。