Navigasi buku
Dasar-dasar Kontrol dan Label
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.NONE | Bit gaya kosong, tidak ada gaya apa-apa |
SWT.BORDER | Membuat 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_LEFT | Teks 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.WRAP | Memotong 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 :
| Metode | Penjelasan |
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.
| Metode | Penjelasan |
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 |
| ControlEvent | ControlListener (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(); } }
| Sisipan | Ukuran |
|---|---|
| shellpindah.zip | 1.61 KB |


