joi, 11 februarie 2010

JAVA: Thread + Animation

//Clasa Desenare: deseneaza un oval la coordonatele x,y si un fundal

import javax.swing.*;
import java.awt.*;
public class Desenare extends JPanel{
public int x,y,diametru=40;
public void paintComponent(Graphics g)
{
g.setColor(Color.CYAN);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.yellow);
g.fillOval(x, y, diametru, diametru);
}
}

//Clasa Fir: creaza un JFrame, si un Thread, adauga ascultatori


//import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;
public class Fir implements Runnable
{
Thread unFir;
public Fir()
{
frame.getContentPane().add(oval);
frame.setSize(500,400);
frame.setVisible(true);
frame.addMouseListener(new List());
}
JFrame frame=new JFrame();
Desenare oval=new Desenare();
public void run()
{
for(int i=0;i<(20);i++)
{
try{
Thread.sleep(500);
}
catch(Exception ex)
{
System.out.println("Exceptie");
}
oval.x+=i;
oval.y+=i;
oval.repaint();
}
//dupa ce s-a terminat "repictarea" trebuie "omorat"
//threadul pentru a se putea incepe unul nou
unFir=null;
System.out.println("Thread distrus");
}
public void refresh()
{
if(unFir==null)
{
unFir=new Thread(this);
unFir.start();
}
}
class List implements MouseListener{
public void mousePressed(MouseEvent e) {};
public void mouseReleased(MouseEvent e) {};
public void mouseClicked(MouseEvent e)
{
System.out.println("Noile coordonate: "+e.getX()+" "+e.getY());
oval.x=e.getX();
oval.y=e.getY();

refresh();

}
public void mouseEntered(MouseEvent e) {};
public void mouseExited(MouseEvent e) {};
}
}

//Clasa Main, creaza un obiect de tip Fir


public class Main {
public static void main(String[] args)
{
Fir fir=new Fir();
}
}



/**Scurte indicatii:
* Daca nu se verifica sa avem un singur fir in metoda refresh prin: unFir==null se vor crea fire la fiecare eveniment mouse.
* De asemenea este important ca threadul sa devina null, pentru a se putea reincepe desenarea in cazul in care exista
un nou eveniment mouse
* Daca nu se foloseste verificarea unFir==null atunci se vor porni in pararel mai multe fire, si chiar daca se pastreaza unFir=null acesta nu "omoara" firul, doar pierdem referinta la fir, el "murind" doar dupa ce se termina metoda run(in cazul de fata dupa 10 secunde)
* Chiar daca in timpul "desenarii" se va da click in alta zona, folosind versiunea prezentata mai sus a prog el se va executa tot in cele 10 secunde alocate, se vor schimba doar coordonatele de desenare
*/
Observatii: Se poate folosi si pentru deplasare pe o harta, prin stabilirea celei mai scurte rute de la pozitia initiala pana la noile coordonate; sper ca in scurt timp sa postez si versiunea respectiva, inca in lucru;))

Niciun comentariu:

Trimiteți un comentariu