Kode program berikut ini adalah modifikasi yang telah diberi penanganan event. Penanganan event menggunakan teknik dimana Kelas java akan berfungsi sebagai obyek pendengar (listener object). Anda dapat membaca beberapa artikel contoh program ini di Tipe Event, Listener dan Kelas Pemicu Event (Source Object) Di java, Metoda Registrasi Dan Handler Untuk Penanganan Event Java, Tahapan Menangani Aksi (Event) Di Program Java dan Teknik Menangani Aksi (Event) Di Program Java.
Berikut ini adalah kode program dan hasil eksekusinya:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | // 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 error kesalahan input, kode program di atas menggunakan metoda validasi (baris nomor 100 – 127). Metoda validasi akan diminta metoda actionPerformed di baris nomor 134. Saat tombol “Hitung” diklik, action event akan dipicu. Applet FormBungaPinjaman yang bertindak sebagai event listener kemudian mengeksekusi blok pernyataan di metoda actionPerformed.
Saat metoda actionPerformed dieksekusi, metoda validasi dipanggil. Di dalam metoda validasi ini, pernyataan baris nomor 102 – 104 dieksekusi untuk memeriksa apakah tiga kotak teks pertama telah diberi input, bila 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 benar. Input yang diberikan harus karakter numerik. Bila bukan karakter numerik, kotak dialog pesan 111, 117 atau 123 ditampilkan, tergantung di kotak teks mana kesalahan input terjadi. Di bawah ini adalah salah satu contoh kotak dialog bila nilai input di kotak teks Bunga Pinjaman (%) bukan karakter numerik.
Di penyeleksian if baris nomor 110 ada metoda matches dari kelas String dan regular expression “[1-9]\\d*”. Metoda matches menerima argumen literal string yang menetapkan pola regular expression. Nilai yang dimasukkan di kotak dialok teks kemudian disamakan dengan pola regular expression. Metoda matches akan mengembalikan nilai boolean true bila polanya sama dan boolean false bila polanya tidak sama.
Anda mungkin masih binggung dengan ekspresi jtfPinjaman.getText().matches("[1-9]\\d*") di baris nomor 110 di atas. Ekspresi jtfPinjaman.getText() akan mengembalikan nilai string yaitu nilai yang dimasukkan di kotak teks Pinjaman Bank. Nilai string ini adalah obyek kelas String. Obyek kelas String menggunakan metoda matches untuk menyamakan nilai string dengan pola yang terdapat di regular expression. 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] memiliki arti bahwa numerik pertama hanya satu digit mana saja selain 0, \\d dapat berupa digit yang mana saja termasuk 0 dan karakter * yang mengikuti subexpression \\d memiliki arti bahwa jumlah digit berapapun dari digit manapun dibolehkan. Karakter * memberi perluasan arti pada \\d yang diikuti.
Bila tidak ada kesalahan input di kotak teks, pernyataan baris nomor 136 – 146 dieksekusi. Baris nomor 138 – 140 adalah deklarasi variabel pinjaman, bunga dengan tipe double dan waktu dengan tipe int. Variabel ini digunakan untuk menyimpan nilai pinjaman bank, bunga pinjaman dan jangka waktu pinjaman melalui metoda getText. Metoda getText mengembalikan string numerik. Agar dapat disimpan di variabel tipe double dan int, nilai harus dikonversi terlebih dahulu.
Baris nomor 142 dan 143 adalah pernyataan menghitung bunga untuk jangka waktu peminjaman dan total uang yang harus dibayar. Total uang yang harus dibayar selama jangka waktu peminjaman adalah pinjaman bank ditambah bunga pinjaman. Baris nomor 145 dan 146 adalah pernyataan untuk menampilkan nilai bunga pinjaman dan total uang yang harus dibayar di kotak teks keempat dan kelima menggunakan metoda setText.
Metoda setText memerlukan argumen berupa 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.