views:

1001

answers:

2

Hi,

I cannot set the value of combobox programatically 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.

Abdul Khaliq

A: 

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.

Miklos
A: 

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.

Tim