Monthly Archives: June 2012

“Flickering” atau gambar yang berkedip merupakan masalah yang umum terjadi ketika membuat objek dan animasi di JAVA applet menggunakan AWT library. Berikut ini contoh kode untuk animasi sederhana di JAVA applet:

import java.applet.*;
import java.awt.*;
public class AnimasiBola extends Applet implements Runnable
{
   int x_pos = 10; 

   int y_pos = 100; 
   int radius = 20; 

public void init() 

   setBackground (Color.blue); 
 } 

public void start ()

   Thread th = new Thread (this); 
   th.start (); 
 } 

public void run () 

   Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 

   while (true) 
   { 
        x_pos ++; 
        repaint(); 

        try 
        { 
             Thread.sleep (20); 
         } 
        catch (InterruptedException ex) { } 

       Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 
   } 
 } 

public void paint (Graphics g) 
 { 
     g.setColor (Color.red); 
     g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius); 
  } 
}

Jika kode diatas dijalankan, animasi pada layar terlihat kurang “smooth”, terlihat seakan-akan gambar berkedip sekian detik. Hal inilah yang sering disebut dengan istilah “flickering”. Sedangkan penjelasan sederhana dari fenomena “flickering” adalah:

  • Ketika method repaint() dipanggil, method update() akan dijalankan.
  • Method update() secara default akan membersihkan tampilan layar kemudian memanggil method paint(). Method paint() inilah yang bertugas membentuk objek.
  • Karena ada mekanisme “bersihkan layar” dari method update() maka terjadi jeda waktu sekian milidetik antara tampilan layar yang dibersihkan dengan penggambaran kembali objek di layar.

Hal inilah yang mengakibatkan gambar objek berkedip. Untuk mengatasi hal tersebut, ada suatu cara yang cukup mudah yaitu dengan menggunakan ‘double buffering‘. Prinsip double buffering adalah sebagai berikut:

Analogikan layar JAVA applet terdiri dari dua screen layer, background layer dan foreground layer. Segala hal yang ada di background tidak akan terlihat jika ada objek di foreground di posisi yang sama. Ketika repaint() dipanggil, method update() membuat sebuah gambar di background, gambar yang dibuat sama dengan gambar objek yang akan ditampilkan di foreground. Selanjutnya gambar di background diduplikasikan ke foreground. Sehingga jeda waktu ketika layar dibersihkan akan terisi oleh gambar dari background.

Double buffering dilakukan di dalam method update(). Berikut ini contoh kode double buffering dari website ini :

public void update (Graphics g) {
// initialize buffer

if (dbImage == null) {

dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics (); }

// clear screen in background
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

// draw elements in background
dbg.setColor (getForeground());
paint (dbg);

// draw image on the screen
g.drawImage (dbImage, 0, 0, this);
}

Hari ini saya punya kesempatan ngobrol kembali dengan guru saya. Seorang JAVA programmer paling hebat yang pernah saya kenal. Seorang yang lebih memilih ketak ketik daripada drag and drop atau klik sana, klik sini di IDE. Seorang yang hingga saat ini belum pernah menggunakan Netbeans. Seorang yang lebih memilih menulis sendiri JAVA framework untuk para konsumen-nya ketimbang menggunakan framework yang telah ada. Intinya, seorang yang ‘old-fashioned‘ atau lebih tepatnya ‘konvensional’ 🙂 However, itulah yang membuat beliau hebat dan faham betul JAVA “luar dalam”.

Percakapan diawali dengan sapaan yang biasa beliau lontarkan ke saya, “Lagi opo, nduk?” Saya pun menjawab bahwa saya sedang mengajar, kemudian saya bercerita bahwa dalam mengajar JAVA, saya masih menggunakan buku JAVA SL-275 keluaran Sun, dan tutorial-tutorial yang dahulu saya dapatkan ketika saya masih belajar bersama beliau. Kemudian beliau berkomentar, buku materi dasar-dasar JAVA yang baik sepanjang pengetahuan dia adalah:
1. JAVA SL-275
2. Bruce Eckel – Thinking in Java (http://www.mindview.net/Books/TIJ/)
3. Josh Bloch – Effective Java

Beliau berkata “saya tidak cocok dengan buku-buku pemrograman yang banyak beredar di toko-toko buku jaman sekarang, buku-buku tersebut tak ubahnya seperti buku resep masakan saja…”

Beliau melanjutkan, “Buku resep hanya menampilkan nama masakan, nama bahan dan bagaimana cara membuatnya, tanpa menjelaskan bahwa cabai itu pedas, garam itu asin, intinya bersifat instan, tanpa konsep…”

Saya pun berpikir, apa yang beliau sampaikan memang benar. Buku-buku pemrograman yang beliau maksudkan memang seperti buku resep. Intinya, minim konsep. Tetapi kenapa buku-buku tersebut laku keras? Bahkan ada yang direvisi dan dicetak ulang setiap tahun, dan tetap laku! Guru saya pun punya jawabannya, “Jaman sekarang jarang-jarang ada orang belajar pemrograman yang orientasinya konsep. Sekarang semuanya mau cepat, serba instan.” Saya setuju dengan hal tersebut. Hal yang kemudian terlintas dalam benak saya adalah ‘kenapa’?

Beberapa kemungkinan yang terlintas di benak saya adalah:
Pertama, ada tuntutan deadline waktu pembuatan aplikasi. Mahasiswa yang diminta membuat sebuah aplikasi sebagai tugas mata kuliah, kebanyakan akan memilih membeli buku-buku instan tersebut. Hal ini karena pengetahuan tentang konsep membutuhkan waktu yang lebih lama, sedangkan mereka dibatasi deadline oleh dosennya. Maka orientasi para mahasiswa tersebut adalah, yang penting aplikasi jadi.
Kemungkinan kedua, berkaitan dengan perubahan lingkungan dan kultur. Hal ini cukup kompleks untuk dibahas, karena bersifat multidimensi. Bahkan, secara tak sadar, hal-hal kecil yang ada di jaman sekarang, contohnya tayangan televisi pun, secara tidak langsung telah mendidik masyarakat untuk lebih menyukai hal-hal yang serba instan.

Then… Bahkan saya mulai berpikir, blog saya ini -pun jangan-jangan menurut beliau juga seperti buku resep. Sepertinya saya harus merombak tulisan-tulisan saya disini agar lebih menekankan konsep ketimbang langkah-langkah praktis.