Vi vidareutvecklar Scribble
Tema:
- Vector klassen
- paint funktionen
Både vår Applet och VB programmet lider bägge av samma problem: 
de "slarvar bort" teckningen om man tar fram ett annat program som täcker vårt program.
Detta beror på att vi bara ritar i fönstret men sparar inte koordinaterna. När fönstret
ritas om kommer programmet att rita ett tomt fönster. Detta är något pinsamt och 
borde kanske avhjälpas...
Detta kommer vi att lösa i flera steg
Steg 1 - sätt dit en paint funktion i MyDrawing klassen
  
Observera att kod märkt med fetstil är ny. övrig kod skall inte modifieras, eller tas bort. Jag har dock plockat bort en hel del kod för att få kortare sidor.
/* 
----------------------------------------------------------
class MyDrawing 
----------------------------------------------------------
*/
class MyDrawing extends Panel implements MouseMotionListener,MouseListener
{
    private Point lastPoint = new Point( );
    private boolean isDrawing = false;
    // paint funktion 	
    // denna funktion körs automatiskt när programmet behöver ritas om
    public void paint( Graphics g)
    {
        // Här borde vi göra någonting vettigt...
    }
    // resten av klassen ännu oförändrad
    
I paint funktionen har vi panelens Graphics och behöver bara  använda t.ex. drawLine. 
Problemet är bara att vi inte vet vd vi skall rita eftersom vi aldrig tagit 
vara på koordinaterna.
Om vi föregående kapitels kod så så ser vi att det för varje gång vi drar ett 
streck vi att generera ett antal punkter i en färg
Vi behöver ha någonstans att spara dessa punkter. För tillfället bortser vi från färgerna.
Steg 2 - lagra punkterna i en variabel
  
I Java, i likhet med de flesta andra programmeringsspråk, finns Arrays. En möjlighet 
skulla vara att skapa en Array med punkter. Nackdelen med Arrays är att de har en fast storlek, och 
vi vet ju inte riktigt hur många punkter vi behöver.
Vid en genomsökning av Java hjälp hittar man en klass benämns Vector, som har den egenskapen at den kan växa vid behov.
Modifiera programmet på följande sätt (fetstil betyder nytillsatt):
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.Vector;
public class ScribbleApplet extends Applet
{
    public void init()
    {   
        this.setLayout(new BorderLayout());
        this.add("Center", new MyDrawing());
    }
}
class MyDrawing extends Panel implements MouseMotionListener, MouseListener 
{
    // ----------------------------------------------------
    private Vector allStrokes = new Vector();
    // ----------------------------------------------------
    private Point lastPoint = new Point();
    private boolean isDrawing = false;
    public MyDrawing()
    {
        this.addMouseListener( this );
        this.addMouseMotionListener( this );
        this.setBackground(new Color(255,255,255));
    }
    public void paint(Graphics g)
    {
        // ----------------------------------------------------
        int antal  = allStrokes.size();
        // börja alltid från den andra, så kan vi 
        // enkelt härleda den föregående
        for (int i = 1 ; i < antal; i++)
        {
            // (Point) i nedanstående rader betyder att vi säger åt Vektorn att 
            // det objekt den har haft hand om faktiskt är en Point. 
            Point p1 = (Point) allStrokes.elementAt(i);
            Point p2 = (Point) allStrokes.elementAt(i-1);
            g.drawLine(p1.x, p1.y, p2.x, p2.y);
        }
        // ----------------------------------------------------
    }
    public void mouseMoved(MouseEvent e) {  }
    public void mouseClicked(MouseEvent e) 
    { 
        if (e.getClickCount() > 1)
        {
            // ----------------------------------------------------
            allStrokes.removeAllElements();
            // ----------------------------------------------------            
            this.repaint();
        }
    }
    public void mousePressed(MouseEvent e) { }
    public void mouseEntered(MouseEvent e) { }
    public void mouseExited(MouseEvent e) { }
    public void mouseDragged(MouseEvent e) 
    {
        if (isDrawing)
        {
            int modifier = e.getModifiers();
            if ( (modifier & MouseEvent.BUTTON1_MASK ) == modifier )
            {
                this.setForeground( Color.blue );
            }
            else 
            {
                this.setForeground( Color.red );        
            }
            if ( e.isShiftDown() )
            {
                this.setForeground( Color.black );
            }
            this.getGraphics().drawLine(lastPoint.x , 
                                        lastPoint.y , 
                                        e.getPoint().x , 
                                        e.getPoint().y
                                        );
        }
        // ----------------------------------------------------
        allStrokes.addElement(e.getPoint());
        // ----------------------------------------------------
        lastPoint = e.getPoint();
        isDrawing = true;
    }
    public void mouseReleased(MouseEvent e) 
    {
        isDrawing = false;
    }
}
Prova programmet i nuvarande skick