© N I K O I B R A H I M , M I T
P R O G R A M S T U D I S I S T E M I N F O R M A S I U N I V E R S I T A S K R I S T E N M A R A N A T H A
Lecture 04: Event Handling
(Event Driven Programming)
Review Minggu Lalu
Standard Layout pada JavaSwing?
FlowLayout
GridLayout
BorderLayout max berapa komponen?
BoxLayout
CardLayout
GridBagLayout, dll
Default untuk JPanel?
FlowLayout
Constraint pada GridBagLayout?
gridx, gridy
fill
gridheight, gridwidth
weightx, weighty
ipadx, ipady
Materi Hari Ini
Event Handling: how it works?
EventListener
Latihan
Introduction to Event Handling
Event merupakan sebuah objek yang di-generate oleh user pada saat sesuatu terjadi terhadap suatu komponen.
Sebagai contoh, event di-generate pada saat user mengklik sebuah tombol, drag posisi mouse, atau memilih item dari combo box
Objek event ini di-kirimkan kepada sebuah method khusus yang kita buat yang disebut sebagai event listener.
Event listener ini akan memeriksa objek event, menentukan jenis event yang terjadi, dan langsung meresponnya.
event source ----> event object ----> event listener (interface) ----> event handler (method)
Java memiliki banyak objek Event, yang merupakan bagian
dari package java.awt.event dan javax.swing.event.
Event Handling
Event-based model:
button clicked (by user)
event generated (by the system)
appropriate action taken
Event Handling and Listener
Untuk menangani event, kita harus meregistrasi suatu listener kepada objek yang menjadi source event tersebut (misal: objek JButton)
Listener yang kita buat merupakan implementasi dari interface XXXListener.
XXX ini artinya tergantung tipe event yang ingin dibuat. Interface XXXListener ini didefinisikan di dalam package java.awt.event, java.beans, dan javax.swing.event.
Untuk meregristrasi objek kepada listener tersebut, kita dapat panggil method: addXXXListener()
Sebaliknya, untuk menghapus listener dari suatu objek, kita dapat memanggil method: removeXXXListener()
Kita dapat meregistrasi beberapa listener kepada sebuah komponen, demikian juga sebaliknya, suatu instance dari listener dapat
diregistrasi untuk menerima event dari banyak komponen.
Event Listener Interfaces in java.awt.event
Event Related to
ActionListener Action events
AdjustmentListener Adjustment events
AWTEventListener Observe passively all events dispatched within AWT
ComponentListener Component (move, size, hide, show) events ContainerListener Container (ad, remove component) events FocusListener Focus (gain, loss) events
HierarchyBoundsListener Hierarchy (ancestor moved/resized) events HierarchyListener Hierarchy (visibility) events
InputMethodListener Input method events (multilingual framework) ItemListener Item events
KeyListener Keyboard events
Event Listener Interfaces in java.awt.event (continue)
Event Related to
MouseListener Mouse buttons events MouseMotionListener Mouse motion events MouseWheelListener Mouse wheel events TextListener Text events
WindowFocusListener Window focus events (new focus management framework)
WindowListener Window events (non focus related) WindowStateListener Window state events
Event listener interfaces in javax.swing.event
Event Related to
AncestorListener Changes to location and visible state of a JComponent or its parents
CaretListener Text cursor movement events CellEditorListener Cell editor events
ChangeListener Change events
DocumentListener Text document events HyperlinkListener Hyperlink events
InternalFrameListener Internal frame events ListDataListener List data events
ListSelectionListener List selection events
MenuDragMouseListener Menu mouse movement events MenuKeyListener Menu keyboard events
MenuListener Menu selection events
Event listener interfaces in javax.swing.event (continue)
Event Related to
MouseInputListener Aggregrated mouse and mouse motion events PopupMenuListener Popup menu events
TableColumnModelListener Table column events TableModelListener Table model data events TreeExpansionListener Tree expand/collapse events TreeModelListener Tree model data events
TreeSelectionListener Tree selection events
TreeWillExpandListener Tree expand/collapse pending events UndoableEditListener Undo/Redo events
Ada 3 Teknik Penulisan Event-Handling di Java
1. Menjadikan JFrame utama untuk meng- implements Listener interface
2. Menggunakan Inner-Class
3. Menggunakan Anonymous Inner-Class
CARA 1: STEP-BY-STEP
JFrame implements Listener interface
Untuk menuliskan kode Java yang dapat merespon pada suatu event, kita dapat lakukan 4 langkah berikur:
1. Buatlah sebuah class yang meng-implementasikan listener interface untuk event yang akan ditangani:
public class ClickMe extends JFrame implements ActionListener
2. Buatlah komponen yang akan men-generate event:
JPanel panel = new JPanel();
button1 = new JButton("Click me! ");
panel.add(button1);
this.add(panel);
3. Registrasi listener (yaitu ActionListener) dengan source-nya (yaitu button1):
JPanel panel = new JPanel();
button1 = new JButton("Click me! ");
button1.addActionListener(this);
panel.add(button1);
this.add(panel);
4. Tuliskanlah kode untuk semua methods yang didefinisikan oleh listener tersebut:
public void actionPerformed(ActionEvent e){
if (e.getSource() == button1)
button1.setText("You clicked! ");
}
Complete Code: ClickMe.java
import javax.swing.*;
import java.awt.event.*;
public class ClickMe extends JFrame implements ActionListener {
private JButton button1;
private int clickCount = 0;
public ClickMe() {
JPanel panel1 = new JPanel();
button1 = new JButton("Click Me!");
button1.addActionListener(this);
panel1.add(button1);
this.add(panel1);
this.setSize(200,100);
this.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
this.setTitle("I’m Listening");
this.setVisible(true);
} // continue…
public void actionPerformed(ActionEvent e) { if (e.getSource() == button1) {
clickCount++;
if (clickCount == 1)
button1.setText("I’ve been clicked!");
else
button1.setText("I’ve been clicked "
+ clickCount + " times!");
} }
public static void main(String [] args) { ClickMe app = new ClickMe();
} }
Cara 2: Menggunakan Inner Class
Inner class adalah suatu kelas yang bersarang di dalam kelas yang lain.
Inner class juga dapat dimanfaatkan untuk
membuat suatu kelas yang meng-implement event listeners.
Dengan cara ini, class utama (yang mendefinisikan JFrame) tidak perlu meng-implement event
listener.
Contoh 2: ClickMe2.java
import javax.swing.*;
import java.awt.event.*;
public class ClickMe2 extends JFrame {
private JButton button1;
public ClickMe2() {
ClickListener cL = new ClickListener();
JPanel panel1 = new JPanel();
button1 = new JButton("Click Me!");
button1.addActionListener(cL);
panel1.add(button1);
this.add(panel1);
this.setSize(200,100);
this.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
this.setTitle("I’m Listening");
this.setVisible(true);
} // continue…
private class ClickListener implements
ActionListener { // Listenter inner class
private int clickCount = 0;
public void actionPerformed(ActionEvent e) { if (e.getSource() == button1) {
clickCount++;
if (clickCount == 1)
button1.setText("I’ve been clicked!");
else
button1.setText("I’ve been clicked "
+ clickCount + " times!");
} } }
public static void main(String [] args) { ClickMe2 app = new ClickMe2();
} }
Latihan:
Tambahkan exit button kepada ClickMe2.java
Buatlah sebuah JButton, lalu masukkan ke dalam panel1
Di dalam method actionPerformed, modifikasi menjadi sbb:
if (e.getSource() == button1) { clickCount++;
if (clickCount == 1)
button1.setText("I’ve been clicked!");
else
button1.setText("I’ve been clicked " + clickCount + " times!");
} else if (e.getSource() == exitButton) { if (clickCount > 0)
System.exit(0);
}
Komponen Input 01:
JTextField
JTextField merupakan salah satu komponen yang paling sering digunakan untuk menerima input dari user.
Review cara membuat JTextField:
JTextField textField1 = new JTextField(15);
JTextField textField2 = new JTextField("Initial Value", 20);
Untuk mendapatkan nilai yang user telah ketik ke dalam
sebuah JTextField, kita dapat gunakan method getText()
Contoh:
String lastName = textField1.getText();
Contoh 3: Namer.java
Complete Code: Namer.java
import javax.swing.*;
import java.awt.event.*;
public class Namer extends JFrame {
private JButton buttonOK;
private JTextField textName;
public Namer() {
createUserInterface();
}
private void createUserInterface(){
ButtonListener bl = new ButtonListener();
JPanel panel1 = new JPanel();
panel1.add(new JLabel("Enter your name: "));
textName = new JTextField(15);
panel1.add(textName);
buttonOK = new JButton("OK");
buttonOK.addActionListener(bl);
panel1.add(buttonOK);
this.add(panel1);
this.setSize(325,100);
this.setTitle("Who Are You?");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
private class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) {
if (e.getSource() == buttonOK) { String name = textName.getText();
if (name.length() == 0) {
JOptionPane.showMessageDialog(
Namer.this,
"You didn’t enter anything!", "Moron",
JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(
Namer.this,
"Good morning " + name, "Salutations",
JOptionPane.INFORMATION_MESSAGE);
}
textName.requestFocus();
} } }
public static void main(String [] args) { Namer app = new Namer();
} }
Bagaimana kalau input berupa angka?
Pada dasarnya, semua input yang diketik di dalam JTextField adalah teks biasa bertipe String
Untuk itu, kita perlu menggunakan method konversi apabila ingin mendapatkan nilai berupa angka.
Kita dapat menggunakan berbagai “parse methods” kepunyaan wrapper classes untuk mendapatkan nilai angka tipe primitif-nya.
Misalnya, kita ingin mengkonversi nilai String dari suatu JTextField ke dalam tipe primitif int, maka kita gunakan “method parseInt”
milik “wrapper class Integer” sbb:
int count = Integer.parseInt(textField1.getText());
Wrapper Classes & Methods konversinya
Contoh-contoh
Konversi String ke dalam angka
int count = Integer.parseInt(textField1.getText());
short count = Short.parseShort(textField1.getText());
long count = Long.parseLong(textField1.getText());
byte count = Byte.parseByte(textField1.getText());
float count = Float.parseFloat(textField1.getText());
double count = Double.parseDouble(textField1.getText());
Sebaliknya, untuk konversi angka ke dalam String, kita dapat gunakan method valueOf kepunyaan class String
Contoh:
int angka = 5;
String nilai = String.valueOf(angka);
Latihan: Inventory Application
Sebuah toko buku menerima pengiriman dus berisi buku-buku dari penerbit. Setiap
pengiriman memiliki sejumlah buku teks dalam jumlah yang sama untuk setiap dus-nya.
Manager toko ingin menggunakan komputer untuk menghitung total jumlah buku yang tiba dari setiap pengiriman.
Caranya adalah dengan memasukkan jumlah dus dan jumlah buku dalam setiap dus.
Program akan menghitung dan menampilkan
jumlah buku di setiap pengiriman.
User Interface: Inventory Application
Komponen:
3 JLabel
3 JTextField
1 Button
Inti kode program: Inventori.java
private class ButtonListener implements ActionListener { // inner class public void actionPerformed(ActionEvent e) {
if (e.getSource() == calculateJButton) {
int numberOfCartons = Integer.parseInt( cartonsJTextField.getText() );
int numberOfItems = Integer.parseInt( itemsJTextField.getText() );
int totalResult = numberOfCartons * numberOfItems;
totalResultJTextField.setText(String.valueOf(totalResult));
} } }
ButtonListener blisten = new ButtonListener();
calculateJButton = new JButton();
calculateJButton.setText( "Calculate Total" );
calculateJButton.addActionListener(blisten);
Komponen Input 02:
RadioButton & CheckBox
Selain JTextField, kita juga bisa mendapatkan input dari RadioButtaon dan CheckBox
RadioButton dan CheckBox memiliki kemiripan, yaitu nilai yang dikandungnya hanyalah dua: selected atau tidak.
Oleh karena itu, kita dapat menggunakan method isSelected untuk memeriksa apakah ratio
button/checkbox dipilih oleh user atau tidak
Contoh 4: Pizza.java
Program ini akan mendemonstrasikan cara mendapatkan input dari JRadioButton dan JCheckBox
Untuk pemicu event, kita buat sebuah button “OK”
Pada program ini, kita juga memanfaatkan sebuah JOptionPane untuk menuliskan hasil pilihan user
Source Code: Pizza.java
import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.*;
public class Pizza extends JFrame { private JButton buttonOK;
private JRadioButton small, medium, large;
private JCheckBox pepperoni, mushrooms, anchovies;
public Pizza() {
this.setSize(320,200);
this.setTitle("Order Your Pizza");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ButtonListener bl = new ButtonListener();
JPanel mainPanel = new JPanel();
JPanel sizePanel = new JPanel();
Border b1 = BorderFactory.createTitledBorder("Size");
sizePanel.setBorder(b1);
ButtonGroup sizeGroup = new ButtonGroup();
small = new JRadioButton("Small");
small.setSelected(true);
sizePanel.add(small);
sizeGroup.add(small);
medium = new JRadioButton("Medium");
sizePanel.add(medium);
sizeGroup.add(medium);
large = new JRadioButton("Large");
sizePanel.add(large);
sizeGroup.add(large);
mainPanel.add(sizePanel);
JPanel topPanel = new JPanel();
Border b2 = BorderFactory.createTitledBorder("Toppings");
topPanel.setBorder(b2);
pepperoni = new JCheckBox("Pepperoni");
topPanel.add(pepperoni);
mushrooms = new JCheckBox("Mushrooms");
topPanel.add(mushrooms);
anchovies = new JCheckBox("Anchovies");
topPanel.add(anchovies);
mainPanel.add(topPanel);
buttonOK = new JButton("OK");
buttonOK.addActionListener(bl);
mainPanel.add(buttonOK);
this.add(mainPanel);
this.setVisible(true);
}
Listener & Event Handling: Pizza.java
private class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) {
if (e.getSource() == buttonOK) { String tops = "";
if (pepperoni.isSelected()) tops += "Pepperoni\n";
if (mushrooms.isSelected()) tops += "Mushrooms\n";
if (anchovies.isSelected()) tops += "Anchovies\n";
String msg = "You ordered a ";
if (small.isSelected())
msg += "small pizza with ";
if (medium.isSelected())
msg += "medium pizza with ";
if (large.isSelected())
msg += "large pizza with ";
if (tops.equals(""))
msg += "no toppings.";
else
msg += "the following toppings:\n " + tops;
JOptionPane.showMessageDialog(
buttonOK, msg, "Your Order",
JOptionPane.INFORMATION_MESSAGE);
pepperoni.setSelected(false);
mushrooms.setSelected(false);
anchovies.setSelected(false);
small.setSelected(true);
} } }
public static void main(String [] args) { Pizza app = new Pizza();
} }
Komponen Input 03:
JScrollBar & JSlider
Kita juga bisa mendapatkan input dari JScrollBar dan JSlider
Namun, mereka tidak menggunakan ActionListener seperti halnya JButton.
JScrollBar memerlukan AdjustmentListener serta method adjustmentValueChanged (AdjustmentEvent e)
JSlider memerlukan ChangeListener serta method
stateChanged(ChangeEvent e)
Inti kode program: Slippery.java
// Buat dan beri listener kepada scrollbar:
JScrollBar scrollBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 48, 0, 255);
ScrollBarListener sBL = new ScrollBarListener();
scrollBar.addAdjustmentListener(sBL);
// Buat dan beri listener kepada slider:
slider = new JSlider(JSlider.HORIZONTAL, 0, 255, 128);
SliderListener sL = new SliderListener();
slider.addChangeListener(sL);
private class ScrollBarListener implements AdjustmentListener { public void adjustmentValueChanged (AdjustmentEvent e) { statusLabel.setText("JScrollBar's current value = "
+ scrollBar.getValue( ));
} }
private class SliderListener implements ChangeListener { public void stateChanged (ChangeEvent e) {
statusLabel.setText("JSlider's current value = " + slider.getValue( ));
} }
More About Interface Listener
Setiap interface Listener pasti memiliki method yang harus kita implementasikan.
Misal: Interface ActionListener memiliki satu method yang bernama actionPerformed
Oleh karena itulah, kita harus implementasikan actionPerformed ini, sbb:
private class ContohListener implements ActionListener{
// Kita harus menuliskan method actionPerformed ini!!
public void actionPerformed(ActionEvent e){
// tetap harus ditulis walaupun isinya kosong!
} }
Interface Listener dengan banyak method
Beberapa interface Listener dapat memiliki lebih dari satu method.
Misalnya, interface MouseListener terdiri dari 5 methods:
mousePressed
mouseReleased
mouseEntered
mouseExited
mouseClicked
Walaupun Anda hanya membutuhkan mouse click, Anda tetap harus mengimplementasikan ke-5 method MouseListener
tersebut!
Methods untuk event-event yang sebenarnya tidak kita perlukan
tersebut, memiliki empty body.
Contoh Implementasi MouseListener
public class MyClass implements MouseListener { ... someObject.addMouseListener(this); ...
public void mouseClicked(MouseEvent e) {
//Event listener implementation goes here...
}
// Ke-4 method sisanya harus tetap ditulis, walaupun body-nya kosong!
public void mousePressed(MouseEvent e) { } // Empty method definition.
public void mouseReleased(MouseEvent e) { } // Empty method definition.
public void mouseEntered(MouseEvent e) { } // Empty method definition.
public void mouseExited(MouseEvent e) { } // Empty method definition.
}
Cara 3. Menggunakan Anonymous Inner Class untuk menangani Event
Anda dapat membuat sebuah inner class tanpa menentukan namanya. Ini disebut sebagai anonymous inner class.
Setiap kali kita membuat komponen (misalnya JButton), kita
langsung buatkan sebuah anonymous inner class yang khusus akan menangani event untuk JButton itu sendiri.
Hal ini berbeda dengan teknik sebelumnya, di mana sebuah class dapat menangani banyak event dari komponen, yang mana untuk membedakan event-source-nya kita gunakan e.getSource()
Dengan demikian, penggunaan anonymous inner class dapat mempermudah pembacaan kode kita, karena class didefinisikan secara langsung di-tempat ia akan diakses (di-referenced)
Namun, kekurangannya adalah adanya kemungkinan penurunan performance karena banyaknya jumlah class yang dibuat. (satu class untuk satu komponen!)
Contoh Penggunaan Anonymous Inner Class
public class MyClass extends JFrame { JButton okButton = new JButton(“ok”);
okButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) {
…//Event listener implementation goes here...
} });
...
}
Anonymous inner class
Latihan: ClickMe.java
Ubahkan program ClickMe.java sedemikian rupa
sehingga sekarang menggunakan sebuah anonymous
inner class!
NEXT: Kerjakan Latihan Hari ini
ClickMe.java
ClickMe2.java
Inventori.java
Pizza.java
Slippery.java
Texter.java
More Resources…
Java Swing Tutorial and Example: java.sun.com website (lihat file project terbaru di dalam
SwingTutorial.rar)
Books:
JFC Swing Tutorial, Chapter 5 & 10
The Definitive Guide to Java Swing, Chapter 2