【问题标题】:applet is not binded corectly to model小程序未正确绑定到模型
【发布时间】:2014-02-27 09:42:28
【问题描述】:

我对 zk 应用程序有很大(对我来说)问题。我想将模型绑定到视图,但它不起作用。当我尝试访问模型中的小程序时,我收到错误 java.lang.NullPointer

//index.zul
<?page title="Auto Generated index.zul"?>
<window id="mainWindow" title="edycja dokumentow" border="normal" 
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('controller.EditDocsController')">
  <vbox>
    <listbox id="modelList" height="160px" model="@bind(vm.modelList)">
        <listhead>
            <listheader label="id" />
            <listheader label="open" />
        </listhead>
        <template name="model">
            <listitem>
                <listcell label="@bind(each)" />
                <listcell >
                    <button label="otworz"  onClick="@command('open',id=each)"/>                
                </listcell>
            </listitem>
        </template>         
    </listbox>      
     <applet  code="applet.EditFileApplet" codebase="applet" archive="EditApplet.jar" width="100px" height="100px" model="@save(vm.editApplet) before='open'"/>
     <!--<applet  code="applet.EditFileApplet" codebase="applet" archive="EditApplet.jar" width="100px" height="100px" model="@bind(vm.editApplet)'"/>  
          // I have tried these two version separetly   
  </vbox>
</window>

EditDocsController.java

public class EditDocsController {
  private DocsDAO docksDAO = new DocsDAO();

  private List<Integer> modelList;
  private Applet editApplet;

  public Applet getEditApplet()                         {       return editApplet;  }
  public void setEditApplet(Applet editApplet)      {       this.editApplet = editApplet;   }   
  public List<Integer> getModelList()                   {       return modelList;   }
  public void setModelList(List<Integer> modelList)     {       this.modelList = modelList; }


  @AfterCompose
  public void loadDock(){
    modelList = docksDAO.getData();
  /*    editApplet = new Applet();
    editApplet.setCode("applet.EditFileApplet");
    editApplet.setCodebase("applet");
    editApplet.setArchive("EditApplet.jar");*/
  }

  @Command
  public void open(@BindingParam("id") Integer id){
    editApplet.getArchive();
    editApplet.invoke("open", new String[]{id.toString(),"user jakiś tam"} );   
  }
}

提前致谢, 如果您知道如何修复它,请与我分享


这里是所有堆栈跟踪https://docs.google.com/document/d/1YZs7xgzxbOGo70sPogUdNn5IbwWGcq2YU1GRszEtdNk/edit?usp=sharing

这是它的一部分,对我来说它是最有价值的

lut 28, 2014 1:19:56 PM org.zkoss.bind.impl.ParamCall call
SEVERE: 
   java.lang.NullPointerException
    at controller.EditDocsController.open(EditDocsController.java:51) // the line editApplet.getArchive()
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

lut 28, 2014 1:19:56 PM org.zkoss.bind.impl.BinderImpl$CommandEventListener onEvent
SEVERE: null
  java.lang.NullPointerException
    at controller.EditDocsController.open(EditDocsController.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

lut 28, 2014 1:19:56 PM org.zkoss.zk.ui.impl.UiEngineImpl handleError
SEVERE: 
  java.lang.NullPointerException
    at controller.EditDocsController.open(EditDocsController.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

lut 28, 2014 1:21:21 PM org.zkoss.bind.impl.BinderImpl addPropertySaveBindings0
 WARNING: component <Applet xLDQ7#myEditApplet> doesn't has event to save attribute  model at       [file:/C:/Users/bbur/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/RPO/index.zul, line:30]

我已经对代码进行了一些更改以应对问题,但仍然存在问题。我用它来初始化小程序

  <applet id="myEditApplet" code="applet.EditFileApplet" codebase="applet" archive="EditApplet.jar" width="30px" height="30px" style="border: 1px"  />

将按钮定义更改为

  <button label="otworz" onClick='myEditApplet.invoke("openDoc","1234")'/>

我删除了从 EditDocsController 中打开的方法

当我单击“otworz”按钮时,出现错误“无法调用小程序的方法:openDoc 未定义”尽管该方法存在于小程序类 (public void openDoc(String idDoc)) 中。最烦人的是,当我调用 'myEditApplet.invoke("init")' 时,一切都很好

【问题讨论】:

  • 请显示异常的完整堆栈跟踪。
  • 请不要发布附加信息作为答案。你可以而且应该编辑你的问题来做到这一点。

标签: java data-binding nullpointerexception applet zk


【解决方案1】:

ZK 中的Applet 组件没有model 属性,因此您不能使用它来保存视图模型中的小程序引用。 (一般model 属性不用于此)

相反,您可以为小程序分配一个 ID,并将该 ID 作为第二个参数传递给 open 命令,如下所示:

index.zul

...
    <button label="otworz"  onClick="@command('open', id=each, applet=editApplet)"/>
...
<applet id="editApplet" code="applet.EditFileApplet" codebase="applet"
        archive="EditApplet.jar" width="100px" height="100px"/>
...

EditDocsController.java

...
@Command
public void open(@BindingParam("id") Integer id, 
                 @BindingParam("applet") Applet applet){
    applet.invoke("open", new String[]{id.toString(),"user jakiś tam"} );   
}

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多