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




|