Salve a tutti, questa è la prima volta che chiedo aiuto ad un forum, spero di essere saustiva nel spiegare il mio problema e spero soprattutto che ci sia qualcuno in grado di aiutarmi.
Ho scritto un programmino in java che mi crea un frattale e poi lo fa rimbalzare per tutta la finestra. Il frattale rimbalza fin tanto che il ciclo che determina la sua posizione va avanti, ma un volta terminto non riesco più a chiudere la finestra. Qualcuno saprebbe dirmi cosa devo scrivere per risolvere questo problema?
Qui sotto vi posto tutte le classi

1)VonKock.java

codice:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.lang.*;

public class VonKock
{

    public static Point trovaP1(Point a,Point b)
    {
        Point p1 = new Point();
        p1.x = a.x + (int)(0.33 * (double)(b.x - a.x));
        p1.y = a.y + (int)(0.33 * (double)(b.y - a.y));
        return p1;

    }

    public static Point trovaP2(Point a,Point b,Point p1)
    {
        Point p2 = new Point();
        Double l = a.distance(b);
        Double beta = (Math.PI / 3.0) + Math.atan2((b.y - a.y) ,(b.x - a.x));
        p2.x = p1.x + (int)((l / 3.0)* Math.cos(beta));

        p2.y = p1.y + (int)((l / 3.0)*Math.sin(beta));

        return p2;
    }

    public static Point trovaP3(Point a,Point b)
    {
        Point p3 = new Point();
        p3.x = a.x + (int)(0.66 * (double)(b.x - a.x));
        p3.y = a.y + (int)(0.66 * (double)(b.y - a.y));
        return p3;
    }

    public static void disegna(Point a, Point b, Graphics g, boolean dis)
    {
        if(dis==true) //DEVO DISEGNARE
           g.setColor(Color.RED);
        else //"CANCELLO"
            g.setColor(Color.BLACK);

        if(a.distance(b)<=4)
            g.drawLine(a.x, a.y, b.x, b.y);
        else
        {
            Point p1,p2,p3;
            p1 = trovaP1(a,b);
            p2 = trovaP2(a,b,p1);
            p3 = trovaP3(a,b);
            disegna(a,p1,g,dis);
            disegna(p1,p2,g,dis);
            disegna(p2,p3,g,dis);
            disegna(p3,b,g,dis);
            
	}
    }

}

2)MioFrame.java
codice:
import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class MioFrame extends Frame implements WindowListener
{
    private MioCanvas theCanvas;

    public MioFrame()
    {
        this.setSize(800, 800);
        this.setVisible(true);
        this.addWindowListener(this);

        theCanvas = new MioCanvas(800,800);
        theCanvas.setLocation(100, 100);

        this.add(theCanvas);

    }

    public void windowOpened(WindowEvent e) {
    }

    public void windowClosing(WindowEvent e) {
        
    }

    public void windowClosed(WindowEvent e) {
     }

    public void windowIconified(WindowEvent e) {
    }

    public void windowDeiconified(WindowEvent e) {
    }

    public void windowActivated(WindowEvent e) {
     }

    public void windowDeactivated(WindowEvent e) {
    }

}


3)MioCanvas.java
codice:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.lang.Thread;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class MioCanvas extends Canvas
{

    private int  width,height;
    @SuppressWarnings("empty-statement")
    public MioCanvas(int w,int h)
    {

        setSize(w,h);
        width = w;
        height = h;
    }

    @Override
    public void paint(Graphics g)
    {
       g.setColor(Color.black);
       g.fillRect(0, 0, width,height);

       boolean dis = true;

       int versodiviaggio = 3;
       /*
        * se 0 in basso a destra
        * se 1 in alto a destra
        * se 2 in alto a sinistra
        * se 3 in basso a sinistra
        */
       /*
        *@param x coordinata  iniziale Orizzontale della stella
        *@param y coordinata  inizile  Verticale  della  stella 
        */
       int x,y;

       x= 200;

       y= 400;
       for(int i=0; i< 100; i = i+ 3) {

           Point p1 = new Point( x,y );
           Point p2 = new Point( x+50,y );
           Point p3 = new Point( (x+(x+50))/2,y-50);

           VonKock.disegna(p1, p2, g,dis);
           VonKock.disegna(p3,p1,g,dis);
           VonKock.disegna(p2,p3,g,dis);
            try {
                Thread.sleep(15);
            } catch (InterruptedException ex) {
                Logger.getLogger(MioCanvas.class.getName()).log(Level.SEVERE, null, ex);
            }

           dis = !dis;
           p1 = new Point( x,y );
           p2 = new Point( x+50,y );
           p3 = new Point( (x+(x+50))/2,y-50);

           VonKock.disegna(p1, p2, g,dis);
           VonKock.disegna(p3,p1,g,dis);
           VonKock.disegna(p2, p3, g,dis);
           dis = !dis;

           System.out.println(p1);
           if ( p1.getY()>=height-50 || p1.getX()<=0 || p2.getX()>=width-18 ||
                p3.getY()<=0   ){
               System.out.println("ECCO QUANDO CAMBIA: "+p1);
               versodiviaggio = versodiviaggio==3 ? 0 : ++versodiviaggio;
           }
           switch(versodiviaggio) {
               case 0: x+=1; y+=1; break;
               case 1: x+=1; y-=1; break;
               case 2: x-=1; y-=1; break;
               case 3: x-=1; y+=1; break;
           }

       }
    }
    
}

4)Main.java

codice:
import java.awt.*;
import javax.swing.*;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.*;

public class Main {


    public static void main(String[] args) {
        MioFrame f = new MioFrame();
    }
}