Melakukan Binding Terhadap ObservableList Di Groovy


Melakukan binding terhadap ObservableList di Groovy dan Griffon terkadang bisa menjebak.  Sebagai contoh, program sederhana berikut terlihat tidak bersalah:

import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*
import groovy.beans.Bindable

class Mahasiswa {
    @Bindable String nama   
    @Bindable ObservableList kelas
}

Mahasiswa mahasiswa = new Mahasiswa(nama: "None", kelas: ["A1", "A2"])

new SwingBuilder().edt {
    frame(title: 'Latihan', pack: true, show: true) {
        flowLayout()
        label("Nama")
        textField(text: bind(source: mahasiswa, sourceProperty: 'nama'), columns: 10)
        label("Kelas")
        textField(text: bind(source: mahasiswa, sourceProperty: 'kelas', 
            sourceValue: {mahasiswa.kelas.join(", ")}), columns: 20)                

        button("Ubah", actionPerformed: { 
            mahasiswa.nama = "Solid Snake"
            mahasiswa.kelas << "AX"
        })
    }
}

Akan tetapi bila tombol “Ubah” di-klik, binding untuk ObservableList tidak akan bekerja sesuai dengan harapan, seperti yang ditunjukkan oleh gambar berikut ini:

Contoh Binding Yang Tidak Bekerja

Contoh Binding Yang Tidak Bekerja

Hal ini terjadi karena kode program tersebut melakukan binding terhadap PropertyChangeSupport milik class Mahasiswa yang dihasilkan oleh annotation @Bindable.  Dengan demikian, perubahan pada text field hanya akan terjadi bila variabel kelas diganti dengan sebuah ObservableList yang baru.   Tentunya ini tidak sesuai dengan harapan karena yang diinginkan adalah binding terjadi saat isi ObservableList berubah.

Agar program bekerja, binding harus dilakukan terhadap PropertyChangeSupport milik ObservableList, bukan milik Mahasiswa! Sebagai contoh, saya mengubah kode program di atas menjadi seperti berikut ini:

import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*
import groovy.beans.Bindable

class Mahasiswa {
    @Bindable String nama   
    ObservableList kelas
}

Mahasiswa mahasiswa = new Mahasiswa(nama: "None", kelas: ["A1", "A2"])

new SwingBuilder().edt {
    frame(title: 'Latihan', pack: true, show: true) {
        flowLayout()
        label("Nama")
        textField(text: bind(source: mahasiswa, sourceProperty: 'nama'), columns: 10)
        label("Kelas")
        textField(text: bind(source: mahasiswa.kelas, sourceProperty: 'content', 
            sourceValue: {mahasiswa.kelas.join(", ")}), columns: 20)                

        button("Ubah", actionPerformed: { 
            mahasiswa.nama = "Solid Snake"
            mahasiswa.kelas << "AX"
        })
    }
}

Sekarang, program akan bekerja sesuai harapan seperti yang ditunjukkan oleh gambar berikut ini:

Contoh Binding Yang Bekerja

Contoh Binding Yang Bekerja

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: