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 :
- 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 - 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).



