Click here to run simple hangman drawing applet.
Here is the HTML code for the applet:
<HTML> <HEAD> <TITLE> Drawing Hamgan</TITLE> </HEAD>
<BODY> <CENTER> <H1> Simple Drawing of Hangman </H1> <P> <HR>
<APPLET CODE="controller.HangmanController.class" WIDTH = 400 HEIGHT = 350> </APPLET> <HR> <P> </CENTER> </BODY> </HTML>
Click here for all the source code.
package model;
import java.awt.*;
import model.bodyPart.*;
/**
* This simplified version of the model has no adapters to play the game.
* There is no game to play here. Just a few ABodyPart to display via the
* paint() method.
* The IPaintAdapter installed by the controller will call the HangmanGame to
* paint(...).
*/
public class HangmanGame {
/**
* A few ABodyPart to be drawn.
*/
private ABodyPart _noose = new NoosePart(null, null);
private ABodyPart _rightArm = new RArmPart(null);
private ABodyPart _torso = new TorsoPart(null);
/**
* Paints the visible body parts on the supplied Graphics context.
* @param g The Graphics context to draw on.
*/
public void paint(Graphics g) {
// FOR ILLUSTRATION ONLY:
System.out.println("HangmanGame.paint()...");
_noose.draw(g); _rightArm.draw(g); _torso.draw(g); } }
package view;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* Serves as a view to Hangman.
* Has a JPanel where the body parts are painted.
* Uses a JApplet to supply the Graphics context for the JPamel to draw the body
* parts.
* To paint something in Java, we need to paint on a JPanel and override
* its paintComponent(...) method.
* Everytime the JPanel needs repainting, it will call paintComponent(...).
* For example, when the JFrame or a JApplet that contains the JPanel is
* resized, it will try to update all of its contents, in particular it will
* call its JPanel to update, which in turns will schedule a call to
* repaint(...), which in turn will call paintComponent(...)!
*/
public class HangmanGUI {
/**
* The GUI component that holds all other GUI components.
*/
private JApplet _applet;
/**
* The adapter used to communicate with the model to tell it to paint the
* body parts.
*/
private IPaintAdapter _paintAdapter;
/**
* A panel derived from a JPanel where the body parts are drawn.
* The JPanel's paintComponent() method is overriden so that the gallows is
* automatically drawn when the panel is repainted.
*/
private JPanel _displayPanel = new JPanel() {
public void paintComponent(Graphics g) { // called whenever the panel is
// repainted. The graphics context g is supplied by the GUI
// component that contains this JPanel.
super.paintComponent(g); // do whatever usually is done,
// e.g. clear the panel.
g.setColor(Color.black); // set the drawing color
g.fillRect(0,220,200,5); // base of scaffold
g.fillRect(0,0,70,5); // top of scaffold
g.fillRect(0,0,5,220); // side of scaffold
// FOR ILLUSTRATION ONLY:
System.out.println("HangmanGUI._displayPanel.paintComponent() " +
"calling _paintAdapter.paint()...");
// Delegate to the adapter to get the body parts drawn:
_paintAdapter.paint(g);
}
};
/**
* Initializes the GUI components.
* @param a the applet that holds all GUI components.
* @param pa The IPaintAdapter object used for requesting that the model
* paint the body parts.
*/
public HangmanGUI(JApplet a, IPaintAdapter pa) {
if (null == a || null == pa) {
throw new IllegalArgumentException("HangmanGUI(...) has null " +
"arguments!");
}
// FOR ILLUSTRATION ONLY:
System.out.println("HangmanGUI.constructor initializing _displayPanel "
+ "and _applet...");
_applet = a;
_paintAdapter = pa;
guiInit();
}
/**Component initialization*/
private void guiInit() {
_displayPanel.setBackground(Color.white);
_applet.setSize(400, 350);
Container contentPane = _applet.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(_displayPanel, BorderLayout.CENTER);
}
}
package view;
import java.awt.*;
/**
* Adapter used by the HangmanGUI (view) to get the HangmanGame (model)
* to paint the body parts onto the supplied Graphics context.
*/
public interface IPaintAdapter {
/**
* Paints the body parts onto a given Graphics context.
* @param g The Graphics context to paint on.
*/
public abstract void paint(Graphics g);
}
package controller;
import model.*;
import view.*;
import javax.swing.*;
import java.awt.*;
/**
* The controller implemented as a JApplet to instantiate and connect the
* HangmanGame (the model) and the HangmanGUI (the view) via adapters.
* The controller also instantiates the adapter(s).
* The adapter(s) is(are) implemented as anonymous inner class(es) to take advantage
* of closure.
*/
public class HangmanController extends JApplet{
private HangmanGUI _gui;
private HangmanGame _hangman;
/**
* Instantiates the HangmanGame, HangmanFrame, and connects them together
* using anonymous inner class IPaintAdapter.
* In this simplified version, there is no game playing, so there is no
* need for loose and/or win adapters.
*/
public void init() {
_hangman = new HangmanGame();
_gui = new HangmanGUI(this, new IPaintAdapter() {
public void paint(Graphics g) {
// FOR ILLUSTRATION ONLY:
System.out.println("anonymous IPaintAdapter.paint() calling " +
"_hangman.paint()...");
_hangman.paint(g);
}
});
}
/**
* Runs as a stand-alone GUI application with a main frame that contains
* a HangmanController JApplet.
* @param nu not used.
*/
public static void main(String[] nu) {
JFrame frame = new AFrame("Simple Hangman Drawing") {
protected void initialize() {
HangmanController controller = new HangmanController();
controller.init();
getContentPane().add(controller, "Center");
setSize(400, 400);
setVisible(true);
}
};
frame.validate();
}
}