// This example is from _Java Examples in a Nutshell_. (http://www.oreilly.com) // Copyright (c) 1997 by David Flanagan // This example is provided WITHOUT ANY WARRANTY either expressed or implied. // You may study, use, modify, and distribute it for non-commercial purposes. // For any commercial use, see http://www.davidflanagan.com/javaexamples import java.applet.*; import java.awt.*; import java.awt.event.*; /** The application class. Processes high-level commands sent by GUI */ public class Scribble5 { /** main entry point. Just create an instance of this application class */ public static void main(String[] args) { new Scribble5(); } /** Application constructor: create an instance of our GUI class */ public Scribble5() { window = new ScribbleGUI(this); } protected Frame window; /** This is the application method that processes commands sent by the GUI */ public void doCommand(String command) { if (command.equals("clear")) { // clear the GUI window // It would be more modular to include this functionality in the GUI // class itself. But for demonstration purposes, we do it here. Graphics g = window.getGraphics(); g.setColor(window.getBackground()); g.fillRect(0, 0, window.getSize().width, window.getSize().height); } else if (command.equals("print")) {} // not yet implemented else if (command.equals("quit")) { // quit the application window.dispose(); // close the GUI System.exit(0); // and exit. } } } /** This class implements the GUI for our application */ class ScribbleGUI extends Frame { int lastx, lasty; // remember last mouse click Scribble5 app; // A reference to the application, to send commands to. /** * The GUI constructor does all the work of creating the GUI and setting * up event listeners. Note the use of local and anonymous classes. */ public ScribbleGUI(Scribble5 application) { super("Scribble"); // Create the window app = application; // Remember the application reference // Create three buttons Button clear = new Button("Clear"); Button print = new Button("Print"); Button quit = new Button("Quit"); // Set a LayoutManager, and add the buttons to the window. this.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 5)); this.add(clear); this.add(print); this.add(quit); // Here's a local class used for action listeners for the buttons class ScribbleActionListener implements ActionListener { private String command; public ScribbleActionListener(String cmd) { command = cmd; } public void actionPerformed(ActionEvent e) { app.doCommand(command); } } // Define action listener adapters that connect the buttons to the app clear.addActionListener(new ScribbleActionListener("clear")); print.addActionListener(new ScribbleActionListener("print")); quit.addActionListener(new ScribbleActionListener("quit")); // Handle the window close request similarly this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { app.doCommand("quit"); } }); // High-level action events are passed to the application, but we // still handle scribbling right here. Register a MouseListener object. this.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { lastx = e.getX(); lasty = e.getY(); } }); // Define, instantiate and register a MouseMotionListener object this.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { Graphics g = getGraphics(); int x = e.getX(), y = e.getY(); g.setColor(Color.black); g.drawLine(lastx, lasty, x, y); lastx = x; lasty = y; } }); // Finally, set the size of the window, and pop it up this.setSize(400, 400); this.show(); } }