获取选定的ListBox值按钮单击| ZK

时间:2014-01-09 13:04:38

标签: listbox zk zul

我对ZK框架非常陌生,并试图定制一些东西并且已经触及到一点,我不知道如何实现这一点。

我有一个预定义的部分,我需要显示2下拉菜单和一个按钮,需要在按钮点击事件中保留这些下拉值。 这是它在Spring文件中定义的方式

<bean id="mybean" parent="parentBean" class="WidgetRenderer">
   <property name="detailRenderer">
            <bean class="DetailsListRenderer" parent="abstractWidgetDetailRenderer"/>
   </property>
</bean>

此处mybean用于显示主要部分,我正在使用此bean添加下拉按钮,同时将按钮添加到detailRenderer

保存按钮绑定到onClick事件,但我不确定如何从自定义下拉列表中获取值? 我知道将DropdownonClick事件绑定在一起,但它们必须属于同一类。

任何人都可以建议我如何获取那些下拉的值。我正在创建下面的代码

Listbox listbox = new Listbox();
listbox.appendItem("item1", "item1");
listbox.appendItem("item2", "item2");

这是我在另一个班级的按钮代码

protected void createUpdateStatusButton(Widget widget,Div container)
 {
   Button button = new Button(LabelUtils.getLabel(widget, buttonLabelName, new Object[0]));
   button.setParent(container);
    button.addEventListener("onClick", new EventListener()
    {
      public void onEvent(Event event)throws Exception
       {
             MyClass.this.handleSaveStatusEvent(widget, event);
          }
    });
  }

2 个答案:

答案 0 :(得分:2)

您可能希望收听onSelect(我更喜欢使用Events.ON_SELECT而不是写字符串),这更适合Listbox选择更改的时间。

无论哪种方式,关键是要将Event传递给EventListener的所需信息,而不是回到Listbox本身。基本Event通常会在getTargetgetData上提供有用的信息,但使用更具体的事件(本例中为SelectEvent)可以让您访问更相关的信息。

button.addEventListener(Events.ON_SELECT, new EventListener<SelectEvent<Listitem, MyDataObject>() {
    public void onEvent(SelectEvent<Listitem, MyDataObject> event) {
        // Now you can access the details of the selection event..
        List<Listitem> selectedItems = event.getSelectedItems();
        List<MyDataObject> selectedObjects = event.getSelectedObjects();
    }
});

您可以在Component Reference documentation中找到可用于不同ZK小部件的事件。

答案 1 :(得分:1)

如果我理解了这个问题(我不认为我在之前的回复中做过),您希望在用户点击按钮时从页面收集信息(例如:Listbox选择状态)。您的问题是您使用不同的类来编写页面,因此在单击按钮时无法访问各种ZK Component

(忽略多分类问题一分钟)
从较高的层面来看,ZK社区有两个阵营。较新的MVVM方法表明,当用户与前端交互时,视图应将相关状态推送到后端。这样,后端永远不需要询问客户端状态,并且当单击该按钮时,值/状态在服务器上就可以使用了。

另一个阵营将客户端绑定到服务器,以便后端始终可以访问客户端Component,并且当单击该按钮时,可以通过与组件交互轻松检索值/状态。

另一种方法更像是我在之前的回答中谈到的,不是将后端绑定到客户端,而是尽可能地依赖事件数据。我赞成这种方法就足够了。

现在,您可以自由选择您喜欢的方法,ZK有很多关于如何在这些阵营中工作的文档。接下来的问题是客户端状态存储在服务器上(由MVVM中的客户端推送到MVC中还是绑定在那里)。我不认为这是一个可以在这里解决的问题,这是一个软件工程挑战。我个人建议你采用标准的ZK模式,以便不与框架结合。如果您真的想要走自己的路线,可以像以下一样抓住对Listbox的引用:

public class Foo {

    public static final String LISTBOX_ID = "myListbox";

    public void renderListbox(Component parent, MyItem items) {
        Listbox listbox = new Listbox();
        listbox.setId(LISTBOX_ID);
        listbox.setParent(parent);
        for (MyItem item : items) {
            listbox.appendItem(item.getName(), item);
        }
    }

}

public class Bar {

    @Listen(Events.ON_CLICK + " = #saveButton")
    public void saveButtonClicked(Event event) {
        Component saveButton = event.getTarget();
        Listbox listbox = (Listbox) saveButton.getFellow(Foo.LISTBOX_ID);
        Set<Listitem> selection = listbox.getSelectedItems();
        // do something
}