Banner Java

Kelas Sebagai Interface Dan Obyek Pendengar Aksi (Event)

Di artikel Mendisain Form Menarik Di Applet Java, Anda dapat mempelajari bagaimana mendesain sebuah form applet yang sangat menarik. Form tersebut hanya sekedar form. Anda tidak dapat melakukan interaksi dengan form tersebut seperti memasukkan nilai-nilai yang diperlukan dan kemudian menekan tombol hitung. Sekalipun Anda dapat memasukkan nilai yang diperlukan ke masing-masik kotak dan kemudian menekan tombol hitung, tetap tidak ada nilai hasil perhitungan. Kode yang disertakan hanya untuk mendesain form, belum sampai pada penanganan event di Java.

Kode program berikut ini merupakan modifikasinya yang telah disertai dengan penanganan event Java. Penanganan event ini menggunakan teknik dimana Kelas java akan berfungsi sekaligus sebagai obyek pendengar (listener object). Anda dapat membaca beberapa artikel yang ada kaitannya dengan artikel kali ini yaitu Tipe Event, Listener dan Kelas Pemicu Event (Source Object),Metoda Registrasi Dan Handler Dalam Penanganan Event Java, Tahapan Penanganan Aksi (Event) Di Pemrograman Java danTeknik Penanganan Aksi (Event) Di Pemrograman Java. Berikut ini adalah kode program dan hasil eksekusinya:

// Nama file : FormBungaPinjaman2.java
// Menghitung bunga pinjaman dan total pembayaran

// Mengimpor kelas
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import javax.swing.border.TitledBorder;

// Deklarasi kelas
public class FormBungaPinjaman2 extends JApplet implements ActionListener {

   // Deklarasi variabel acuan
   private JLabel label1, label2, label3, label4, label5;
   private JTextField jtfPinjaman, jtfBunga, jtfWaktu, jtfBungaHD, jtfTotal;
   private JButton tombolHitung;
   private JPanel panel1, panel2, panel3, panel4;
   private Font font1, font2;
   private DecimalFormat duaAngka;

   public void init() {

      // Membuat obyek label dan panel1
      label1 = new JLabel("Pinjaman Bank");
      label2 = new JLabel("Bunga Pinjaman (%)");
      label3 = new JLabel("Jangka Waktu Pinjaman (th)");
      label4 = new JLabel("Bunga Harus Dibayar");
      label5 = new JLabel("Total Uang Dibayar");

      panel1 = new JPanel();
      panel1.setLayout(new GridLayout(5, 1));
      panel1.setBackground(Color.WHITE);
      panel1.add(label1);
      panel1.add(label2);
      panel1.add(label3);
      panel1.add(label4);
      panel1.add(label5);

      // Mengatur font yang ditampilkan di kotak teks
      font1 = new Font("Tahoma", Font.BOLD, 12);
      font2 = new Font("Tahoma", Font.BOLD + Font.ITALIC, 12);

      // Membuat obyek field dan panel2
      jtfPinjaman = new JTextField(11);
      jtfPinjaman.setHorizontalAlignment(JTextField.RIGHT);
      jtfPinjaman.setFont(font1);
      jtfBunga = new JTextField(11);
      jtfBunga.setHorizontalAlignment(JTextField.RIGHT);
      jtfBunga.setFont(font1);
      jtfWaktu = new JTextField(11);
      jtfWaktu.setHorizontalAlignment(JTextField.RIGHT);
      jtfWaktu.setFont(font1);
      jtfBungaHD = new JTextField(11);
      jtfBungaHD.setHorizontalAlignment(JTextField.RIGHT);
      jtfBungaHD.setFont(font2);
      jtfBungaHD.setForeground(Color.BLUE);
      jtfBungaHD.setEditable(false);
      jtfTotal = new JTextField(11);
      jtfTotal.setHorizontalAlignment(JTextField.RIGHT);
      jtfTotal.setFont(font2);
      jtfTotal.setForeground(Color.BLUE);
      jtfTotal.setEditable(false);

      panel2 = new JPanel();
      panel2.setLayout(new GridLayout(5, 1));
      panel2.setBackground(Color.WHITE);
      panel2.add(jtfPinjaman);
      panel2.add(jtfBunga);
      panel2.add(jtfWaktu);
      panel2.add(jtfBungaHD);
      panel2.add(jtfTotal);

      // Membuat obyek button dan panel3
      tombolHitung = new JButton("Hitung");

      panel3 = new JPanel();
      panel3.setLayout(new FlowLayout(FlowLayout.RIGHT));
      panel3.setBackground(Color.WHITE);
      panel3.add(tombolHitung);
 
      // Meletakkan panel1 dan panel2 di panel4
      panel4 = new JPanel();
      panel4.setBorder(new TitledBorder("Form Bunga Pinjaman"));
      panel4.setLayout(new BorderLayout());
      panel4.setBackground(Color.WHITE);
      panel4.add(panel1, BorderLayout.LINE_START);
      panel4.add(panel2, BorderLayout.LINE_END);

      // Meletakkan panel3 dan panel4 di applet
      getContentPane().add(panel4, BorderLayout.PAGE_START);
      getContentPane().add(panel3, BorderLayout.CENTER);

      // Registrasi objek pendengar oleh obyek sumber
      tombolHitung.addActionListener(this);
 
   }

