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

MyStroke klassen

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

Steg 3 - dela upp teckningen i separata streck

    Tema:
  • Vector klassen
  • Egendefinierade klasser

För att kunna förbättra programmet måste vi inse att när vi trycker ner musknappen och flyttar musen så kommer vi attt få en samling av punkter. När vi sedan släpper musknappen och trycker ner den igen på ett nytt ställe kommer det att bli en ny samling punkter.

Detta gör att en teckning kommer att bestå av en Vektor med "Strokes", där varje stroke i sin tur har en vektor med punkter och en färg.

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();
    // ----------------------------------------------------
    // en egen klass för "strokes". finns senare i texten    
    private MyStroke thisStroke = new MyStroke();
    // ----------------------------------------------------    
    private Point lastPoint = new Point();
    private boolean isDrawing = false;
    public MyDrawing()
    {
        this.addMouseListener( this );
        this.addMouseMotionListener( this );
        this.setBackground(new Color(255,255,255));
    }
    // ----------------------------------------------------
    // rätt mycket ändrad paint 
    public void paint( Graphics g )
    {
        // kolla hur många strokes det finns
        int antal  = allStrokes.size( );
        // och loopa igenom dessa
        for ( int i = 0 ; i < antal; i++ )
        {
            // sätt undan stroken i en variabel av typen MyStroke
            MyStroke stroke = (MyStroke) allStrokes.elementAt( i );
            // kolla hur många punkter det fins i denna stroke
            int antal2  = stroke.size(  );
            if ( antal2 > 1 )   
            {
                // sätt rätt färg
                g.setColor( stroke.getColor() );
                // loopa sedan genom stokens vektor efter punkterna	
                // enklast att börja med den andra (1) - vi kan då 
                // alltid anta att det finns en föregående	
                for ( int j = 1 ; j < antal2; j++ )
                {
                    // tag en punkt i vektorn och även föregående punkt
                    Point pp1 = stroke.getPointAt( j - 1 );
                    Point pp2 = stroke.getPointAt( j );
                    // och dra ett streck mellan desa punkter
                    g.drawLine( pp1.x, pp1.y, pp2.x, pp2.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
                                        );
        }
        // ----------------------------------------------------
        // sätt in punkterna och förgen för NUVARANDE stroke (streck)
        thisStroke.addPoint( e.getPoint(  ) );
        thisStroke.setColor( this.getForeground(  ) );
        // ----------------------------------------------------
        lastPoint = e.getPoint(  );
        isDrawing = true;
    }
    public void mouseReleased(MouseEvent e) 
    {
        isDrawing = false;
        // ----------------------------------------------------        
        // sätt in stroken i vektorn och skapa sedan en ny stroke
        allStrokes.addElement( thisStroke );
        thisStroke = new MyStroke(  );
        // ----------------------------------------------------
    }
}

// En klass med namnet MyStroke. 
// Vi behöver inte skriva en konstruerare om vi inte har speciella
// saker som skall göras när objektet skapas. Java tillhandahåller vid
// behov en "default constructor"
// En klass måste inte heller ärva en annan om vi inte behöver 
// "färdig funktionalitet"
class MyStroke 
{
    // En vektor för punkterna 
    private Vector theStroke = new Vector();
    // En Color för färgen
    private Color theColor;

    // en enkel size() funktion som bara returnerar Vektorns size()
    public int size( )
    {
        return theStroke.size(  );
    }
    
    // returnera Pointen I i vektorn
    public Point getPointAt( int i )
    {
        return ( Point ) theStroke.elementAt( i );
    }
    
    // lägg till en Point till vektorn    
    public void addPoint( Point p )
    {
        theStroke.addElement( p );
    }

    // returnera färgen        
    public Color getColor( )
    {
        return theColor;
    }
    
    // sätt färgen    
    public void setColor( Color c )
    {
        theColor = c;
    }
}

Prova programmet i nuvarande skick

  VidareutvecklingNågra frågor
Exempel
Färgblandare
EuroKalkylator
Editor
Animerade bilder ...
Scribble i VB
Scribble i Java ...


Top
< Vidareutveckling Några frågor>
© Anders Enges, Vörå 2002  | 11.04.01 00:22 Visa asp koden