package memory.chants;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* une classe qui permet de de définir un oiseau par son nom, son chant, son apparence ...
* Cette classe est un Jpanel ce qui permet de l'afficher directement.
* L'image est mise à l'échelle, la bordure de l'image est définie.
* Toute réflexion faite ce n'est pas bien de mélanger la donnée (ce qu'est l'oiseau) et sa
* représentation graphique (comment s'affiche l'oiseau). D'ailleurs en fait je n'utilise jamais
* directement la représentatioon graphique de l'oiseau.
* @author Patrice
**/
public class Oiseau
{
//le nom de l'oiseau
private String nom;
//le fichier MP3 du chant
private String chant;
//l'image de l'oiseau à la bonne dimension
private ImageIcon image;
//la taille de l'image
private int taille;
//pour mesurer la dimension d'une chaîne
private static FontMetrics fm;
//le nom latin
private String nomLatin;
/**
* Constructeur
* @param nom le nom de l'oiseau
* @param fichierSon le fichier du chant de l'oiseau (mp3)
* @param fichierImage le fichier de l'image de l'oiseau (jpg)
* @param tailleImage la taille de l'image par défaut
*/
public Oiseau(String nom, String nomLatin, String fichierSon, String fichierImage, int tailleImage)
{
initFontMetrics();
//les données
this.chant = fichierSon;
this.nom = nom;
this.nomLatin = nomLatin;
//la taille de l'image
this.taille = tailleImage;
//l'image
setImage(fichierImage);
}
private static void initFontMetrics()
{
if (fm == null)
{
Font policeTitre = new Font("Dialog",Font.BOLD,12);
fm = new JLabel().getFontMetrics(policeTitre);
}
}
/**
* Constructeur sans taille image : taille par défaut = 300
* @param nom le nom de l'oiseau
* @param latin le nom latin
* @param fichierSon le fichier du chant de l'oiseau (mp3)
* @param fichierImage le fichier de l'image de l'oiseau (jpg)
*/
public Oiseau(String nom, String latin, String fichierSon, String fichierImage)
{
this(nom,latin,fichierSon,fichierImage,300);
}
/**
* modifier le nom de l'oiseau (changement de langue)
* @param name le nouveau nom
*/
public void changeNom(String name)
{
this.nom = name;
}
//l'image à partir du fichier
private void setImage(String fichier)
{
//l'image avec sa taille originelle
ImageIcon image1 = new ImageIcon(fichier) ;
//ses dimensions
int largeur = image1.getIconWidth ();
int hauteur = image1.getIconHeight ();
//la taille préférée du plus grand côté
int largeurImage = this.taille;
if (largeur > hauteur)
{
hauteur = (hauteur * largeurImage)/largeur;
largeur = largeurImage ;
}
else
{
largeur = (largeur * largeurImage)/hauteur;
hauteur = largeurImage;
}
//il faut aussi que le nom tienne dans la largeur
int largeurNom = fm.stringWidth (this.nom) + 20;
int largeurNomLatin = fm.stringWidth(this.nomLatin) + 20;
largeurNom = Math.max (largeurNom, largeurNomLatin);
largeur = Math.max (largeurNom, largeur);
this.image = new ImageIcon(image1.getImage().getScaledInstance(largeur,hauteur,Image.SCALE_DEFAULT));
}
/**
* @return le chant de l'oiseau
*/
public String getChant()
{
return this.chant;
}
/**
* @return l'image
*/
public ImageIcon getImage()
{
return this.image;
}
/**
* @return le nom
*/
public String getNom()
{
return this.nom;
}
/**
* return le nom latin
*/
public String getNomLatin()
{
return "(" + this.nomLatin + ")";
}
public static void main(String[] args)
{
final GestionDonnees gd = new GestionDonnees();
final Oiseau oiseau = gd.getOiseau((int) (35*Math.random ()));
final JPanel panneau = new JPanel();
final JLabel label = new JLabel();
panneau.addMouseListener(new MouseListener()
{
@Override
public void mouseClicked(MouseEvent e)
{
if (e.isPopupTrigger()) System.out.println("clic droit");
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
});
javax.swing.SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
JFrame fenetre = new JFrame("Test du composant oiseau");
label.setIcon(oiseau.getImage());
panneau.add(label);
fenetre.add(panneau);
fenetre.pack();
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenetre.setLocationRelativeTo(null);
fenetre.setVisible(true);
}
});
}
}