Action Events in JDK 1.0.x

Action Events

Action events are those typically activated by subclasses of Component:

  • Button
  • Checkbox
  • Choice
  • List
  • MenuItem
  • TextField

Action events are instances of class Event with:

id == ACTION_EVENT

The action() method

The Component.handleEvent() method provides an event dispatching mechanism, whereby, if you override certain convenience methods in your derived class, it is relatively simple to handle events.

Mouse events had convenience methods like mouseDown()

Action events have a convenience method action()

Example: Responding to Button clicks

Remember the FlowLayout example?

import java.awt.*;

class Actions extends Frame
{
    public boolean handleEvent(Event e)
    {
        if (e.id == Event.WINDOW_DESTROY)
            System.exit(0);
        return super.handleEvent(e);
    }

    public Actions()
    {
        setTitle("SimpleGUI");
        setBackground(Color.lightGray);
        setLayout(new FlowLayout());
        add(new Button("Yellow"));
        add(new Button("Blue"));
        add(new Button("Orange"));
        add(new Button("Cyan"));
        add(new Button("Pink"));
        add(new Button("Red"));
        add(new Button("White"));
    }

    public boolean action(Event evt, Object arg)
    {
        Color back;
        if (arg.equals("Yellow"))
            back = Color.yellow;
        else if (arg.equals("Blue"))
            back = Color.blue;
        else if (arg.equals("Orange"))
            back = Color.orange;
        else if (arg.equals("Cyan"))
            back = Color.cyan;
        else if (arg.equals("Pink"))
            back = Color.pink;
        else if (arg.equals("Red"))
            back = Color.red;
        else if (arg.equals("White"))
            back = Color.white;
        else
            return super.action(evt, arg);
        setBackground(back);
        repaint();
        return true;
    }

    public static void main(String[] args)
    {
        Frame f = new Actions();
        f.resize(300, 200);
        f.show();
    }
}
 

Example: Making the ClockCanvas Work

import java.awt.*;

class Actions extends Frame
{
    public boolean handleEvent(Event e)
    {
        if (e.id == Event.WINDOW_DESTROY)
            System.exit(0);
        return super.handleEvent(e);
    }

    public boolean action(Event evt, Object arg)
    {
        if (arg.equals("Tick"))
            m_clock.tick();
        else if (arg.equals("Reset"))
	    m_clock.reset();
	else if (arg.equals("Close"))
	    System.exit(0);
	else
	    return super.action(evt, arg);
	return true;
    }

    public Actions()
    {
        setTitle("Actions");
        setBackground(Color.lightGray);
        Panel p = new Panel(new FlowLayout());
        p.add(new Button("Tick"));
        p.add(new Button("Reset"));
        p.add(new Button("Close"));
        add("South", p);
        m_clock = new ClockCanvas();
        m_clock.setBackground(Color.white);
        add("Center", m_clock);
    }

    public static void main(String[] args)
    {
        Frame f = new Actions();
        f.resize(300, 200);
        f.show();
    }

    ////////// Data ////////////
    private ClockCanvas m_clock;
}

class ClockCanvas extends Canvas
{
    public void paint(Graphics g)
    {
        g.drawOval(0, 0, 100, 100);
        double hourAngle = 2 * Math.PI *
                            (m_minutes - 3*60)/(12*60);
        double minuteAngle = 2 * Math.PI *
                            (m_minutes - 15)/60;
        g.drawLine(50, 50,
                   50 + (int)(30 * Math.cos(hourAngle)),
                   50 + (int)(30 * Math.sin(hourAngle)));
        g.drawLine(50, 50,
                   50 + (int)(45 * Math.cos(minuteAngle)),
                   50 + (int)(45 * Math.sin(minuteAngle)));
    }

    public void reset()
    {
        m_minutes = 0;
        repaint();
    }

    public void tick()
    {
        m_minutes++;
        repaint();
    }

    //////////// Data //////////////
    private int m_minutes = 0;
}
 

 

Identifying Components by Label String Considered Dangerous

It's usually not a good idea in a real application that is likely to change (and what application doesn't?) to identify the component by its label/string. It certainly isn't internationalizable!

Instead, it's better to test the component directly against the set of known components:

import java.awt.*;

class Actions extends Frame
{
    public boolean handleEvent(Event e)
    {
        if (e.id == Event.WINDOW_DESTROY)
            System.exit(0);
        return super.handleEvent(e);
    }

    public boolean action(Event evt, Object arg)
    {
        String target;
        if (evt.target == m_ok)
            target = "OK";
        else if (evt.target == m_cancel)
            target = "Cancel";
        else if (evt.target == m_help)
            target = "Help";
        else
	    return super.action(evt, arg);
        m_which.setText("You pressed the " + target + " button");
	return true;
    }