   // Metoda validasi
   public void validasi() {

      if (jtfPinjaman.getText().equals("") ||
         jtfBunga.getText().equals("") ||
         jtfWaktu.getText().equals("")) {

         JOptionPane.showMessageDialog(null,
            "Tiga kotak teks pertama tidak boleh kososng.");
      }

      else if (!jtfPinjaman.getText().matches("[1-9]\\d*")) {
         JOptionPane.showMessageDialog(null, 
            "Input di kotak teks jumlah pinjaman salah.");
            jtfPinjaman.setText("");
      }
   
      else if (!jtfBunga.getText().matches("[1-9]\\d*")) {
         JOptionPane.showMessageDialog(null, 
            "Input di kotak teks bunga pinjaman salah.");
            jtfBunga.setText("");
      }

      else if (!jtfWaktu.getText().matches("[1-9]\\d*")) {
         JOptionPane.showMessageDialog(null, 
            "Input di kotak teks jangka waktu peminjaman salah.");
            jtfWaktu.setText("");
      }
   }

   public void actionPerformed(ActionEvent e) {

      if (e.getSource() == tombolHitung) {

         // Memanggil metoda validasi
         validasi();

         duaAngka = new DecimalFormat("0.00");

         double pinjaman = Double.parseDouble(jtfPinjaman.getText());
         double bunga = Double.parseDouble(jtfBunga.getText());
         int waktu = Integer.parseInt(jtfWaktu.getText());

         double bungaHarusDibayar = pinjaman * bunga * waktu / 100;
         double totalUangDibayar = pinjaman + bungaHarusDibayar;

         jtfBungaHD.setText("" + duaAngka.format(bungaHarusDibayar));
         jtfTotal.setText("" + duaAngka.format(totalUangDibayar));
      }
   }
}

Untuk menghindari kemungkinan error yang terjadi karena kesalahan input, kode program di atas menggunakan metoda validasi (baris nomor 100 – 127). Metoda validasi ini akan diminta oleh metoda actionPerformed (baris nomor 134). Saat Anda menekan tombol perintah “Hitung”, action event akan dipicu. Applet FormBungaPinjaman yang juga bertindak sebagai event listener, kemudian mengeksekusi blok pernyataan di metoda actionPerformed. Saat metoda actionPerformed dieksekusi, metoda validasi dipanggil. Di metoda validasi, pernyataan baris nomor 102 – 104 dieksekusi. Pernyataan tersebut memeriksa apakah tiga kotak teks pertama telah diberi input, apabila belum dan tombol hitung ditekan, maka pernyataan baris nomor 106 dieksekusi yaitu menampilkan pesan bahwa tiga kotak teks pertama tidak boleh kosong.

Setelah semua kotak teks diberi input, baris nomor 110 – 126 kemudian memeriksa apakah nilai yang dimasukkan di kotak teks tersebut benar. Diharapkan Anda memasukkan input berupa karakter numerik. Apabila nilai input yang diberikan bukan karakter numerik, maka kotak dialog pesan 111, 117 atau 123 akan ditampilkan, tergantung di kotak teks mana kesalahan input terjadi. Di bawah ini adalah salah satu contoh kotak dialog yang ditampilkan apabila nilai input di kotak teks Bunga Pinjaman (%) bukan karakter numerik.

