JavaExempelScribble i JavaVidareutveckling
[ Hem ] Allmänt ASP XML SQL ADO HTML CSS VB Java Design Karta
Grunderna Exempel

Vidareutveckling

 Scribble i Java
* Vidareutveckling
* MyStroke klassen
* Några frågor

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

  Scribble i JavaMyStroke klassen
Exempel
Färgblandare
EuroKalkylator
Editor
Animerade bilder ...
Scribble i VB
Scribble i Java ...


Top
< Scribble i Java MyStroke klassen>
© Anders Enges, Vörå 2002  | 27.03.01 11:45 Visa asp koden