    public Actions()
    {
        setTitle("Actions");
        setBackground(Color.lightGray);
        Panel p1 = new Panel();
        p1.add("Center", m_which);
        add("Center", p1);
        Panel p2 = new Panel(new FlowLayout());
        p2.add(m_ok);
        p2.add(m_cancel);
        p2.add(m_help);
        add("South", p2);
    }

    public static void main(String[] args)
    {
        Frame f = new Actions();
        f.resize(300, 200);
        f.show();
    }

    ////////// Data ////////////
    private Button m_ok = new Button("OK");
    private Button m_cancel = new Button("Cancel");
    private Button m_help = new Button("Help");
    private Label  m_which =
        new Label("Welcome to the Actions application!");
}

 

 

Example: A Simple Text Editing Application

import java.awt.*;

class Actions extends Frame
{
    public boolean handleEvent(Event e)
    {
        if (e.id == Event.WINDOW_DESTROY)
            System.exit(0);
        return super.handleEvent(e);
    }

    public boolean action(Event evt, Object arg)
    {
        if (evt.target == m_replace)
        {
            String from = m_from.getText();
            String to   = m_to.getText();
            int n = m_text.getText().indexOf(from);
            if (n >= 0 && from.length() > 0)
                m_text.replaceText(to, n, n + from.length());
        }
        else
	    return super.action(evt, arg);
	return true;
    }

    public Actions()
    {
        setTitle("Actions");
        setBackground(Color.lightGray);
        Panel p = new Panel(new FlowLayout());
        p.add(m_replace);
        p.add(m_from);
        p.add(new Label("with"));
        p.add(m_to);
        add("South", p);
        add("Center", m_text);
    }

    public static void main(String[] args)
    {
        Frame f = new Actions();
        f.resize(350, 200);
        f.show();
    }

    ////////// Data ////////////
    private Button m_replace = new Button("Replace");
    private TextField m_from = new TextField(10);
    private TextField m_to   = new TextField(10);
    private TextArea  m_text = new TextArea(8, 40);
}

 

 

Example: A Self-Modifying Menu Application

import java.awt.*;
import java.util.Vector;
import FrameWithMenuBar.*;

public class SelfModifyingTest extends FrameWithMenuBar
{
    public void exit(int ret)
    {
        System.exit(ret);
    }

    public boolean handleEvent(Event event)
    {
        if (event.id == Event.WINDOW_DESTROY)
           exit(0);
        return super.handleEvent(event);
    }

    public boolean action(Event event, Object arg)
    {
        if (event.target == m_quitItem)
           exit(0);
        else if (event.target instanceof MenuItem)
           return m_selfModifyingMenu.action(event, arg);
        return super.action(event, arg);
    }

    public void createMenus(MenuBar mbar)
    {
        mbar.add(createFileMenu());
        mbar.add(m_selfModifyingMenu = new SelfModifyingMenu());
    }

    private Menu createFileMenu()
    {
        Menu fileMenu = new Menu("File");
        fileMenu.add(m_quitItem = new MenuItem("Quit"));
        return fileMenu;
    }

    public SelfModifyingTest(String s)
    {
        super(s);
    }

    public static void main(String args[])
    {
        Frame frame =
            new SelfModifyingTest("SelfModifying Menu Test");

        frame.reshape(100,100,300,200);
        frame.show();
    }

    ///////////// Data /////////////////
    private SelfModifyingMenu m_selfModifyingMenu;
    private MenuItem          m_quitItem;
}

class SelfModifyingMenu extends Menu
{
    public SelfModifyingMenu()
    {
        super("Self Modifying Menu", true);

        add(m_enablerItem = new MenuItem("Disable Item Below"));
        add(m_toggleItem  = new MenuItem("Enable/Disable Me"));
        addSeparator();

        add(m_addItem    = new MenuItem("Add a MenuItem ..."));
        add(m_removeItem = new MenuItem("Remove a MenuItem ..."));
        m_addItem.setFont(new Font("TimesRoman", Font.BOLD, 12));
        addSeparator();
    }

    public boolean action(Event event, Object arg)
    {
        if ( (event.target == m_enablerItem)
          || (event.target == m_toggleItem)
           )
            toggleItem();
        else if (event.target == m_addItem)
            addItem();
        else if (event.target == m_removeItem)
            removeLastItem();
        else
            return false;
        return true;
    }

    public void addItem()
    {
        MenuItem newItem =
            new MenuItem("Extra Item #" + m_newItems.size());

        add(newItem);
        m_newItems.addElement(newItem);
    }

