ColorBook
/*
AUTHOR: JoAnn Render
PROJECT: ColorBook
FILE: ColorBook.java
SUMMARY
This is a coloring/drawing program for kids and adults. Different
images (outline or normal) can be loaded and lines of varying color
and thickness can be drawn on top. Another option is to choose a
blank canvas for drawing. Text (the artist's name) can be added.
INPUT
The user selects a button for type of underlay, line color and line
thickness. A name can be entered in a text box.
OUTPUT
The user draws to create a whole picture or colored areas on top of
an underlay image. A name also can be added.
CLASS HIERARCHY
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Panel
java.applet.Applet
ColorBook
ASSUMPTIONS
The user loads the applet into Netscape and chooses one type of
underlay, one color and one line thickness for drawing.
*/
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
class NewCanvas extends Canvas
{
public NewCanvas(int width, int height)
{
setSize(width, height);
} // constructor
} // NewCanvas
public class ColorBook extends Applet implements ItemListener
{
private NewCanvas colorCanvas;
Color lcolor;
Image scratchPad;
int lwidth1 = 0;
int lwidth2 = 0;
int old_x, old_y, x, y;
int i;
Dimension spDimension;
Graphics spGraphics;
String signature;
int numberOfImages = 3;
Image[] myimg = new Image[3];
public void init()
{
CheckboxGroup myCheckboxGroup = new CheckboxGroup();
Checkbox red = new Checkbox("Red", myCheckboxGroup, false);
Checkbox green = new Checkbox("Green", myCheckboxGroup, false);
Checkbox blue = new Checkbox("Blue", myCheckboxGroup, false);
Checkbox orange = new Checkbox("Orange", myCheckboxGroup, false);
Checkbox black = new Checkbox("Black", myCheckboxGroup, true);
Button clearButton = new Button("Clear Lines");
Button blankButton = new Button("Blank Page");
Button thinButton = new Button("Thin Line");
Choice newChoice = new Choice();
Button mediumButton = new Button("Medium Line");
Button thickButton = new Button("Thick Line");
TextField myTextField = new TextField("Name");
MediaTracker tracker;
tracker = new MediaTracker(this);
myimg[0] = getImage(getDocumentBase(), "sun.gif");
tracker.addImage(myimg[0], 0);
myimg[1] = getImage(getDocumentBase(), "wood2.jpg");
tracker.addImage(myimg[1], 0);
myimg[2] = getImage(getDocumentBase(), "worm.gif");
tracker.addImage(myimg[2], 0); // load images
setLayout(new BorderLayout());
TopPanel np = new TopPanel();
add("North", np);
MyPanel sp = new MyPanel();
add("South", sp);
EastPanel ep = new EastPanel();
add("East", ep);
WestPanel wp = new WestPanel();
add("West", wp);
ep.setLayout(new GridLayout(1,1));
wp.setLayout(new GridLayout(1,1));
sp.setLayout(new GridLayout(3,1));
np.setLayout(new GridLayout(1,1)); // set up layout
Dimension d = getSize();
scratchPad = createImage(d.width, d.height);
spGraphics = scratchPad.getGraphics(); // set up double buffer
colorCanvas = new NewCanvas(5,10);
np.add(colorCanvas);
colorCanvas.setBackground(Color.red);
np.add(red);
colorCanvas = new NewCanvas(5,10);
np.add(colorCanvas);
colorCanvas.setBackground(Color.green);
np.add(green);
colorCanvas = new NewCanvas(5,10);
np.add(colorCanvas);
colorCanvas.setBackground(Color.blue);
np.add(blue);
colorCanvas = new NewCanvas(5,10);
np.add(colorCanvas);
colorCanvas.setBackground(Color.orange);
np.add(orange);
colorCanvas = new NewCanvas(5,10);
np.add(colorCanvas);
colorCanvas.setBackground(Color.black);
np.add(black); // radio buttons to control line color
red.addItemListener(this);
green.addItemListener(this);
blue.addItemListener(this);
orange.addItemListener(this);
black.addItemListener(this); // listeners for color buttons
sp.add(clearButton);
sp.add(newChoice);
newChoice.addItem("sun");
newChoice.addItem("wood");
newChoice.addItem("worm");
sp.add(blankButton); // buttons to control canvas/image
clearButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(i < numberOfImages && i >= 0)
{
spGraphics.drawImage(myimg[i], 100, 27, 550, 370, null);
}
else
{
spGraphics.setColor(getBackground());
spGraphics.fillRect(0, 0, getSize().width, getSize().height);
spGraphics.setColor(Color.black);
spGraphics.drawRect(100, 27, 549, 306);
spGraphics.setColor(lcolor);
}
repaint();
}
}); // clearButton Listener
newChoice.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
Object whichstring = e.getItem();
if (whichstring.equals("sun"))
{
i = 0;
spGraphics.drawImage(myimg[i], 100, 27, 550, 370, null);
}
else if (whichstring.equals("wood"))
{
i = 1;
spGraphics.drawImage(myimg[i], 100, 27, 550, 370, null);
}
else if (whichstring.equals("worm"))
{
i = 2;
spGraphics.drawImage(myimg[i], 100, 27, 550, 370, null);
}
repaint();
}
}); // newChoice Listener
blankButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (i < numberOfImages && i >= 0 )
{
i = -1;
}
spGraphics.setColor(getBackground());
spGraphics.fillRect(0, 0, getSize().width, getSize().height);
spGraphics.setColor(Color.black);
spGraphics.drawRect(100, 27, 549, 306);
spGraphics.setColor(lcolor);
repaint();
}
}); // blankButton Listener
sp.add(thinButton);
sp.add(mediumButton);
sp.add(thickButton); // buttons to control line thickness
thinButton.addActionListener(new ActionListener ()
{
public void actionPerformed(ActionEvent e)
{
lwidth1 = 0;
lwidth2 = 0;
}
}); // thinButton Listener
mediumButton.addActionListener(new ActionListener ()
{
public void actionPerformed(ActionEvent e)
{
lwidth1 = 1;
lwidth2 = 0;
}
}); // mediumButton Listener
thickButton.addActionListener(new ActionListener ()
{
public void actionPerformed(ActionEvent e)
{
lwidth1 = 1;
lwidth2 = 2;
}
}); // thickButton Listener
sp.add(myTextField); // add text field for name
myTextField.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
signature = e.getActionCommand();
spGraphics.setColor(lcolor);
spGraphics.setFont(new Font("Serif", Font.ITALIC, 18));
spGraphics.drawString(signature, 525, 320);
repaint();
}
}); // myTextField Listener
this.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
old_x = e.getX();
old_y = e.getY();
}
}); // MouseListener
this.addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent e)
{
int x = e.getX(), y = e.getY();
spGraphics.setColor(lcolor);
spGraphics.drawLine(old_x, old_y + lwidth2, x, y + lwidth2);
spGraphics.drawLine(old_x, old_y + lwidth1, x , y + lwidth1);
spGraphics.drawLine(old_x, old_y, x, y);
spGraphics.drawLine(old_x, old_y - lwidth1, x, y - lwidth1);
spGraphics.drawLine(old_x, old_y - lwidth2, x, y - lwidth2);
old_x = x;
old_y = y;
repaint();
}
}); // MouseMotionListener
} // init
public void paint(Graphics g)
{
update(g);
} // paint
public final void update (Graphics g)
{
g.drawImage(scratchPad, 0, 0, this);
// g.drawRect(getLocation().x, getLocation().y, getSize().width, getSize().height);
} // update
public void itemStateChanged(ItemEvent e)
{
String command = (String) e.getItem();
if (command.equals("Red"))
{
lcolor = Color.red;
spGraphics.setColor(lcolor);
}
else if (command.equals("Green"))
{
lcolor = Color.green;
spGraphics.setColor(lcolor);
}
else if (command.equals("Blue"))
{
lcolor = Color.blue;
spGraphics.setColor(lcolor);
}
else if (command.equals("Orange"))
{
lcolor = Color.orange;
spGraphics.setColor(lcolor);
}
else if (command.equals("Black"))
{
lcolor = Color.black;
spGraphics.setColor(lcolor);
}
repaint();
} // itemStateChanged
} // ColorBook
class MyPanel extends Panel {
public Insets getInsets()
{
return new Insets(2, 150, 400, 150);
}
} // MyPanel Insets
class TopPanel extends Panel {
public Insets getInsets()
{
return new Insets(2, 65, 2, 65);
}
} // TopPanel Insets
class EastPanel extends Panel {
public Insets getInsets()
{
return new Insets(2, 50, 2, 50);
}
} // EastPanel Insets
class WestPanel extends Panel {
public Insets getInsets()
{
return new Insets(2, 50, 2, 50);
}
} // WestPanel Insets