Cari artikel di situs ini

Dasar-dasar Kontrol dan Label

Versi ramah cetakVersi ramah cetak

Kelas Control merepresentasikan elemen user interface yang berada di dalam suatu jendela. Kelas ini merupakan kelas abstrak yang tidak bisa digunakan secara langsung. Sedangkan Label, Button, Text, dan kontrol-kontrol lain yang biasa kita temui pada suatu jendela merupakan kelas turunan dari kelas Control yang bisa kita gunakan. Kelas Shell pun adalah salah satu kelas turunan tidak langsung dari kelas Control, sehingga beberapa metode dan event pada kelas Control tersedia pada kelas Shell.

Kelas Control memiliki beberapa bit gaya, yaitu

Bit gaya Keterangan
SWT.NONEBit gaya kosong, tidak ada gaya apa-apa
SWT.BORDERMembuat label yang diberi garis tepi (border). Bit gaya SWT.BORDER dimiliki oleh semua Widget, bukan hanya Label
SWT.LEFT_TO_RIGHT Teks akan ditampilkan dari kiri ke kanan seperti bahasa Indonesia, Inggris atau Latin lainnya
SWT.RIGHT_TO_LEFTTeks akan ditampilkan dari kanan ke kiri seperti bahasa Arab dan Hebrew

Untuk lebih menjelaskan tentang kelas abstrak Control dan berbagai fiturnya mari kita lihat kelas turunan yang paling sederhana, yaitu Label.

Label

Kelas Label adalah teks atau gambar yang tidak bisa dipilih oleh user dan tidak menghasilkan event apa-apa. Label biasanya digunakan untuk menampilkan teks pasif, misalnya judul suatu input teks atau keterangan lainnya.

Kelas Label memiliki beberapa bit gaya, yaitu

Bit gaya Keterangan
SWT.SEPARATOR Membuat garis, baik horizontal atau vertikal, yang biasanya digunakan sebagai pembatas antar label atau pembatas antar widget
SWT.SHADOW_IN Hanya salah satu dari gaya ini yang boleh digunakan, hanya digunakan dengan SWT.SEPARATOR
SWT.SHADOW_OUT
SWT.SHADOW_NONE
SWT.LEFT Hanya salah satu dari gaya ini yang boleh digunakan, hanya berguna untuk teks atau gambar
SWT.RIGHT
SWT.CENTER
SWT.WRAPMemotong teks jika tampilan tidak cukup besar

Mari kita buat contoh sederhana, yaitu menggambar satu jendela (shell) dan satu label yang bertuliskan "Selamat Datang!". Kita bisa buat programnya seperti ini.

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
 
public class HelloSWT2 {
 
    // Variabel-variabel widget kita deklarasikan sebagai
    // variabel privat
    private Display display;
    private Shell shell;
    private Label label1;
 
    // Konstruktor kelas ini, untuk menginisialisasi semua widget
    HelloSWT2() {
        // Membuat display dan shell baru
        display = new Display();
        shell = new Shell(display);
        shell.setSize(200, 200);
        shell.setText("Hello SWT");
 
        // Inisialisasi label
        label1 = new Label(shell, SWT.LEFT);
        label1.setText("Selamat Datang!");
    }
 
    // Perintah "standar" SWT, harus ada pada setiap aplikasi SWT
    public void run() {
        shell.open();
        while (!shell.isDisposed())
            if (!display.readAndDispatch())
                display.sleep();
        display.dispose();
    }
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // Instansiasi kelas ini, kemudian jalankan run
        HelloSWT2 hello = new HelloSWT2();
        hello.run();
    }
}

Apa yang Anda dapatkan? Anda terkejut  karena label tidak ditampilkan? Apa yang kurang dari program kita di atas?

Ketika suatu kontrol pertama kali dibuat (label adalah kelas turunan dari kontrol, jadi label juga berperilaku seperti kontrol), ukuran dan lokasinya adalah 0. Tugas kita sebagai programmer untuk menentukan ukuran kontrol dan lokasi di mana ia akan diletakkan.

Bound (Tepi)

Suatu persegi panjang yang menjelaskan lokasi dan ukuran suatu kontrol pada induknya disebut tepi suatu kontrol. Tepi suatu kontrol memiliki satuan piksel. Sedangkan unitnya relatif terhadap induknya. Untuk shell utama, koordinatnya mengikuti koordinat layar. Untuk kontrol yang berada di dalam shell, koordinat (0,0) adalah koordinat pojok kiri atas dari shell. Jika suatu widget berada dalam widget lain, maka koordinat (0,0)-nya adalah koordinat pojok kiri atas dari widget induknya.

