• Tidak ada hasil yang ditemukan

Lecture 04: Event Handling (Event Driven Programming)

N/A
N/A
Protected

Academic year: 2022

Membagikan "Lecture 04: Event Handling (Event Driven Programming)"

Copied!
40
0
0

Teks penuh

(1)

© 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)

(2)

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

(3)

Materi Hari Ini

 Event Handling: how it works?

 EventListener

 Latihan

(4)

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.

(5)

Event Handling

 Event-based model:

button clicked (by user)

event generated (by the system)

appropriate action taken

(6)

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.

(7)

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

(8)

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

(9)

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

(10)

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

(11)

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

(12)

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! ");

}

(13)

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();

} }

(14)

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.

(15)

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();

} }

(16)

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);

}

(17)

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();

(18)

Contoh 3: Namer.java

(19)

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();

} }

(20)

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());

(21)

Wrapper Classes & Methods konversinya

(22)

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);

(23)

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.

(24)

User Interface: Inventory Application

Komponen:

 3 JLabel

 3 JTextField

 1 Button

(25)

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);

(26)

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

(27)

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

(28)

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);

}

(29)

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();

} }

(30)

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)

(31)

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( ));

} }

(32)

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!

} }

(33)

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.

(34)

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.

}

(35)

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!)

(36)

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

(37)

Latihan: ClickMe.java

 Ubahkan program ClickMe.java sedemikian rupa

sehingga sekarang menggunakan sebuah anonymous

inner class!

(38)

NEXT: Kerjakan Latihan Hari ini

 ClickMe.java

 ClickMe2.java

 Inventori.java

 Pizza.java

 Slippery.java

 Texter.java

(39)

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

(40)

Summary

 Congratulations!, you’ve learnt how to handle basic

events in your applications!

Referensi

Dokumen terkait

Sebelum melaksanakan praktik Bimbingan dan Konseling di sekolah, praktikan telah menyusun rancangan program praktik pengalaman lapangan yang telah dilengkapi dengan

Berdasarkan hasil pengumpulan data lapangan serta penelusuran terhadap berbagai dokumen media baik elektronik (online) mapun cetak diperoleh beberapa kesimpulan penting

Pada dasarnya stainless steel merupakan salah satu jenis dari baja paduan, sehingga pembuatan stainless steel tidak jauh berbeda dengan proses pembuatan baja paduan, yang

Variabel dependen yang digunakan adalah data profitabilitas, struktur aktiva, ukuran perusahaan dan struktur modal pada perusahaan manufaktur yang terdaftar di Bursa Efek

Berdasarkan hal-hal tersebut maka perlu dilakukan penelitian untuk mengetahui kualitas fisikokimia air sungai Kaligarang serta kadar logam berat pada ikan mas

.-• Hidrolisis merupakan suatu proses pemecahan sebagian besar fraksi selulosa dan hemiselulosa dari biomassa menjadi gula penyusunnya. Proses hidrolisis untuk memproduksi etanol

Peristiwa terpanen dan terangkutnya empty bunch hingga ke PKS terjadi karena rotasi panen yang tinggi (≥6/9) sehingga buah matang pada tanaman kelapa sawit

Hasil perhitungan menunjukan bahwa tingkat kesejahteraan sebagian besar responden berdasarkan pendapatan dari kegiatan agroforestri kopi di lahan HKm berada dalam