Menampilkan kotak dialog

Di penyeleksian if (baris nomor 110) terdapat metoda matches dari kelas String dan regular expression “[1-9]\\d*”. Metoda matches menerima argumen berupa literal string yang menetapkan pola regular expression. Nilai yang dimasukkan di kotak dialok teks kemudian dicocokkan dengan pola regular expression. Metoda matches akan mengembalikan nilai boolean true apabila polanya cocok dan boolean false apabila polanya tidak cocok. Anda mungkin masih binggung dengan ekspresi jtfPinjaman.getText().matches("[1-9]\\d*") pada baris nomor 110 di atas. Ekspresi jtfPinjaman.getText() akan mengembalikan nilai string yaitu nilai yang telah dimasukkan di kotak teks Pinjaman Bank. Nilai string ini merupakan obyek kelas String. Obyek kelas String kemudian menggunakan metoda matches untuk mencocokkan nilai string dengan pola yang ada di regular expression. Dan terakhir, nilai boolean yang dihasilkan, kemudian dibalik dengan meletakkan tanda negasi (!) di sebelah kiri ekspressi.

Regular expression [1-9]\\d* menetapkan pola karakter numerik. [1-9] mempunyai arti bahwa numerik pertama hanya satu digit yang mana saja selain dijit 0, \\d dapat berupa dijit yang mana saja termasuk dijit 0 dan karakter * yang mengikuti subexpression \\d mempunyai arti bahwa jumlah dijit berapapun dari digit manapun diperbolehkan. Karakter * memberi perluasan arti pada \\d yang diikuti (baca kembali artikel Menggunakan Regular Expression Di Java).

Apabila tidak terdapat kesalahan penginputan di kotak teks, pernyataan baris nomor 136 – 146 akan dieksekusi. Baris nomor 138 – 140 mendeklarasikan variabel pinjaman, bunga dengan tipe data double dan waktu dengan tipe data int. Variabel ini digunakan untuk menyimpan nilai pinjaman bank, bunga pinjaman dan jangka waktu pinjaman yang telah diinput di kotak teks. Untuk mendapatkan nilai yang diinput di kotak teks, digunakan metoda getText. Nilai yang dikembalikan oleh metoda getText adalah string numerik. Agar nilai tersebut dapat disimpan di variabel dengan tipe data double dan int, nilai tersebut harus dikonversi terlebih dahulu menggunakan metoda parseDouble dari kelas Double dan parseInt dari kelas Integer.

Baris nomor 142 dan 143 adalah pernyataan untuk menghitung bunga yang harus dibayar untuk jangka waktu peminjaman dan total uang yang harus dibayar. Total uang yang harus dibayar selama jangka waktu peminjaman adalah pinjaman bank ditambah dengan bunga pinjaman. Baris nomor 145 dan 146 adalah pernyataan untuk menampilkan nilai bunga pinjaman dan total uang dibayar di kotak teks keempat dan kelima dengan menggunakan metoda setText. Metoda setText memerlukan argumen literal string. Untuk menampilkan nilai tipe double yang tersimpan di variabel bungaHarusDibayar dan totalUangDibayar di kotak teks, digunakan operator penggabungan string (+) yang akan merangkai string kosong dengan nilai yang tersimpan di masing-masing variabel.

Form Applet Java

Untuk memperbaiki mutu konten, Anda dapat berpartisipasi dengan cara melaporkan apabila menemukan kesalahan ketik, kata-kata rangkap, redaksi kurang pas (jelas), gambar pendukung tidak ada dan sebagainya melalui form Kontak Kami untuk mendapatkan perbaikan. Terima kasih atas kerjasamanya.

Hindro HindriantoHindro adalah pendiri sekaligus admin termasmedia.com dan topikit.com, blog online yang mengulas teknologi informasi. Dunia web mulai ditekuni tahun 2012 dengan mempelajari CMS Joomla dan Wordpress. Beberapa buku yang sekarang dipelajari antara lain PHP, HTML5, ASP.NET 4.5, JavaScript, CSS3, MySQL, Adobe Dreamweaver, Adobe Photoshop dan Adobe Flash.