    public void removeLastItem()
    {
        if (m_newItems.size() == 0)
            System.out.println("Hey, nothing to remove!");
        else
        {
            MenuItem removeMe =
                (MenuItem)m_newItems.lastElement();

            remove(removeMe);
            m_newItems.removeElement(removeMe);
        }
    }

    public void toggleItem()
    {
        if (m_toggleItem.isEnabled())
        {
            m_toggleItem.disable();
            m_enablerItem.setLabel("Enable Item Below");
        }
        else
        {
            m_toggleItem.enable();
            m_enablerItem.setLabel("Disable Item Below");
        }
    }

    ////////////// Data ///////////////////////
    private Vector   m_newItems = new Vector();
    private MenuItem m_toggleItem,
                     m_enablerItem,
                     m_addItem,
                     m_removeItem;
}

Example: A Dialog Application

import java.awt.*;
import FrameWithMenuBar.*;
import MessageBox.*;

class Dialogs extends FrameWithMenuBar
{
    public boolean handleEvent(Event e)
    {
        if ( (e.id == Event.WINDOW_DESTROY)
          && (e.target == this)
           )
            System.exit(0);
        return super.handleEvent(e);
    }

    public boolean action(Event event, Object arg)
    {
        if (event.target instanceof MenuItem)
        {
            if (event.target == m_new)
                newFile();
            else if (event.target == m_open)
                openFile();
            else if (event.target == m_save)
                saveFile();
            else if (event.target == m_saveAs)
                saveAsFile();
            else if (event.target == m_quit)
                exit(0);
            else return super.action(event, arg);
        }
        return false;
    }

    public void createMenus(MenuBar menubar)
    {
        menubar.add(createFileMenu());
    }

    public Dialogs(String title)
    {
        super(title);
    }

    public static void main(String[] args)
    {
        Frame f = new Dialogs("Dialogs");
        f.resize(300, 260);
        f.show();
    }

    ///////////// Private methods //////////
    private Menu createFileMenu()
    {
        Menu fileMenu = new Menu("File", true);
        fileMenu.add(m_new = new MenuItem("New..."));
        fileMenu.add(m_open = new MenuItem("Open..."));
        fileMenu.add(m_save = new MenuItem("Save"));
        fileMenu.add(m_saveAs = new MenuItem("Save As..."));
        fileMenu.addSeparator();
        fileMenu.add(m_quit = new MenuItem("Quit..."));
        return fileMenu;
    }

    private void newFile()
    {
        FileDialog file =
            new FileDialog(this, "Create File", 
				FileDialog.LOAD);
        file.show();
    }

    private void openFile()
    {
        FileDialog file =
            new FileDialog(this, "Open File", 
				FileDialog.LOAD);
        file.show();
    }

    private void saveFile()
    {
        // Usually, Save file doesn't prompt...
    }

    private void saveAsFile()
    {
        FileDialog file =
            new FileDialog(this, "Save As File", 
				FileDialog.SAVE);
        file.show();
    }

    private void exit(int ret)
    {
        MessageBox box = new MessageBox(this, 
				"Quit: Are you sure?");
        box.show();
    }

    ///////////// Data ///////////////
    private MenuItem m_new;
    private MenuItem m_open;
    private MenuItem m_save;
    private MenuItem m_saveAs;
    private MenuItem m_quit;
}
package MessageBox;
import java.awt.*;

public class MessageBox extends Dialog
{
    public MessageBox(Frame f, String message)
    {
        super(f, "Message", true /* modal */ );
        Panel p1 = new Panel();
        p1.add(new Label(message));
        add("Center", p1);

        Panel p2 = new Panel();
        p2.add(m_ok = new Button("OK"));
        p2.add(m_cancel = new Button("Cancel"));
        add("South", p2);
        resize(220, 150);
    }

    public boolean handleEvent(Event evt)
    {
        if ( (evt.id == Event.WINDOW_DESTROY)
          && (evt.target == this)
           )
            dispose();   // Clean up the message box
        else
            return super.handleEvent(evt);
        return true; // event handled
    }

    public boolean action(Event evt, Object arg)
    {
        if (evt.target == m_ok)
        {
           dispose();
           Component parent = getParent();
           parent.postEvent(new Event(parent, 
			    Event.WINDOW_DESTROY, null));
        }
        if (evt.target == m_cancel)
           dispose();
        else
           return super.action(evt, arg);
        return true;
    }

    ////////////// Data ///////////////////

    private Button m_ok;
    private Button m_cancel;
}
 

This page was last modified on 02 October, 2007