All is about my experience | Linux

Like Us

05 May 2017

Vala Event Handler ( SIGNALS )


vala - event handler - signals
Berbicara tentang bahasa pemrogramman, tentu kita tak kan lepas dari yang namanya Event. Event itu sendiri adalah aksi atau kejadian yang terjadi pada aplikasi. Contoh sederhananya misalkan kejadian ketika user menginput data, user menggeser mouse, user menekan tombol, etc. Ah kurang lebih seperti itulah kira-kira.

Menurut bos wikipedia
Event is an action or occurrence recognized by software that may be handled by the software. Computer events can be generated or triggered by the system, by the user or in other ways. [...]
 Jadi Event Handler adalah sebuah fungsi yang akan menangani event-event tadi. Event tidak hanya disebabkan oleh user saja, tapi juga bisa oleh system.

Unik dan berbeda dari bahasa pemrogramman lainnya Vala tidak mengenal yang namanya Event, yang ada adalah Signals. Yup, signals.
Di situs resminya dijelaskan
Signals are a system provided by the Object class in GLib, and made easily accessible by Vala to all descendants of Object.

Daripada bingung mending kita langsung ke contoh

Oiya, contoh ini saya copas dari vala wiki :v


public class Test : GLib.Object {

    public signal void sig_1(int a);

    public static int main(string[] args) {
        Test t1 = new Test();

        t1.sig_1.connect((t, a) => {
            stdout.printf("%d\n", a);
        });

        t1.sig_1(5);

        return 0;
    }
}

Dari contoh diatas kita bisa lihat bagian "public signal void sig_1(int a)", signal/event harus didefinisikan terlebih dahulu agar signal itu dapat direspon dengan metode "connect()".
Pada bagian berikutnya "t1.sig_1.connect((..." kalau di javascript mungkin bisa di ibaratkan EventListener. Akan dijalankan ketika ada signal dikirim ke "sig_1()"

Selanjutnya saya punya contoh lain. coba buat project baru dengan builder dengan nama project "Tombol". Dalam folder "src" ( pada directory project ) buka "main.vala" dan ganti isinya dengan


using Gtk;

int main (string[] args) {

    Gtk.init (ref args);

    var window = new Window ();
    window.title = "Tombol";
    window.set_default_size (250, 250);
    window.destroy.connect (Gtk.main_quit);

    var label = new Label(null);

    var button = new Button();
    button.set_label("Klik aku dong");
    button.clicked.connect(() => {
        label.set_label("Taraaaaaa.. bakikuk");
    });
 
    //Buat container Box untuk wadah dari label dan button
    var box=new Box(Orientation.VERTICAL, 10);
    //Masukan label kedalam box
    //Pada argument ke-dua saya set "true" agar label memenuhi seluruh bagian kosong
    box.pack_start(label, true, false, 0);
    //Masukan button/tombol kedalam box
    box.pack_start(button, false, false, 0);

    //Tambahkan box ke window
    window.add(box);

    //Tampilkan window
    window.show_all();

    Gtk.main ();
    return 0;
}

Jalankan project dengan menekan CTRL+F5. kira-kira hasilnya seperti ini


Oh. mungkin ada yang bertanya tanya "Kenapa haru menyertakan Using Gtk?"
Simple, adalah untuk mempersingkat penulisan kode. bisa saja tidak menyertakan "Using Gtk" namun object Gtk harus selalu dipanggil ketika object turunan dari Gtk akan dipanggil.

Dengan Using Gtk

var window = new Window(); //Window adalah objek turunan dari Gtk
var label = new Label(); // Label juga objek turunan Gtk

Tanpa Using Gtk

var window = new Gtk.Window();
var label = new Gtk.Label();

Mari berdiskusi di kolom komentar. :P