Package org.zkoss.zul

Class Combobox

  • All Implemented Interfaces:
    java.io.Serializable, java.lang.Cloneable, Component, Disable, Readonly, Scope, ComponentCtrl, Constrainted

    public class Combobox
    extends Textbox
    A combobox.

    Non-XUL extension. It is used to replace XUL menulist. This class is more flexible than menulist, such as setAutocomplete(boolean) setAutodrop(boolean).

    Default getZclass(): z-combobox.(since 3.5.0)

    Events: onOpen, onSelect, onAfterRender
    Developers can listen to the onOpen event and initializes it when OpenEvent.isOpen() is true, and/or clean up if false.
    onAfterRender is sent when the model's data has been rendered.(since 5.0.4)

    Besides assign a list model, you could assign a renderer (a ComboitemRenderer instance) to a combobox, such that the combobox will use this renderer to render the data returned by ListModel.getElementAt(int). If not assigned, the default renderer, which assumes a label per combo item, is used. In other words, the default renderer adds a label to a row by calling toString against the object returned by ListModel.getElementAt(int). (since 3.0.2)

    Note: to have better performance, onOpen is sent only if a non-deferrable event listener is registered (see Deferrable).

    Like Datebox, the value of a read-only comobobox (InputElement.isReadonly()) can be changed by dropping down the list and selecting an combo item (though users cannot type anything in the input box).

    Author:
    tomyeh
    See Also:
    Comboitem, Serialized Form
    • Method Detail

      • getModel

        public <T> ListModel<T> getModel()
        Returns the list model associated with this combobox, or null if this combobox is not associated with any list data model.

        Note: for implementation of auto-complete, the result of getItemCount() is a subset of model. So, if the model implemented ListSubModel interface, you can't use the index of model to find the comboitem by getItemAtIndex(int).

        Since:
        3.0.2
        See Also:
        ListSubModel.getSubModel(Object, int)
      • setModel

        public void setModel​(ListModel<?> model)
        Sets the list model associated with this combobox. If a non-null model is assigned, no matter whether it is the same as the previous, it will always cause re-render.
        Parameters:
        model - the list model to associate, or null to dissociate any previous model.
        Throws:
        UiException - if failed to initialize with the model
        Since:
        3.0.2
      • setEmptySearchMessage

        public void setEmptySearchMessage​(java.lang.String msg)
        Sets empty search message. This message would be displayed, when no matching results was found. Note: it's meaningless if no model case.
        Parameters:
        msg -
        Since:
        8.5.1
      • getEmptySearchMessage

        public java.lang.String getEmptySearchMessage()
        Returns the empty search message if any. Default: null
        Since:
        10.0.0
      • getItemRenderer

        public <T> ComboitemRenderer<T> getItemRenderer()
        Returns the renderer to render each row, or null if the default renderer is used.
        Since:
        3.0.2
      • setItemRenderer

        public void setItemRenderer​(ComboitemRenderer<?> renderer)
        Sets the renderer which is used to render each row if getModel() is not null.

        Note: changing a render will not cause the combobox to re-render. If you want it to re-render, you could assign the same model again (i.e., setModel(getModel())), or fire an ListDataEvent event.

        Parameters:
        renderer - the renderer, or null to use the default.
        Throws:
        UiException - if failed to initialize with the model
        Since:
        3.0.2
      • setItemRenderer

        public void setItemRenderer​(java.lang.String clsnm)
                             throws java.lang.ClassNotFoundException,
                                    java.lang.NoSuchMethodException,
                                    java.lang.IllegalAccessException,
                                    java.lang.InstantiationException,
                                    java.lang.reflect.InvocationTargetException
        Sets the renderer by use of a class name. It creates an instance automatically.
        Throws:
        java.lang.ClassNotFoundException
        java.lang.NoSuchMethodException
        java.lang.IllegalAccessException
        java.lang.InstantiationException
        java.lang.reflect.InvocationTargetException
        Since:
        3.0.2
      • onInitRender

        public void onInitRender​(Event data)
        Handles a private event, onInitRender. It is used only for implementation, and you rarely need to invoke it explicitly.
        Since:
        3.0.2
      • isAutodrop

        public boolean isAutodrop()
        Returns whether to automatically drop the list if users is changing this text box.

        Default: false.

      • setAutodrop

        public void setAutodrop​(boolean autodrop)
        Sets whether to automatically drop the list if users is changing this text box.
      • isAutocomplete

        public boolean isAutocomplete()
        Returns whether to automatically complete this text box by matching the nearest item (Comboitem. It is also known as auto-type-ahead.

        Default: true (since 5.0.0).

        If true, the nearest item will be searched and the text box is updated automatically. If false, user has to click the item or use the DOWN or UP keys to select it back.

        Don't confuse it with the auto-completion feature mentioned by other framework. Such kind of auto-completion is supported well by listening to the onChanging event.

      • setAutocomplete

        public void setAutocomplete​(boolean autocomplete)
        Sets whether to automatically complete this text box by matching the nearest item (Comboitem.
      • isOpen

        public boolean isOpen()
        Returns whether this combobox is open.

        Default: false.

        Since:
        6.0.0
      • setOpen

        public void setOpen​(boolean open)
        Drops down or closes the list of combo items (Comboitem. only works while visible
        Since:
        3.0.1
      • open

        public void open()
        Drops down the list of combo items (Comboitem. It is the same as setOpen(true).
        Since:
        3.0.1
      • close

        public void close()
        Closes the list of combo items (Comboitem if it was dropped down. It is the same as setOpen(false).
        Since:
        3.0.1
      • isButtonVisible

        public boolean isButtonVisible()
        Returns whether the button (on the right of the textbox) is visible.

        Default: true.

      • setButtonVisible

        public void setButtonVisible​(boolean visible)
        Sets whether the button (on the right of the textbox) is visible.
      • isInstantSelect

        public boolean isInstantSelect()
        Returns true if onSelect event is sent as soon as user selects using keyboard navigation.

        Default: true

        Since:
        8.6.1
      • setInstantSelect

        public void setInstantSelect​(boolean instantSelect)
        Sets the instantSelect attribute. When the attribute is true, onSelect event will be fired as soon as user selects using keyboard navigation. If the attribute is false, user needs to press Enter key to finish the selection using keyboard navigation.
        Since:
        8.6.1
      • getItems

        public java.util.List<Comboitem> getItems()
        Returns a 'live' list of all Comboitem. By live we mean you can add or remove them directly with the List interface.

        Currently, it is the same as AbstractComponent.getChildren(). However, we might add other kind of children in the future.

      • getItemCount

        public int getItemCount()
        Returns the number of items.
      • getItemAtIndex

        public Comboitem getItemAtIndex​(int index)
        Returns the item at the specified index.
      • appendItem

        public Comboitem appendItem​(java.lang.String label)
        Appends an item.
      • removeItemAt

        public Comboitem removeItemAt​(int index)
        Removes the child item in the list box at the given index.
        Returns:
        the removed item.
      • getSelectedItem

        public Comboitem getSelectedItem()
        Returns the selected item.
        Since:
        2.4.0
      • setSelectedItem

        public void setSelectedItem​(Comboitem item)
        Deselects the currently selected items and selects the given item.

        Note: if the label of comboitem has the same more than one, the first comboitem will be selected at client side, it is a limitation of Combobox and it is different from Listbox.

        Since:
        3.0.2
      • setSelectedIndex

        public void setSelectedIndex​(int jsel)
        Deselects the currently selected items and selects the item with the given index.

        Note: if the label of comboitem has the same more than one, the first comboitem will be selected at client side, it is a limitation of Combobox and it is different from Listbox.

        Since:
        3.0.2
      • getSelectedIndex

        public int getSelectedIndex()
        Returns the index of the selected item, or -1 if not selected.
        Since:
        3.0.1
      • getPopupWidth

        public java.lang.String getPopupWidth()
        Returns:
        the width of the popup of this component
        Since:
        8.0.3
      • setPopupWidth

        public void setPopupWidth​(java.lang.String popupWidth)
        Sets the width of the popup of this component. If the input is a percentage, the popup width will be calculated by multiplying the width of this component with the percentage. (e.g. if the input string is 130%, and the width of this component is 300px, the popup width will be 390px = 300px * 130%) Others will be set directly.
        Parameters:
        popupWidth - the width of the popup of this component
        Since:
        8.0.3
      • setMultiline

        public void setMultiline​(boolean multiline)
        Description copied from class: Textbox
        Sets whether it is multiline.
        Overrides:
        setMultiline in class Textbox
      • setRows

        public void setRows​(int rows)
        Description copied from class: Textbox
        Sets the rows.

        Note: Not allowed to set rows and height/vflex at the same time

        Overrides:
        setRows in class Textbox
      • setIconSclass

        public void setIconSclass​(java.lang.String iconSclass)
        Sets the iconSclass name of this Combobox.
        Parameters:
        iconSclass - String
        Since:
        8.6.2
      • getIconSclass

        public java.lang.String getIconSclass()
        Returns the iconSclass name of this Combobox.
        Returns:
        the iconSclass name
        Since:
        8.6.2
      • clone

        public java.lang.Object clone()
        Description copied from interface: Component
        Clones the component. All of its children and descendants are cloned. Also, ID are preserved.
        Specified by:
        clone in interface Component
        Overrides:
        clone in class Textbox
        Returns:
        the new component. Notice that it doesn't belong to any page, nor desktop. It doesn't have a parent, either.
      • getPropertyAccess

        public PropertyAccess getPropertyAccess​(java.lang.String prop)
        Description copied from interface: ComponentCtrl
        Returns the corresponding property access object from the given property name, if any.
        Specified by:
        getPropertyAccess in interface ComponentCtrl
        Overrides:
        getPropertyAccess in class Textbox
        Parameters:
        prop - the name of the property
        Returns:
        null it means not to support for the property name.