Untuk mengeset dan mengambil lokasi dan ukuran suatu widget, kita bisa gunakan beberapa metode berikut ini :

MetodePenjelasan
setBounds(int x, int y, int lebar, int tinggi)Mengeset lokasi dan ukuran suatu kontrol
setBounds(Rectangle bound)Mengeset lokasi dan ukuran suatu kontrol. Parameternya bertipe Rectangle
setLocation(int x, int y)Mengeset lokasi suatu kontrol relatif terhadap induknya
setLocation(Point koordinat)Mengeset lokasi suatu kontrol relatif terhadap induknya. Parameternya bertipe Point
setSize(int lebar, int tinggi)Mengeset ukuran suatu kontrol.
setSize(Point ukuran)Mengeset ukuran suatu kontrol. Parameternya bertipe Point
getBounds()Mengembalikan Rectangle yang merupakan ukuran dan lokasi suatu kontrol relatif terhadap induknya
getLocation()Mengembalikan Point yang merupakan lokasi suatu kontrol relatif terhadap induknya
getSize()Mengembalikan Point yang merupakan ukuran suatu kontrol

Perhatikan bahwa beberapa metode menerima dan mengembalikan Rectangle dan Point sebagai parameter atau tipe keluarannya. Kelas Rectangle dan Point adalah kelas generik yang dimiliki SWT untuk melambangkan persegi panjang dan suatu titik. Kelas-kelas ini didefinisikan dalam paket org.eclipse.swt.graphics.

Kelas Rectangle memiliki variabel instansi x, y, height, dan width yang semuanya bertipe int. Sedangkan kelas Point memiliki variabel instansi x dan y yang bertipe int.

Mari kita tengok kembali program di atas. Kita akan ubah sedikit yaitu memberi ukuran dan lokasi label sehingga bisa ditampilkan dengan benar.

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
 
public class HelloSWT2 {
 
    // Variabel-variabel widget kita deklarasikan sebagai
    // variabel privat
    private Display display;
    private Shell shell;
    private Label label1;
 
    // Konstruktor kelas ini, untuk menginisialisasi semua widget
    HelloSWT2() {
        // Membuat display dan shell baru
        display = new Display();
        shell = new Shell(display);
        shell.setSize(200, 200);
        shell.setText("Hello SWT");
 
        // Inisialisasi label
        label1 = new Label(shell, SWT.LEFT);
        label1.setText("Selamat Datang!");
        label1.setBounds(10, 10, 150, 25); // set lokasi & ukuran kontrol agar bisa ditampilkan
    }
 
    // Perintah "standar" SWT, harus ada pada setiap aplikasi SWT
    public void run() {
        shell.open();
        while (!shell.isDisposed())
            if (!display.readAndDispatch())
                display.sleep();
        display.dispose();
    }
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // Instansiasi kelas ini, kemudian jalankan run
        HelloSWT2 hello = new HelloSWT2();
        hello.run();
    }
}

Berikut ini adalah hasilnya.

Ukuran yang Dibutuhkan

Setiap widget yang kita buat memiliki ukuran tertentu yang bisa dihitung secara otomatis, sehingga programmer tidak perlu menerka atau mencoba-coba ukuran widget yang diperlukan. Pada contoh di atas, kita harus menentukan sendiri ukuran suatu widget dengan menggunakan setBounds(), akan tetapi kadang-kadang cara ini sulit dilakukan jika jumlah yang kita gunakan beraneka ragam.

Kelas Control memiliki beberapa metode yang berhubungan dengan ukuran widget yang dibutuhkan.

MetodePenjelasan
pack()Mengeset ukuran suatu kontrol secara otomatis, berdasarkan ukuran minimum yang dibutuhkan oleh kontrol tersebut
pack(boolean berubah)Mengeset ukuran suatu kontrol secara otomatis. Jika berubah diisi true, maka ukuran kontrol akan dihitung kembali, bukan diambil dari cache.
computeSize(int wHint,
            int hHint)
Menghitung ukuran kontrol yang dibutuhkan. Sama dengan computeSize(wHint, hHint, true). Mengembalikan [code]Point
computeSize(int wHint,
            int hHint,
            boolean berubah)
Menghitung ukuran kontrol yang dibutuhkan, dimana wHint adalah lebar kira-kira, dan hHint adalah tinggi kira-kira. Jika berubah diisi true maka ukuran kontrol akan dihitung kembali, bukan diambil dari cache.

