How to set ZK Combobox Selected Item ? How to setSelectedItem on ZK Combobox ? Set selected item pada combobox zk

Hi there ..
finally i found the simple way to set selected item or selected index on zk combobox ! yeah … it’s very simple !

Mungkin banyak temen-temen programmer zk yang dipusingkan dengan hal ini, tetapi belum menemukan solusi yang simpel atau sudah punya solusi tetapi rumit dan butuh alokasi memory yang lebih. Berikut cara yang menurutku paling simpel, cukup 4 baris kode, tanpa perlu method atau class tambahan. Ini per 5 Januari 2012, jika nanti ada metode yang lebih baik aku akan memakainya.

Ada dua case dimana kita kadang butuh untuk mengeset nilai default pada zk combobox dari daftar nilai yang ada yaitu ketika :

  1. On Render
    Yaitu ketika sebuah form baru ditampilkan atau ketika baru diload, sebuah combobox ingin kita set nilai defaultnya atau set selected index-nya. Contohnya pada form edit atau detail data, dimana kita meng-assign nilai pada field-field dalam tampilan tersebut yang seringnya diantara field itu ada yang berbentuk combobox
  2. On Event
    Yaitu ketika ketika sebuah event dijalankan pada sebuah tampilan / form yang sudah dirender.

Permasalahan:
Pengisian nilai combobox oleh zk dilakukan setelah compose html, sehingga kalau kita melakukan hal yang sama dengan ketika koding html+javascript convensional yaitu pada ‘domready’ = ‘onload’ = ‘ready’ contohnya memberi value pada combobox, tidak akan berlaku pada zk. Dengan kata lain doAfterCompose != domready.

Maka solusinya, kita bisa melakukan intervensi pemberian selected index pada combobox ketika zk sedang melakukan render data yaitu pada case nomor 1..

Untuk case nomor 1: onRender
Pada saat doAfterCompose, kita harus memiliki nilai yang sama dengan salah satu comboitem value pada combobox yang kan kita set nilai defaultnya, pada saat render comboitem, kita cari nilai comboitem yang nilainya sama dengan data kita, kemudian kita setSelectedItem dengan comboitem yang nilainya sama dengan yang kita inginkan dengan method setSelectedItem(comboitem). Contoh kodingnya seperti ini.

List<TblSetKota> ltsk = k.getTrSetKotas(); // from jdbc or orm
cmbKota.setModel(new ListModelList(ltsk, true)); // cmbKota = id zk combobox
cmbKota.setItemRenderer(new ComboitemRenderer() {

	public void render(Comboitem cmbtm, Object o) throws Exception {
		TblSetKota tsk = (TblSetKota) o;
		cmbtm.setLabel(tsk.getNmKota());
                cmbtm.setValue(tsk);
		// set selected item
                if (tblSetUser != null) {
			if (tsk.getKdKota() == tblSetUser.getKdKota()) {
                            	cmbKota.setSelectedItem(cmbtm);
			}
		}
	}
});

Logic:
Ada sebuah form perekaman user. Form user berisi grid yang berisi daftar user, dan ada 2 button “Add” dan “Edit”. Kemudian terdapat sebuah form yang digunakan untuk menambah user dan mengedit user. Form Add dan Form Edit ini sama dalam rangka menghemat koding.Β Dalam Form Add user terdapat field berupa zk combobox yang isinya berasal daftar kota. Jika button “Add” di klik, maka akan tampil window Form Add dalam kondisi kosong. Jika button “Edit” di klik maka window Form Add akan tampil dalam keadaan sudah isi berdasarkan user yang terpilih untuk diedit. Dalam mode edit nilai combobox kota akan terisi sesuai kota user ketika form diload.

Untuk case nomor 2: onEvent
Syaratnya hampir sama dengan case nomor 1, bedanya hanya waktu kita untuk melakukan setSelectedItem yaitu pertama kita ambil jumlah item dalam combobox dengan method getItemCount() kemudian kita looping untuk mendapatkan comboitemnya. Pada saat looping kita ambil nilai dari comboitemnya dan kita bandingkan dengan data yang kita miliki. Jika hasilnya sama maka itulah nilai index yang kita bisa gunakan untuk melakukan dengan method setSelectedIndex(index).

Advertisements

5 comments on “How to set ZK Combobox Selected Item ? How to setSelectedItem on ZK Combobox ? Set selected item pada combobox zk

  1. Mas ahsan..
    Masih ingat saya? πŸ˜€

    Memang jarang interaksi langsung,
    tp yah sapa tahu ingat muka saya πŸ˜€

    Mau menambahkan..
    Bukannya bisa menggunakan combo.setValue(param)..

    Pengalaman saya, menggunakan setValue(param) akan me-set nilai label pada combo box..

    /** Sets the value.
    *
    * @param value the value; If null, it is considered as empty.
    * @exception WrongValueException if value is wrong
    */
    public void setValue(String value) throws WrongValueException {
    setText(value);
    }

    Ketika label tersebut ada yg sama dengan list pada combo box, maka ketika memanggil combo.getSelectedItem() akan mereturn ComboItem yg tepat:

    /** Returns the selected item.
    * @since 2.4.0
    */
    public Comboitem getSelectedItem() {
    syncValueToSelection();
    return _selItem;
    }

    Berikut isi dari syncValueToSelection():
    private void syncValueToSelection() {
    final String value = getValue();
    if (!Objects.equals(_lastCkVal, value)) {
    _lastCkVal = value;
    _selItem = null;
    for (final Comboitem item: getItems()) {
    if (Objects.equals(value, item.getLabel())) {
    _selItem = item;
    break;
    }
    }
    syncSelectionToModel();
    }
    }

    • Nggak bisa kalau kasusnya kita ingin ngeset value setiap kali halaman di load. kalau pakai setValue itu hanya kalau ada trigernya setelah onRender… nhaa pada saat onRender harus pakai cara yang aku jelaskan itu

      πŸ˜€

      • Dalam hal zk saya tidak mahir..

        Saya memakainya di doAfterCompose..
        Dan menggunakan sebuah class util, hanya untuk mempersingkat bbrp coding yang umum ketika render combo box:
        ComponentUtil.renderCombobox(cbKdUnit, listCbKdUnit, initialKdUnit, true, true);

        Untuk code renderCombobox:

        public static void renderCombobox(Combobox combo, List list, ComboVO selectedItem, boolean autocomplete, boolean autodrop) {
        combo.setModel(new ListModelList(list));
        combo.setItemRenderer(new ComboitemRenderer() {
        @Override
        public void render(Comboitem item, ComboVO data, int index) throws Exception {
        item.setValue(data.getValue());
        item.setLabel(data.getLabel());
        }
        });
        if (selectedItem != null) {
        combo.setValue(selectedItem.getLabel());
        }
        combo.setAutocomplete(autocomplete);
        combo.setAutodrop(autodrop);
        }

        Mohon pencerahannya πŸ˜€

      • He he he…
        Sama kayak pepatah, banyak jalan menuju siantar … eh banyak cara untuk setSelectedItem, caramu bisa juga sebagai method general yang bisa dipakai ulang…

        tapi aku lebih suka koding yang sedikit hi hi hi…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s