GUI with Java without Netbeans

Biasanya kalau kita mau buat gui menggunakan Java, kita menggunakan ide Netbeans yang mempunyai fitur untuk membuat GUI dengan fasilitas drag and drop. Di satu sisi ini memudahkan penggunanya yang tidak ingin terintimidasi dengan detil yang mengerikan. Namun di sisi lain hal ini bisa dianggap overkill, apabila kita hanya ingin men-design GUI yang sederhana dan tidak begitu kompleks. Bahaya lainnya adalah apabila file .form yang digenerate oleh Netbeans hilang, kita tidak bisa mengubah GUI secara visual dan untuk mengubahnya secara manual lewat kode juga susah karena generated code untuk GUI dari Netbeans terkadang bloated dan sulit untuk dimengerti.

Karena itu kita perlu juga mengetahui bagaimana menyusun GUI melalui kode. Artikel berikut akan mencoba menjelaskan cara menyusun GUI yang paling sederhana dan cocok untuk yang ingin membuat GUI yang sederhana juga.

Ada dua cara untuk menyusun komponen GUI. Pertama dengan menggunakan layout manager atau dengan absolute position. Netbeans juga menggunakan layout manager untuk mendesain GUI-nya. Tapi yang akan dijelaskan di post ini adalah dengan menggunakan absolute position. Menggunakan layout manager memudahkan jika kita ingin menyusun GUI dengan praktis tanpa perlu mengetahui posisi pasti komponen yang akan ditaruh. Selain itu jika dilakukan resize terhadap komponen kontainernya, otomatis komponen yang dikandung didalamnya akan menyesuaikan dengan ukuran yang baru. Akan tetapi, jika kita ingin membuat GUI dengan ukuran yang sudah fixed, absolute position bisa memudahkan kita dalam mengatur posisi komponen dengan catatan kita harus sering mencoba untuk mendapatkan lokasi yang pas.

Oke, langsung buka editor favoritmu (Scite, geany, notepad++, eclipse, dlllll)
Hal pertama yang harus dilakukan adalah membuat kelas yang meng-extend JFrame

public class TestGUI extends JFrame

Jangan lupa import kelas JFrame

import javax.swing.JFrame;

kemudian di method main, kita cukup membuat objek dari kelas ini, dan menjalankan method setVisible agar GUI-nya bisa terlihat.

public static void main(String[] args) {
   TestGUI test = new TestGUI();
   test.setVisible(true);
}

Sampai saat ini, kita sudah membuat GUI yang fungsional, tapi begitu dikompail dan dijalankan kok GUI-nya tidak keliatan? Itu karena kita belum menspesifikasikan ukurannya. Jadi ukuran luasnya masih 0.
Inisialisasi ukuran GUI pada konstruktor

TestGUI() {
   setSize(600, 400);
}

parameter pada method setSize adalah panjang dan lebar dari JFrame tersebut.
Jangan lupa menambahkan kode berikut

TestGUI() {
   setDefaultCloseOperation(EXIT_ON_CLOSE);
}

agar ketika window-nya ditutup dengan menekan tombol x merah di pojok kanan atas, programnya benar-benar tertutup dan dimatikan dari JVM.
Posisi window tadi terletak di pojok kiri atas, bagaimana jika posisinya ingin ditengah?

TestGUI() {
   setLocationRelativeTo(null);
}

Maka posisi Windows akan berada di tengah.
Kalau mau Windows-nya tidak bisa diubah-ubah ukurannya, gunakan kode berikut

TestGUI() {
   setResizable(false);
}

Jika ingin memberi nama pada Windowsnya, panggil konstruktor parent Class dengan method super yang disertai argumen nama dari Windows dengan tipe String. Jangan lupa kalau super hanya bisa dipanggil di baris pertama pada konstruktor.

TestGUI() {
   super("Graphical User Interface for Test");
}

Setelah proses awal tersebut selesai, tahap berikutnya adalah tinggal layout untuk komponen-komponen yang kita butuhkan. Ada dua cara untuk layout dengan GUI di Java. Cara pertama adalah dengan menggunakan kelas LayoutManager untuk mengatur tata letak dari GUI kita. Cara ini juga yang dipakai oleh Netbeans untuk mendesain GUI. Kelebihan cara ini adalah kita tidak perlu khawatir apabila ukuran GUI berubah-rubah. Tampilan komponen akan mengikuti ukuran GUI yang sedang berlaku. Kekurangannya adalah ini bisa-bisa menjadi overkill, terutama untuk tampilan GUI sederhana dan tidak ada perubahan dari desain semula yang sudah disusun misalnya di kertas.

Karena itu saya memilih cara kedua, yaitu dengan absolute positioning. Dengan cara ini, desain awal yang sudah kita punya di kertas bisa langsung diterjemahkan ke dalam kode karena kita memiliki kuasa penuh terhadap letak dari komponen-komponennya.
Untuk memulai menggunakan absolute position, maka layout manager-nya harus di set null

TestGUI() {
   setLayout(false);
}

Berikutnya akan ditunjukkan bagaimana mengeset posisi komponen, misalnya sebuah textbox dan button

TestGUI() {
   JTextField tf1 = new JTextField();
   JButton btn1 = new JButton();

   tf1.setBounds(50, 50, 100, 20);
   btn1.setBounds(200, 50, 100, 20);

   add(tf1);
   add(btn1);
}

