Friday, September 25, 2009

Multithreading (bagian 2) - Animasi Jam dan Titlebar

Pada posting sebelumnya sudah diperlihatkan cara menggunakan thread pada aplikasi Java. Kali ini akan diperlihatkan bagaimana menampilkan 3 thread sekaligus dalam satu aplikasi. Thread pertama adalah thread utama pada kelas Main. Thread kedua digunakan untuk menampilkan animasi titlebar, dan thread yang ketiga digunakan untuk menampilkan waktu (hari, tanggal, bulan, tahun, jam, menit dan detik) secara real time.

Penggunaan thread utama pada kelas Main dan thread untuk animasi titlebar sudah dicontohkan pada posting sebelumnya. Untuk menambahkan informasi waktu secara real time, ikuti langkah berikut:

Pertama, buat kelas baru turunan dari kelas JPanel dengan mengimplementasikan interface Runnable, misalnya dengan nama PanelJam.

Kedua, buat dua buah objek dari kelas JLabel dengan nama labelJam dan labelHari. Objek labelHari digunakan untuk menampilkan informasi hari, tanggal, bulan dan tahun, sedangkan objek labelJam digunakan untuk menampilkan informasi jam, menit dan detik.

Ketiga
, atur kedua objek JLabel tersebut sedemikian rupa sehingga tampilannya pas.

Keempat
, buat pengulangan tanpa batas (infinity loop) dengan menggunakan for atau while pada methode run. Buat objek dari kelas GregorianCalendar dan inisialisasi secara berulang-ulang serta ambil property hari, tanggal, bulan, tahun, jam, menit, detik secara berulang pula pada loop tersebut.

Kelima, tampilkan property dari objek GregorianCalendar tersebut pada labelJam dan labelHari pada setiap loop.

Kode selengkapnya adalah sebagai berikut:

package animasititlebar;

import javax.swing.JPanel;
import javax.swing.JLabel;

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;

import java.util.GregorianCalendar;
import javax.swing.border.LineBorder;
import javax.swing.border.BevelBorder;

public class PanelJam extends JPanel implements Runnable
{
    public PanelJam()
    {
        super();

        /**** Jam ****/
        JPanel panelJam = new JPanel();
        panelJam.setLayout(new FlowLayout(FlowLayout.RIGHT));
        panelJam.add(labelJam);

        labelJam.setFont(new Font("Monospaced", Font.BOLD, 16));
        labelJam.setBorder(new BevelBorder(BevelBorder.LOWERED));

        /**** Hari ****/
        JPanel panelHari = new JPanel();
        panelHari.setLayout(new FlowLayout(FlowLayout.LEFT));
        panelHari.add(labelHari);

        labelHari.setFont(new Font("Monospaced", Font.BOLD, 16));
        labelHari.setBorder(new BevelBorder(BevelBorder.LOWERED));

        setBorder(LineBorder.createBlackLineBorder());
        setLayout(new GridLayout(1, 2));
        add(panelHari);
        add(panelJam);

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

    public void run()
    {
        GregorianCalendar waktu;
        String detik;
        String menit;
        String jam;

        String hari;
        String tanggal;
        String bulan;
        String tahun;

        for (;;)
        {
            waktu = new GregorianCalendar();

            /* hari */
            int hariInt = waktu.get(waktu.DAY_OF_WEEK) - 1;
            hari = HARI[hariInt];

            /* tanggal */
            int tanggalInt = waktu.get(waktu.DAY_OF_MONTH);
            if (tanggalInt < 10)
            {
                tanggal = "0" + new Integer(tanggalInt).toString();
            }
            else
            {
                tanggal = new Integer(tanggalInt).toString();
            }

            /* bulan */
            int bulanInt = waktu.get(waktu.MONTH);
            bulan = BULAN[bulanInt];

            /* tahun */
            int tahunInt = waktu.get(waktu.YEAR);
            tahun = new Integer(tahunInt).toString();

            /* detik */
            int detikInt = waktu.get(waktu.SECOND);
            if (detikInt < 10)
            {
                detik = "0" + new Integer(detikInt).toString();
            }
            else
            {
                detik = new Integer(detikInt).toString();
            }

            /* menit */
            int menitInt = waktu.get(waktu.MINUTE);
            if (menitInt < 10)
            {
                menit = "0" + new Integer(menitInt).toString();
            }
            else
            {
                menit = new Integer(menitInt).toString();
            }

            /* jam */
            int jamInt = waktu.get(waktu.HOUR_OF_DAY);
            if (jamInt < 10)
            {
                jam = "0" + new Integer(jamInt).toString();
            }
            else
            {
                jam = new Integer(jamInt).toString();
            }

            labelJam.setText(" " + jam + ":" + menit + ":" + detik + " WIB ");
            labelHari.setText(" " + hari + ", " + tanggal + " " + bulan + " " + tahun + " ");

            try
            {
                threadJam.sleep(60);
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

    /***********************/
    private JLabel labelJam = new JLabel();
    private JLabel labelHari = new JLabel();

    private String HARI[] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jum`at", "Sabtu"};
    private String BULAN[] = {"Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"};

    private Thread threadJam;
}


Jika dijalankan hasilnya adalah sebagai berikut:





Download source code lengkap di sini.