Gwt 如何更改使用uibinder getting error创建的AbstractCell中的文本无法将属性“textContent”设置为null

Gwt 如何更改使用uibinder getting error创建的AbstractCell中的文本无法将属性“textContent”设置为null,gwt,uibinder,celllist,Gwt,Uibinder,Celllist,我使用uibinder和UiRenderer创建了一个抽象单元。我的数据源是一个列表的列表。比如说汽车列表,每辆车都有一个模型列表。我正在将单元格添加到单元格列表中。 每个单元格就像一张卡片,topIm上有向前和向后按钮,使用箭头图像,并使用uihandler和卡片显示模型的属性处理单击事件。单击时的向前和向后图像分别显示下一个和上一个模型。 单击图像时,我无法更改模型名称和其他div public class NewCompCell extends AbstractCell<String

我使用uibinder和UiRenderer创建了一个抽象单元。我的数据源是一个列表的列表。比如说汽车列表,每辆车都有一个模型列表。我正在将单元格添加到单元格列表中。 每个单元格就像一张卡片,topIm上有向前和向后按钮,使用箭头图像,并使用uihandler和卡片显示模型的属性处理单击事件。单击时的向前和向后图像分别显示下一个和上一个模型。 单击图像时,我无法更改模型名称和其他div

public class NewCompCell extends AbstractCell<String> {

@UiField
String model_name;

@UiField
DivElement model;

static interface Images extends ClientBundle {
    @Source("LeftArrow.png")
    ImageResource LeftArrow();

    @Source("rightArrow.png")
    ImageResource rightArrow();
}

private Images images = GWT.create(Images.class);
private Renderer uiRenderer = GWT.create(Renderer.class);

public static interface Renderer extends UiRenderer {

    void render(SafeHtmlBuilder sb, String value, String model_name,
            SafeHtml leftArrow, SafeHtml rightArrow);

    void onBrowserEvent(NewCompCell o, NativeEvent e, Element p, String n);

}

public NewCompCell() {

    super(BrowserEvents.CLICK);

}

@Override
public void onBrowserEvent(Context context, Element parent, String value,
        NativeEvent event,

        ValueUpdater<String> valueUpdater) {

    uiRenderer.onBrowserEvent(this, event, parent, value);

}

@Override
public void render(com.google.gwt.cell.client.Cell.Context context,
        String value, SafeHtmlBuilder sb) {

    uiRenderer
            .render(sb, value, value,
                    AbstractImagePrototype.create(images.LeftArrow())
                            .getSafeHtml(),
                    AbstractImagePrototype.create(images.rightArrow())
                            .getSafeHtml());
}

@UiHandler({ "right" })
void onRightArrowClicked(ClickEvent event, Element parent, String string) {

    model.setInnerText("next model");

}

@UiHandler({ "left" })
void onLeftArrowClicked(ClickEvent event, Element parent, String string) {

    model.setInnerText("previous model");

}

我不知道如何访问模型div中的文本。随后,当单击图像时,会有更多div的值/文本发生变化

public class NewCompCell extends AbstractCell<String> {

@UiField
String model_name;

@UiField
DivElement model;

static interface Images extends ClientBundle {
    @Source("LeftArrow.png")
    ImageResource LeftArrow();

    @Source("rightArrow.png")
    ImageResource rightArrow();
}

private Images images = GWT.create(Images.class);
private Renderer uiRenderer = GWT.create(Renderer.class);

public static interface Renderer extends UiRenderer {

    void render(SafeHtmlBuilder sb, String value, String model_name,
            SafeHtml leftArrow, SafeHtml rightArrow);

