Friday, November 21, 2014

Antara Java Swing (traditional) dan JavaFX FXML

Salah satu dari sekian banyak kegunaan Java reflection adalah untuk membuat GUI layout secara soft-code. Reflection dalam ilmu komputer didefenisikan sebagai kemampuan program komputer untuk menginspeksi, atau menginisialisasi atribut-atribut tertentu selama runtime. Ada sebuah diskusi menarik mengapa reflection tidak tersedia dalam bahasa semisal C++, yang salah satu point pentingnya adalah masalah optimisasi.

Sebenarnya di bahasa .NET sudah menggunakan teknik reflection ini dalam pembuatan GUI nya yakni dalam desain layout di Visual Studio, khususnya C# (walaupun saya g yakin apakah developer .NET mengerti bahwa itu dilakukan dengan bantuan reflection). Namun Java baru belakangan. Yakni dengan mengadopsi teknik yang sama dengan yang digunakan pada pengembangan layout aplikasi Android. Di Java Swing, telah dikenal namanya group-layout  untuk keperluan pembuatan desain GUI dengan menggunakan GUI builder. Salah satunya adalah  GUI builder yang terinstalasi secara default pada Netbeans. Namun ada banyak kesulitan dalam implementasinya. Karena code yang tergenerate itu sangat kompleks. Sehingga ketika diporting ke IDE yang lain, misalnya Eclipse  sudah sangat sulit untuk dipahami. Dan parahnya tidak ada kesepahaman antara developer Eclipe dan developer Netbeans dalam mendesain GUI builder. Netbeans dirancang dengan Java 100 persen. Sementara Eclipse dirancang dengan menerapkan sekian persen code native (JNI). Oleh karena itu, maka digunakan lah metode yang lebih brilian dengan bantuan reflection yang diimplementasi pada JavaFX scene builder.

Saya punya contoh project yang menjelaskan ini. 

Jadi dalam JavaFX itu, digunakan anotasi @FXML  untuk menandakan elemen yang di-injek dengan bantuan reflection selama runtime. Sementara properti-properti dari elemen tersebut diset pada file XML (atau dalam terminologi JavaFX disebut sebagai FXML). Nah, file XML ini yang kemudian diparsing (udah banyak library java untuk keperluan ini) untuk memperoleh nilai-nilai atribut tersebut. Ketika nilai-nilainya sudah diparsing, maka kemudian ditampung selama runtime (misalnya dalam sebuah List). Reflection kemudian menginisialisasi class dan kemudian mencari variabel-variabel yang ditandai dengan anotasi @FXML tadi. Kemudian mengeset nilai-nilai propertinya (misalnya panjang dan lebar dari sebuah button)  berdasarkan nilai yang sudah di-load dari file FXML. 

Keuntungannya adalah kita tidak perlu, memanggil seorang programmer hanya untuk mengganti desain layout dari aplikasi kita. Dan XML adalah universal format. Jadi semua developer aplikasi GUI builder tinggal melihat spesifikasi XML yang digunakan, dan mereka dapat membuat aplikasi GUI builder mereka sendiri. 

No comments: