package examples; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import java.io.*; /* * @author Kenneth J. Goldman * Created: Mar 5, 2007 * * */ public class EventRecorder extends EventQueue { LinkedList events = new LinkedList(); EventQueue eventQueue = java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue(); Component toWatch; boolean recording; public EventRecorder(Component toWatch) { this.toWatch = toWatch; } public void startRecording() { events.clear(); if (!recording) { eventQueue.push(this); recording = true; } } protected void dispatchEvent(AWTEvent event) { if (event instanceof InputEvent) { events.addLast(new EventInfo((InputEvent) event, toWatch)); } super.dispatchEvent(event); } public EventInfo[] stopRecording() { if (recording) { pop(); recording = false; return events.toArray(new EventInfo[0]); } return null; } static class ButtonPanel extends JPanel { JToggleButton startButton = new JToggleButton(); JToggleButton stopButton = new JToggleButton(); JToggleButton playButton = new JToggleButton(); ButtonGroup group = new ButtonGroup(); EventRecorder recorder ; EventPlayer player; EventInfo[] events; ButtonPanel(final Component stage) throws AWTException { recorder = new EventRecorder(stage); player = new EventPlayer(); setLayout(new FlowLayout()); startButton.setAction(new AbstractAction("record") { public void actionPerformed(ActionEvent ae) { recorder.startRecording(); } }); stopButton.setAction(new AbstractAction("stop") { public void actionPerformed(ActionEvent ae) { events = recorder.stopRecording(); } }); playButton.setAction(new AbstractAction("play") { public void actionPerformed(ActionEvent ae) { player.play(events, stage); events = null; } }); add(startButton); add(stopButton); add(playButton); group.add(startButton); group.add(stopButton); group.add(playButton); } } @SuppressWarnings("serial") static class RecordingFrame extends JFrame { RecordingFrame(Component stage) throws AWTException { setLayout(new BorderLayout()); add(new ButtonPanel(stage), BorderLayout.NORTH); add(stage, BorderLayout.CENTER); add(new JTextField("You can type in here."), BorderLayout.SOUTH); // just for demonstration setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300,300); setVisible(true); } } @SuppressWarnings("serial") public static void main(String[] args) throws AWTException { Scribble s = new Scribble(); new Scribble.Controller(s); new RecordingFrame(s); } }