/**
* Une classe qui permet d'affiche une image dans un composant graphique.
* A utiliser dans un bean et une beanbox.
*/
public class Viewer extends Canvas implements Serializable, ActionListener,ImageObserver {
/** Le timer pour le mode diaporama. */
protected javax.swing.Timer timer ;
/** Un tableau pour stocker les images a afficher. */
protected Image [] images ;
/** Commence par initialiser le chemin vers l'image a afficher.
*/
public Viewer() {
super();
setSize( 160, 90 );
imagePath = "Z:\\2A\\java\\tp2\\tp2" ;
load();
tempo = 2 * 1000 ;
loop = true ;
timer = new javax.swing.Timer( tempo, this );
timer.setRepeats( true );
timer.start();
}
/**
* Charge toutes les images du repertoire dans lengthtableau d'Images.
*/
public void load() {
// Recupere les noms des fichers.
files = new File( imagePath ).listFiles
( new FilenameFilter() {
public boolean accept( File dir, String name ) {
return name.endsWith( ".jpg" ) || name.endsWith( ".gif" );
}
}
);
this.images = new Image [ files.length ];
for ( int i = 0 ; i < files.length ; ++ i ) {
images [ i ] = Toolkit.getDefaultToolkit().getImage( imagePath + "\\" + files [ i ].getName());
}
current = 0 ;
}
/**
* Utilisé par le timer en mode diaporama.
*/
public void actionPerformed( ActionEvent event ) {
this.suivant();
}
/**
* Afficher une image
*/
public void paint( Graphics g ) {
int largeur, hauteur;
if( files.length > 0 ) {
largeur = getWidth();
hauteur = getHeight();
boolean test = g.drawImage( images [ current ], 0, 0,largeur,hauteur, this );
}
}
/**
* Affiche la premiere image.
*/
public void premier() {
current = 0 ;
repaint();
notifyImageChanged();
}
/**
* Affiche la derniere image.
*/
public void dernier() {
current = files.length -1 ;
repaint();
notifyImageChanged();
}
/**
* Affiche l'image suivante.
*/
public void suivant() {
if ( loop ) current = ( current + 1 ) % files.length ;
else current = current == files.length -1 ? current : current + 1 ;
repaint();
notifyImageChanged();
}
/**
* Affiche l'image precedente.
*/
public void precedent() {
current = current == 0 ? files.length -1 : (( current - 1 ) % files.length );
repaint();
notifyImageChanged();
}
/**
* Pour arreter le loop ou pour redemarrer
*/
public void startStop() {
if( getLoop()) setLoop( false );
else setLoop( true );
}
/** Chemin vers l'image a afficher */
protected String imagePath ;
protected Image image ;
protected File [ ] files ;
protected int current ; // the current file displayed.
/**
* propriete pour indiquer si on doit boucler ou non.
*/
protected boolean loop ;
public boolean getLoop() { return loop ; }
public void setLoop( boolean value ) {
loop = value ;
if ( loop ) timer.restart(); // Reconfigurer le timer.
else timer.stop();
}
/**
* Valeur de la temporisation en mode diaporama.
*/
protected int tempo ;
public int getTempo() { return tempo ; }
public void setTempo( int value ) {
tempo = value ;
this.timer.setDelay( tempo );
}
/**
* Accesseur & modificateur pour le repertoire d'images
*/
public void setChemin(String newImagePath) {
String OldImagePath = imagePath;
imagePath = newImagePath;
propertyChangeListeners.firePropertyChange("Chemin des Images", OldImagePath, newImagePath);
load();
}