Metode pack() digunakan untuk mengeset suatu kontrol secar otomatis berdasarkan ukuran minimum yang dibutuhkan oleh kontrol tersebut. Pada contoh label di atas, kita bisa mengganti instruksi setBounds() dengan rangkaian perintah pack() dan setLocation() untuk mengeset ukuran dan lokasinya secara terpisah. Misalnya,

        ...
        // Inisialisasi label
        label1 = new Label(shell, SWT.LEFT);
        label1.setText("Selamat Datang!");
        label1.pack(); // set ukuran kontrol otomatis
        label1.setLocation(10, 10); // set lokasi kontrol
        ...

Metode computeSize() digunakan untuk menghitung ukuran yang dibutuhkan oleh suatu kontrol sehingga kontrol tersebut bisa digambar dengan utuh. Dengan kata lain kita ingin menjawab pertanyaan ini : berapa tinggi yang dibutuhkan jika lebarnya adalah x, atau berapa lebar yang dibutuhkan jika tingginya adalah y, atau berapa lebar dan tinggi yang dibutuhkan secara umum.

Untuk menjawab pertanyaan tersebut, kita membutuhkan dua variabel, yaitu salah satu nilai "saran", yaitu nilai yang kita sudah ketahui, dan nilai SWT.DEFAULT untuk menandai variabel yang ingin kita cari. Misalnya

  • Untuk menghitung tinggi widget jika lebarnya kira-kira 10 piksel, kita bisa menggunakan label1.computeSize(10, SWT.DEFAULT)
  • Untuk menghitung lebar widget jika tingginya kira-kira 10 piksel, kita bisa menggunakan label1.computeSize(SWT.DEFAULT, 10)
  • Untuk menghitung lebar dan tinggi widget yang dibutuhkan secara bersamaan, kita bisa menggunakan label1.computeSize(SWT.DEFAULT,SWT.DEFAULT)

Event Ketika Kontrol Berpindah Tempat

Ketika suatu kontrol berpindah tempat, misalnya karena digeser atau ukurannya diubah oleh user, event tertentu akan dilepaskan. Kita bisa memasang listener pada kontrol tersebut untuk menangani event yang terjadi. Berikut ini adalah event yang terkait dengan perubahan lokasi dan ukuran suatu kontrol.

Kelas Event (event bertipe)Interface/Kelas Listener (listener bertipe)Metode (listener bertipe)Jenis event (event tanpa tipe)Penjelasan
ControlEventControlListener (dan ControlAdapter)

controlMoved(ControlEvent)

SWT.Move

Posisi suatu kontrol berubah

controlResized(ControlEvent)

SWT.Resize

Ukuran kontrol berubah

Contoh berikut membuat dua buah shell, yaitu shell utama dan shell kedua. Shell kedua adalah shell kosong tanpa tepi mirip seperti tool tip. Jika shell utama berubah posisi atau ukuran, shell kedua akan tergeser secara otomatis sehingga jaraknya tetap sama.

Berikut ini adalah kode sumbernya yang bisa diunduh di sini.

package com.lyracc.shellpindah;
 
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;
 
public class ShellPindah {
 
    // Variabel-variabel widget kita deklarasikan sebagai
    // variabel privat
    private Display display;
    private Shell shell;
    private Shell shellKedua;
 
    // Jarak antara kedua shell
    private int jarakShell = 20;
 
    // Konstruktor kelas ini, untuk menginisialisasi semua widget
    ShellPindah() {
        // Membuat display dan shell baru
        display = new Display();
        shell = new Shell(display);
        shell.setSize(200, 200);
        shell.setText("Shell Pindah");
 
        // Inisialisasi Shell kedua
        shellKedua = new Shell(shell,SWT.TOOL);
        shellKedua.setSize(100,100);
 
        // Tambah listener jika shell utama berubah ukuran dan lokasi
        shell.addControlListener(new ControlListener() {
 
            @Override
            public void controlMoved(ControlEvent e) {
                pindah();
            }
 
            @Override
            public void controlResized(ControlEvent e) {
                pindah();
            }
 
        });
 
        // Jangan lupa shell harus di-open..
        shellKedua.open();
    }
 
    // Pindahkan shell kedua
    private void pindah() {
        // Ambil ukuran dan lokasi shell pertama
        Rectangle pp = shell.getBounds();
 
        // Set lokasi shell kedua
        shellKedua.setLocation(
                pp.x + pp.width + jarakShell,
                pp.y);
    }
 
    // Perintah "standar" SWT, harus ada pada setiap aplikasi SWT
    public void run() {
        shell.open();
        while (!shell.isDisposed())
            if (!display.readAndDispatch())
                display.sleep();
        display.dispose();
    }
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // Instansiasi kelas ini, kemudian jalankan run
        ShellPindah shellPindah = new ShellPindah();
        shellPindah.run();
    }
}
SisipanUkuran
shellpindah.zip1.61 KB