Lecture 04: Event Handling (Event Driven Programming) © NIKO IBRAHIM, MIT PROGRAM STUDI SISTEM INFORMASI UNIVERSITAS KRISTEN MARANATHA
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 Menjadikan JFrame utama untuk mengimplements Listener interface 2. Menggunakan Inner-Class 3. Menggunakan Anonymous Inner-Class 1.
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 ButtonListener blisten = new ButtonListener(); calculateJButton = new JButton(); calculateJButton.setText( "Calculate Total" ); calculateJButton.addActionListener(blisten);
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)); } } }
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 if (large.isSelected()) msg += "large pizza with "; if (tops.equals("")) msg += "no toppings."; else msg += "the following toppings:\n " + tops;
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 ";
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 { Anonymous inner class JButton okButton = new JButton(“ok”); okButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { …//Event listener implementation goes here... } }); ... }
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
Summary Congratulations!, you’ve learnt how to handle basic
events in your applications!