English 中文(简体)
zk selecting combobox item programmatically
原标题:

I cannot set the value of combobox programmatically can some one tell me what missing in the code

 public class Profile extends Window implements AfterCompose {

    @Override
    public void afterCompose() {
       Session session = Sessions.getCurrent(false);
                ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(
                (ServletContext) getDesktop().getWebApp().getNativeContext());

        UsersDao usersDao = (UsersDao) ctx.getBean("daoUsers");


        User user = (User) session.getAttribute("user");
        user = usersDao.getUser(user.getUsername(),user.getPassword());

        Textbox username_t = (Textbox) this.getFellow("username");
        Textbox password_t = (Textbox) this.getFellow("password");
        Textbox conpassword_t = (Textbox) this.getFellow("con_password");
        Textbox firstname_t = (Textbox) this.getFellow("firstName");
        Textbox lastname_t = (Textbox) this.getFellow("lastName");
        Textbox email_t = (Textbox) this.getFellow("email");
        Combobox hintQuestion_t = (Combobox) this.getFellow("hintQuestion");
        Textbox hintAnswer_t = (Textbox) this.getFellow("hintAnswer");
        Combobox locale_t = (Combobox) this.getFellow("locale");
        Combobox authority_t = (Combobox) this.getFellow("authority");

        username_t.setText(user.getUsername());
        firstname_t.setText(user.getUserDetails().getFirstName());
        lastname_t.setText(user.getUserDetails().getLastName());
        email_t.setText(user.getUserDetails().getEmail());
        Comboitem selectedItem = getSelectedIndexComboboxItem(hintQuestion_t, user.getHintQuestion());
        hintQuestion_t.setSelectedItem(selectedItem);
        hintAnswer_t.setText(user.getHintAnswer());
        selectedItem = getSelectedIndexComboboxItem(locale_t, user.getUserDetails().getLocale());
        locale_t.setSelectedItem(selectedItem);
        selectedItem = getSelectedIndexComboboxItem(authority_t, ((Authority)user.getAuthorities().toArray()[0]).getRole());
        authority_t.setSelectedItem(selectedItem);


    }

   private Comboitem getSelectedIndexComboboxItem(Combobox combobox, String value) {
        List<Comboitem> items = combobox.getItems();
        Comboitem item = items.get(0);
        for (int i = 0; i < items.size(); i++) {
            Comboitem comboitem = items.get(i);
            String label = (String)comboitem.getLabel();
            String cval = (String)comboitem.getValue();
            if ((label!=null && label.equalsIgnoreCase(value)) || (cval != null  && cval.equalsIgnoreCase(value))) {
                item = comboitem;
                break;
            }
        }
        return item;
    }
}

// zk file

<window id="profile" use="com.jf.web.zk.ui.Profile">
        <tabbox  id="tabbox" width="40%" >
            <tabs>
                <tab label="Account Information"/>
                <tab label="Personal Information"/>
                <tab label="Contact Details"/>
            </tabs>
            <tabpanels>
                <tabpanel>
                    <grid>
                        <rows>
                            <row>
                                <label value="${i18nUtils.message( user.username )}"/>
                                <hbox>
                                    <textbox id="username" />*,a-zA-Z,0-9
                                </hbox>
                            </row>
                            <row>
                                <label value="${i18nUtils.message( user.password )}"/>
                                <hbox>
                                    <textbox id="password" type="password"/>*
                                </hbox>
                            </row>
                            <row>
                                <label value="${i18nUtils.message( registration.user.password.confirm )}"/>
                                <hbox>
                                    <textbox id="con_password" type="password"/>*
                                </hbox>
                            </row>
                            <row>
                                <label value="${i18nUtils.message( user.details.first.name )}"/>
                                <hbox>
                                    <textbox id="firstName" type="text"/>*
                                </hbox>
                            </row>
                            <row>
                                <label value="${i18nUtils.message( user.details.last.name )}"/>
                                <hbox>
                                    <textbox id="lastName" type="text"/>*
                                </hbox>
                            </row>
                            <row>
                                <label value="${i18nUtils.message( user.details.email )}"/>
                                <hbox>
                                    <textbox id="email" type="text"/>*
                                </hbox>
                            </row>
                            <row>
                                <label value="${i18nUtils.message( user.hint.question )}"/>
                                <hbox>
                                    <combobox id="hintQuestion" onCreate= self.setSelectedIndex(1); >
                                        <comboitem label="${i18nUtils.message( user.hint.question.possible.value1 )}" />
                                        <comboitem label="${i18nUtils.message( user.hint.question.possible.value2 )}" />
                                        <comboitem label="${i18nUtils.message( user.hint.question.possible.value3 )}" />
                                        <comboitem label="${i18nUtils.message( user.hint.question.possible.value4 )}" />
                                        <comboitem label="${i18nUtils.message( user.hint.question.possible.value5 )}" />
                                    </combobox>*
                                </hbox>
                            </row>
                            <row>
                                <label value="${i18nUtils.message( user.hint.answer )}"/>
                                <hbox>
                                    <textbox id="hintAnswer" type="text"/>*
                                </hbox>
                            </row>
                            <row>
                                <label value="${i18nUtils.message( user.details.locale )}"/>
                                <hbox>
                                    <combobox id="locale" onCreate= self.setSelectedIndex(1);self.setReadonly(true); >
                                        <comboitem label="${i18nUtils.message( user.details.locale.en )}" value="en_US"/>
                                        <comboitem label="${i18nUtils.message( user.details.locale.bg )}" value="bg_BG"/>
                                    </combobox>*
                                </hbox>
                            </row>
                            <row>
                                <label value="${i18nUtils.message( authority.account.type )}"/>
                                <hbox>
                                    <combobox id="authority" onCreate= self.setSelectedIndex(0);self.setReadonly(true); >
                                        <comboitem label="${i18nUtils.message( authority.job.seeker )}" value="Job Seeker"/>
                                        <comboitem label="${i18nUtils.message( authority.employer )}" value="Employer"/>
                                        <comboitem label="${i18nUtils.message( authority.hra )}" value="Human Resource Agency"/>
                                        <comboitem label="${i18nUtils.message( authority.advertiser )}" value="Advertiser"/>
                                    </combobox>*
                                </hbox>
                            </row>
                        </rows>
                    </grid>
                </tabpanel>
            </tabpanels>
        </tabbox>
        <grid width="40%">
            <rows>
                <row>
                    <button label="${i18nUtils.message( bttn.save )}" onClick="save()"/>
                    <button label="${i18nUtils.message( bttn.cancel )}" onClick="cancel()"/>
                </row>
            </rows>
        </grid>
    </window>