    void onBrowserEvent(NewCompCell o, NativeEvent e, Element p, String n);

}

public NewCompCell() {

    super(BrowserEvents.CLICK);

}

@Override
public void onBrowserEvent(Context context, Element parent, String value,
        NativeEvent event,

        ValueUpdater<String> valueUpdater) {

    uiRenderer.onBrowserEvent(this, event, parent, value);

}

@Override
public void render(com.google.gwt.cell.client.Cell.Context context,
        String value, SafeHtmlBuilder sb) {

    uiRenderer
            .render(sb, value, value,
                    AbstractImagePrototype.create(images.LeftArrow())
                            .getSafeHtml(),
                    AbstractImagePrototype.create(images.rightArrow())
                            .getSafeHtml());
}

@UiHandler({ "right" })
void onRightArrowClicked(ClickEvent event, Element parent, String string) {

    model.setInnerText("next model");

}

@UiHandler({ "left" })
void onLeftArrowClicked(ClickEvent event, Element parent, String string) {

    model.setInnerText("previous model");

}
}

当我点击图片时,我得到了下面的错误

com.google.gwt.core.client.JavaScriptException:TypeError@com.google.gwt.core.client.impl.impl::applyLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;[JavaScript object36、JavaScript object2、JavaScript object204]:无法将属性“textContent”设置为null 位于com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascriptBrowserChannelServer.java:249 在com.google.gwt.dev.shell.modulespaceophm.doinvokeModulespaceophm.java:136 在com.google.gwt.dev.shell.ModuleSpace.invokeNativeModuleSpace.java:576 位于com.google.gwt.dev.shell.ModuleSpace.invokeNativeObjectModuleSpace.java:284 位于com.google.gwt.dev.shell.JavaScriptHost.InvokenativeObject JavaScriptHost.java:91 位于com.google.gwt.core.client.impl.impl.applyImpl.java 位于com.google.gwt.core.client.impl.impl.entry0Impl.java:356 位于sun.reflect.GeneratedMethodAccessor52.invokeUnknown源 在sun.reflect.DelegatingMethodAccessorImpl.invokeUnknown源 位于java.lang.reflect.Method.invokeUnknown源 位于com.google.gwt.dev.shell.MethodAdapter.invokeMethodAdaptor.java:103 在com.google.gwt.dev.shell.MethodDispatch.invokeMethodDispatch.java:71 位于com.google.gwt.dev.shell.OophmSessionHandler.invokeophmsessionhandler.java:172 位于com.google.gwt.dev.shell.BrowserChannelServer.ReactToMessageBrowserChannelServer.java:293 位于com.google.gwt.dev.shell.BrowserChannelServer.processConnectionBrowserChannelServer.java:547 位于com.google.gwt.dev.shell.BrowserChannelServer.runBrowserChannelServer.java:364
在java.lang.Thread.runUnknown Source

中,实现这些需求的一个更简单的方法是创建一个单元格,而不是自定义单元格。此自定义小部件(例如CarCard)可能由两个图标、任意数量的标签等组成。它还具有设置每个标签文本的方法、左箭头和右箭头的单击处理程序等。您可以使用UiBinder创建此自定义小部件

然后,在加载汽车列表时,您可以执行以下操作:

for (Car car : cars) {
    CarCard carCard = new CarCard();
    carCard.setCar(car);
    myContainerPanel.add(carCard);
}

如果需要渲染数据并根据单元格外部或整个单元格发生的事件对其进行更新(例如,单击单元格本身),则自定义单元格更为有用。当您希望在单元格中具有类似小部件的行为时,这不是一个好选项。

可以通过在UiBinder中为该字段定义一个getter来访问UiBinder中定义的uiField。 我得到错误是因为我试图直接访问uifield

public static interface Renderer extends UiRenderer {

    void render(SafeHtmlBuilder sb, String value, String model_name,
            SafeHtml leftArrow, SafeHtml rightArrow);
    DivElement getModel(Element parent); //make sure the uifield name matches the getter    

    void onBrowserEvent(NewCompCell o, NativeEvent e, Element p, String n);

}
可以访问此字段

    @UiHandler({ "right" })
void onRightArrowClicked(ClickEvent event, Element parent, String string) {

    uiRenderer.getModel(parent).setInnerText("next model");

}

有可能吗?我可以不用活页夹吗?有什么建议吗?实际上我有两个视图使用同一个列表提供程序,这就是为什么使用cellLsit。我做了一些更改,请参见上面的代码。虽然“无法将属性“textContent”设置为null”,但我收到了一个错误。您可以使用任何列表,仍然可以使用自定义小部件构建视图。