Java tutorial
import java.awt.Canvas; import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.util.Vector; import javax.swing.JApplet; import javax.swing.JFrame; import javax.swing.JPanel; public class ManyGeneralPath extends JApplet { DrawingCanvas canvas; public static void main(String[] a) { JFrame f = new JFrame(); ManyGeneralPath path = new ManyGeneralPath(); path.init(); f.getContentPane().add(path); f.setDefaultCloseOperation(1); f.setSize(650, 250); f.setVisible(true); } public void init() { Container container = getContentPane(); JPanel panel = new JPanel(); canvas = new DrawingCanvas(); container.add(canvas); } class DrawingCanvas extends Canvas { Vector generalPaths; GeneralPath selectedGPath = null; Rectangle2D boundingRec = null; int selectedRule = GeneralPath.WIND_NON_ZERO; boolean drawNoFill = false; public DrawingCanvas() { setBackground(Color.white); setSize(400, 200); generalPaths = new Vector(); GeneralPath gp1, gp2, gp3, gp4, gp5, gp6, gp7, gp8; gp1 = new GeneralPath(); gp1.moveTo(50, 10); gp1.lineTo(70, 80); gp1.lineTo(90, 40); gp1.lineTo(10, 40); gp1.lineTo(50, 80); gp1.closePath(); generalPaths.addElement(gp1); gp2 = new GeneralPath(); gp2.moveTo(120, 20); gp2.lineTo(180, 20); gp2.lineTo(120, 80); gp2.lineTo(180, 80); gp2.closePath(); generalPaths.addElement(gp2); gp3 = new GeneralPath(); gp3.moveTo(220, 20); gp3.lineTo(280, 20); gp3.lineTo(280, 60); gp3.lineTo(240, 60); gp3.lineTo(240, 40); gp3.lineTo(260, 40); gp3.lineTo(260, 80); gp3.lineTo(220, 80); gp3.closePath(); generalPaths.addElement(gp3); gp4 = new GeneralPath(); gp4.moveTo(310, 20); gp4.lineTo(380, 20); gp4.lineTo(380, 80); gp4.lineTo(320, 80); gp4.lineTo(320, 10); gp4.lineTo(340, 10); gp4.lineTo(340, 60); gp4.lineTo(360, 60); gp4.lineTo(360, 40); gp4.lineTo(310, 40); gp4.closePath(); generalPaths.addElement(gp4); gp5 = new GeneralPath(); gp5.moveTo(50, 120); gp5.lineTo(70, 180); gp5.lineTo(20, 140); gp5.lineTo(80, 140); gp5.lineTo(30, 180); gp5.closePath(); generalPaths.addElement(gp5); gp6 = new GeneralPath(); gp6.moveTo(120, 180); gp6.quadTo(150, 120, 180, 180); gp6.closePath(); generalPaths.addElement(gp6); gp7 = new GeneralPath(); gp7.moveTo(220, 150); gp7.curveTo(240, 130, 280, 160, 300, 140); gp7.lineTo(300, 180); gp7.quadTo(260, 160, 220, 180); gp7.closePath(); generalPaths.addElement(gp7); gp8 = new GeneralPath(); gp8.moveTo(360, 100); gp8.lineTo(360, 200); gp8.lineTo(400, 140); gp8.lineTo(320, 120); gp8.lineTo(400, 180); gp8.lineTo(320, 180); gp8.closePath(); generalPaths.addElement(gp8); } public void paint(Graphics g) { Graphics2D g2D = (Graphics2D) g; for (int i = 0; i < generalPaths.size(); i++) { if (drawNoFill) { g2D.draw((GeneralPath) generalPaths.elementAt(i)); } else { g2D.fill((GeneralPath) generalPaths.elementAt(i)); } } } } }