</zk>

The "getSelectedIndexComboboxItem()" does return the correct selected item but there seems no effect on the UI. Like for example the locale is set to default Bulgarian language and I need to set it to English.

问题回答

I think it is a bug in your version of ZK. You could try using setSelectedItemApi or setSelectedItemIndex instead of setSelectedItem.

On the other hand, even if it works, your solution is not right. Comboboxes allow entering different values than what s in the predefined list. The only real result of a combobox is the text label. I think having a separate value of a Comboitem is not a good idea.
Use setText() on the Combobox, or if you want to restrict the choices to a predefined list, use Listbox.

Just looking at your code I can see a few things wrong in addition to what Miklos pointed out.

You are using getfellow from a Java based composer. However, you should not do this as ZK will autowire components for you. You need to use the MVC pattern and extend GenericForwardComposer. Here is an example:

ZUL File

<window title="composer5 example" border="normal" width="300px" apply="example.MyComposer">
    <grid>
        <rows>
            <row>First Name: <textbox id="firstName"/></row><!-- forward is removed -->
            <row>Last Name: <textbox id="lastName"/></row><!-- forward is removed -->
            <row>Full Name: <label id="fullName"/></row>
        </rows>
    </grid>
</window>

Java File

package example;

public class MyComposer extends GenericForwardComposer {
    private Textbox firstName;
    private Textbox lastName;
    private Label fullName;

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        // TODO Auto-generated method stub
        super.doAfterCompose(comp);
    }

    //onChange event from firstName component
    public void onChange$firstName(Event event) { 
        fullName.setValue(firstName.getValue()+" "+lastName.getValue());
    }

    //onChange event from lastName component
    public void onChange$lastName(Event event) {
        fullName.setValue(firstName.getValue()+" "+lastName.getValue());
    }
}

For more information you can consult the documentation

With to the function to retrieve the selected item why not just use Combobox s getSelectedItem? Even if you use Listbox like Miklos suggested then you can also use the same function.

With regard to setting the selected item, you need to upgrade your ZK version to the latest. I have no problem doing so.





相关问题
Multiple Hibernate instances using C3P0

I am facing a weird problem and it seems to be c3p0 related. I am starting two instances of an app in the same java vm which interact with each other. After some operations "APPARENT DEADLOCK" ...

Hibernate vs Ibatis caching

We can speed up a hibernate app easyly with 2nd level cache using infinispan or ehcache/terracotta,... but ibatis only have a simple interface to implement for caching. And hibernate knows more ...

Using annotations to implement a static join in hibernate

I m relatively new to hibernate and was wondering if someone could help me out. While I have no issues implementing a normal join on multiple columns in hibernate using the @JoinColumns tag, I m ...

Hibernate query with fetch question

I have a 2 entities in a One-To-Many relationship: OfficeView.java: public class OfficeView implements java.io.Serializable { private Integer officeId; private String addr1; private ...

hibernate interceptors : afterTransactionCompletion

I wrote a Hibernate interceptor : public class MyInterceptor extends EmptyInterceptor { private boolean isCanal=false; public boolean onSave(Object entity, Serializable arg1, Object[] arg2, String[]...

How to prevent JPA from rolling back transaction?

Methods invoked: 1. Struts Action 2. Service class method (annotated by @Transactional) 3. Xfire webservice call Everything including struts (DelegatingActionProxy) and transactions is configured ...

Hibernate/GORM: collection was not processed by flush()

I have an integration test in my Grails application that fails when I try to save an entity of type Member invitingMember.save(flush: true) This raises the following exception org.hibernate....

Hibernate Criteria API equivalent for "elements()"

Is it possible to implement the following query using Criteria API? select order from ORDER as order,ITEM as item where item.itemID like ITM_01 and item in elements(order.items)

热门标签