Dua baris pertama adalah instansiasi komponen TextField dan Button. Dua baris terakhir adalah cara menambahkan komponen ke dalam objek kontainer, dalam hal ini JFrame-nya sendiri. Kode yang berguna untuk mengatur letak adalah dua kode ditengah, yaitu method setBounds. Method setBounds memiliki empat buah parameter, dua parameter di depan adalah posisi secara sumbu x dan y untuk pojok kiri atas komponen yang bersangkutan. Dan jangan lupa juga, kalau sumbu x dan y posisi 0,0 untuk komputer juga dimulai dari pojok kiri atas. Dua parameter berikutnya adalah untuk panjang dan lebar dari komponen ini.
Tada, selesai. Sekarang Anda telah bisa membuat GUi serumit apapun tanpa membutuhkan bantuan dari Netbeans. Yang agak sulit dari pembuatan manual ini adalah harus sering dikompail untuk melihat posisi aslinya, karena ketika di code mungkin agak sulit untuk dibayangkannya.

Berikut potongan kode lengkapnya

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class TestGUI extends JFrame {
	
	TestGUI() {
		super("Graphical User Interface for Test");
		setSize(600, 400);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setResizable(false);
		setLocationRelativeTo(null);
		
		setLayout(null);
		
		JTextField tf1 = new JTextField();
		JButton btn1 = new JButton();
		
		tf1.setBounds(50, 50, 100, 20);
		btn1.setBounds(200, 50, 100, 20);
		
		add(tf1);
		add(btn1);
	}
	
	public static void main(String[] args) {
		TestGUI test = new TestGUI();
		test.setVisible(true);
	}
}

Dan screenshot dari hasil akhir program
gui
Selamat mencoba, semoga bermanfaat

[java] Immutable Data Types

Immutable Data Type, adalah struktur data default untuk bahasa pemrograman functional macam haskell dan kawan-kawan. Bagaimana dengan Java, bahasa pemrograman imperatif berorientasi objek.

Immutable Data Types ternyata sering digunakan tanpa disadari oleh banyak(kayaknya) programmer Java(termasuk saya dulu). Apa itu? String.

Ya, String termasuk ke dalam immutable data types. Ups, tunggu dulu. Immutable Data Types itu sendiri apa?

Immutable data types adalah struktur data yang begitu dibuat tidak bisa diubah. Contoh, begitu kita membuat String “abc”, maka data itu (atau objek itu di java) tidak bisa diubah.

Lho, saya bisa ubah kok contoh: String abc = “abc”; abc += “d”; Bukankah sekarang objeknya berubah jadi “abcd”?

Tidak, objek “abc” di awal tidak berubah. Yang terjadi sebenarnya Anda membuat sebuah objek baru yang berisi “abcd”. Jadi ada 2 buah objek di memori sekarang, yaitu objek “abc” dan objek “abcd” (3 sebenarnya karena objek “d” juga dibuat). Dan variabel abc cuma menunjuk objek yang berbeda.

Kenapa di Java dibuat begitu? Alasannya adalah untuk menghemat memori. Di dalam bagian memory heap di Java, ada yang namanya “String pool” yang isinya adalah semua string yang pernah dibuat. Jika ada permintaan untuk membuat objek string baru, Java Virtual Machine (atau JVM) akan mengecek dulu di String Pools, apakah objek string tersebut sudah ada atau belum. Jika sudah, maka tinggal di-reference saja ke objek tersebut. Jika belum maka objek string baru akan dibuat. Karena itu mungkin saja kalau banyak variabel string yang menunjuk ke objek yang sama di memori.

Apa efeknya untuk programmer? Pengetahuan akan ke-immutable-an String ini berguna jika kita membuat program yang kaya akan operasi manipulasi string. Dari pada membuat banyak objek mubazir di dalam memori yang pastinya akan menghambat performa program, gunakan saja versi mutable data types dari String, yaitu StringBuffer atau versi non-synchronised-nya StringBuilder. Seperti yang diberitahu oleh dosen saya, program yang baik adalah pemilihan algoritma dan struktur data yang tepat.

Struktur data lain yang immutable di Java antara lain, BigInteger dan BigDecimal.

Lalu apa kegunaan dari Immutable Data Types? Concurrency. Jika sebuah data yang diakses oleh lebih dari 1 thread tidak akan berubah, maka tidak ada keperluan untuk melakukan sinkronisasi untuk menjaga integritas data.

Mengenai apa itu konkurensi dan sinkronisasi, mungkin di bahasan lain. Salam.

[myth]Java, call by reference?

Untuk programmer yang belajar java dari background C, pasti ingat waktu belajar C dengan yang namanya pointer. Pointer memungkinkan fungsi di C untuk melakukan panggilan dengan parameter yang isinya adalah reference, atau call by reference.

Bagaimana di Java? betulkah primitif variable dipanggil call by value dan objek dipanggil secara call by reference?

Jawabannya tidak.

Semua pemanggilan fungsi di Java adalah secara call by value. Titik. Jika yang di-pass dalam pemanggilan fungsi adalah sebuah variabel reference, maka yang dikirim adalah nilai dari variabel tersebut, yaitu alamat objek itu di memori, bukan alamat variabel itu sendiri. Ini mengakibatkan di Java tidak bisa membuat fungsi untuk menukar nilai yang ditunjuk oleh dua buah variabel.

Demikian sekilas info.