2014-01-09 34 views
1

我对ZK框架非常陌生,试图自定义一些东西,并且碰到了一个我不确定如何实现的事情。在按钮上获取选定的ListBox值单击| ZK

我有一个预定义的部分,在那里我需要显示2下拉和一个按钮,需要坚持的下拉按钮点击事件值。 这就是它一直在Spring中定义文件

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

这里mybean被用来显示主要部分,我将我的下拉按钮时被添加到detailRenderer使用这个bean。

保存按钮被绑定到onClick事件,但我不知道我怎么可以获取从我的自定义值下拉? 我知道绑定那些DropdownonClick事件,但他们必须在同一类。

任何一个可以建议我如何用我下面的代码

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

创建down下来取那些降就弄伤的值这是在另一个类中我的按钮代码

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

你可能想要听取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小部件可用的事件。

+0

感谢input..since我是很新的ZK,'Events.ON_SELECT'会当我在ListBox中选择任何东西时触发,但是当我点击按钮时我需要它。如果我要求一些背景问题,总是需要它。总之,当我点击'Save'按钮时,我想获取两个'ListBox'的值。 –

+0

为什么不创建zul页面而不是通过代码创建它? – chillworld

+0

@chillworld:我还没有完全自由地这样做,必须遵循现有的代码模式,其中没有zul文件,只有Java代码 –

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 
} 
+0

有没有什么办法可以在不向组件提供ID的情况下获得这些值?问题是在同一页面上的另一个按钮,这是刷新页面,我收到了唯一的ID异常,我不能删除该按钮,它需要在那里 –

+0

如果'组件'定义在ZUL(不是你的情况),你可以绑定他们在控制器[使用CSS选择器](http://books.zkoss.org/wiki/Small_Talks/2011/January/Envisage_ZK_6:_An_Annotation_Based_Composer_For_MVC#Comparison_with_CSS3_Selector),或者只是让他们的数据绑定到服务器,所以你不需要完全可以引用组件。如果你用Java创建组件,我想不出一种方法可以从Java中检索它们,除了保留“Object”引用。 –