Skip to content

Program 13 : Event Handling

Create a Java program to handle various types of events using the Delegation Event Model, including implementing event listener interfaces and adapter classes. Demonstrate event handling mechanisms with key and action events.

A) Handling Key and Action Events

This example demonstrates handling events by directly implementing listener interfaces (KeyListener, ActionListener). The WindowAdapter is used for a concise way to handle the window closing event.

EventDemo.java

java
import java.awt.*;
import java.awt.event.*;

// AWT Frame with KeyListener and ActionListener
public class EventDemo extends Frame implements KeyListener, ActionListener {
    TextField tf;
    TextArea ta;

    public EventDemo() {
        setLayout(new FlowLayout());
        // Frame setup
        setSize(300, 300);
        setTitle("Key and Action Event Demo");
        setVisible(true);

		// Setup layout and components
        tf = new TextField(20);
        ta = new TextArea(10, 25);
        ta.setEditable(false); // Make text area read-only
        Button b = new Button("Clear");

        // Add components to the frame
        add(new Label("Enter Text:"));
        add(tf);
        add(new Label("Event Log:"));
        add(ta);
        add(b);

        // Register listeners to components
        tf.addKeyListener(this);
        b.addActionListener(this);

        // Window listener to handle closing event using an adapter class
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
    }

    // -- KeyListener methods --
    @Override
    public void keyPressed(KeyEvent ke) {
        ta.append("Key Pressed: " + ke.getKeyChar() + "\n");
    }
    
    @Override
    public void keyReleased(KeyEvent ke) {
        // Not used in this demo
    }
    
    @Override
    public void keyTyped(KeyEvent ke) {
        // Not used in this demo
    }

    // -- ActionListener method --
    @Override
    public void actionPerformed(ActionEvent ae) {
        if (ae.getActionCommand().equals("Clear")) {
            ta.setText("");
            tf.setText("");
        }
    }

    public static void main(String[] args) {
        new EventDemo();
    }
}

B) Using Adapter Classes

This example demonstrates adapter classes, which provide empty implementations of all methods in an event listener interface. This allows you to override only the methods you need, resulting in cleaner code.

AdapterDemo.java

java
import java.awt.*;
import java.awt.event.*;

public class AdapterDemo extends Frame {
    Label statusLabel;

    public AdapterDemo() {
        // --- 1. Frame Setup ---
        setLayout(new FlowLayout());
        setTitle("Adapter Class Demo");
        setSize(400, 200);
        setVisible(true);

        // --- 2. Component Setup ---
        statusLabel = new Label("No event yet.");
        add(statusLabel);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });

        // Use MouseAdapter to handle mouse events.
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                statusLabel.setText("Mouse clicked at: (" 
	                + me.getX() + ", " + me.getY() + ")");
            }

            @Override
            public void mouseEntered(MouseEvent me) {
                statusLabel.setText("Mouse entered the window.");
            }
			
			@Override
            public void mouseExited(MouseEvent me) {
                statusLabel.setText("Mouse left the window.");
            }
        });
    }

    public static void main(String[] args) {
        new AdapterDemo();
    }
}

Longer Version

java
import java.awt.*;
import java.awt.event.*;

public class AdapterDemo extends Frame {
    public AdapterDemo() {
        setTitle("Adapter Demo");
        setSize(400, 200);
        
        // Add mouse listeners using our custom adapter classes
        addMouseListener(new MyMouseAdapter(this));
        addMouseMotionListener(new MyMouseMotionAdapter(this));

        // Use the standard WindowAdapter to handle closing the window
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
        
        setVisible(true);
    }

    // A method to display status messages in the frame's title bar
    public void showStatus(String msg) {
        setTitle(msg);
    }

    public static void main(String[] args) {
        new AdapterDemo();
    }
}

// Custom adapter class for mouse click events
class MyMouseAdapter extends MouseAdapter {
    AdapterDemo adapterDemo;

    public MyMouseAdapter(AdapterDemo adapterDemo) {
        this.adapterDemo = adapterDemo;
    }

    // We only override the method we need: mouseClicked()
    @Override
    public void mouseClicked(MouseEvent me) {
        adapterDemo.showStatus("Mouse clicked at (" 
	        + me.getX() + ", " + me.getY() + ")");
    }
}

// Custom adapter class for mouse motion events
class MyMouseMotionAdapter extends MouseMotionAdapter {
    AdapterDemo adapterDemo;

    public MyMouseMotionAdapter(AdapterDemo adapterDemo) {
        this.adapterDemo = adapterDemo;
    }

    // We only override the method we need: mouseDragged()
    @Override
    public void mouseDragged(MouseEvent me) {
        adapterDemo.showStatus("Mouse dragged at (" 
	        + me.getX() + ", " + me.getY() + ")");
    }
}

Made with ❤️ for students, by a fellow learner.