vendredi 18 septembre 2015

Afficher des animations Flash dans les composants SWING

I. Introduction

Pour ceux qui connaissent le logiciel Flash, il est certes aussi facile de créer des animations vectorielles en Flash qu'en Java.
Ces animations peuvent varier d'un simple mouvement rectiligne d'un objet graphique, à la création d'une séquence de dessins animés.
La création de ces animations est rendue facile et rapide grâce à la richesse et la convivialité de l'IDE Flash qui est actuellement en version CS5.


Interface de travail du logiciel Flash 8

Les animations Flash portent l'extension .SWF. Ce format de publication est connu pour sa grande capacité multimédia vu qu'on peut y incorporer des dessins vectoriels, des images, des sons waves ou mp3, comme on peut aussi ajouter de la vidéo.
Penser à intégrer ces animations à vos conteneurs SWING sera surement une idée originale.
La firme Apple fournis le plug-in QuickTime pour permettre de lire différents formats multimédia notamment les fichiers .SWF. Les fonctionnalités sont réduites et les versions récentes de Flash player ne sont pas supportées par ce plug-in, ce qui nous emmène à délaisser cette technologie.
Une autre technologie qui peut être utilisée pour afficher les fichiers .SWF en Java est l'API JFlashPlayer qui permet de plus le contrôle des animations Flash avec des instructions Java.

II. Présentation de l'API JFlashPlayer

Cette API est actuellement dans sa version 2.0. Elle fait partie du paquetage JPackages qui contient une collection de bibliothèques qui peuvent s'interfacer avec les API Java standards.
Cette API fournit plusieurs fonctionnalités pour manipuler les fichiers SWF :
  • lire des animations Flash avec un contrôle pour arrêter, rembobiner, lire en boucle etc.
  • appeler des méthodes Java à partir du code ActionScript(langage script propriétaire fourni avec l'IDE Flash) ;
  • appeler des fonctions créées en ActionScript dans les classes Java ;
  • installer le plug-in Flash player dynamiquement s'il n'existe pas sur la machine au préalable ;
  • etc.
Cette API peut être utilisée seulement sous un environnement Windows notamment Windows 98, Me, NT4, 2000, XP et Vista. Les auteurs de l'API ne prévoient pas créer des versions pour les systèmes Linux et Mac OS.
On ne peut pas utiliser cette API dans les applets pour plusieurs raisons, y compris le niveau de sécurité fourni par les applets.

III. Etude de cas : intégrer une animation Flash dans une fenêtre Java

III-A. Configurations nécessaires

Pour fonctionner, JFlashPlayer exige l'inclusion de bibliothèques natives d'extension .dll qui doivent être spécifiées dans la variable d'environnement PATH.
Il faut donc installer Le Flash player sur la machine pour que l'API puisse fonctionner. S'il est déjà installé, ce player peut être détecté, sinon on peut l'installer dynamiquement avec les méthodes fournies par l'API.
Les versions JRE supportées par l'API sont : 1.4, 1.5 et 1.6.
- Sur le site de l'API, vous trouvez un zip qu'il faut télécharger et décompresser.
Ce paquetage contient une archive jflashplayer.jar qui doit être spécifiée dans la CLASSPATH de votre IDE Java pour pouvoir travailler avec l'API.

III-B. Implémentation

Dans cette partie, je vais présenter le code d'une application qui permet de lire et contrôler des animations Flash en Java.
Cette application est composée d'un seule classe "Lecteur" qui crée une instance de la classe JFrame pour afficher une fenêtre dans laquelle on va intégrer une animation Flash.

Lecteur flash

Au début, il faut créer le menu "Fichier" composé de six commandes permettant la lecture et le contrôle du contenu SWF.

Sélectionnez


private void créerMenu() 
 {
  getContentPane().setBackground(Color.WHITE);
  
  setJMenuBar(menuBar);
  
  menuBar.add(fichierMenu);
  fichierMenu.setText("Fichier");
  
  fichierMenu.add(menuOuvrir);
  menuOuvrir.addActionListener(this);
  menuOuvrir.setText("Ouvrir");
  
  fichierMenu.add(menuLire);
  menuLire.setText("Lire");
  menuLire.addActionListener(this);
  
  fichierMenu.add(menuArreter);
  menuArreter.setText("Arréter");
  menuArreter.addActionListener(this);
  
  fichierMenu.add(menuArriére);
  menuArriére.setText("Arriére");
  menuArriére.addActionListener(this);
  
  fichierMenu.add(menuAvant);
  menuAvant.setText("Avant");
  menuAvant.addActionListener(this);
  
  fichierMenu.add(menuRebombiner);
  menuRebombiner.setText("Rebombiner");
  menuRebombiner.addActionListener(this);

}
Pour gérer les appuis sur ces menus de commandes, on doit redéfinir la méthode actionperformed() de l'interface ActionListener :

Sélectionnez



 public void actionPerformed(ActionEvent menuSelectionné) 
 {

  try {
   if (!FlashPanel.hasFlashVersion("10"))
   
    // si la version 10 du flash player n'existe pas sur la machine
    // alors lancer son installation dynamiquement

    FlashPanel.installFlash("10");

  } catch (JFlashLibraryLoadFailedException err) {

   err.printStackTrace();
  }

  if (menuSelectionné.getSource() == menuOuvrir) {
   JFileChooser fileOuvrirSWF = new JFileChooser();
   if (fileOuvrirSWF.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

    FlashPanel.setRequiredFlashVersion("10");

    try {
    
    // le deuxiéme paramétre est à false pour 
    // ne pas démarrer l'animation à son chargement
       
     lecteurFlash = new FlashPanel(new File(fileOuvrirSWF
       .getSelectedFile().getAbsolutePath()), false);
     getContentPane().add(lecteurFlash);
     validate();

    } catch (FileNotFoundException e) {
     e.printStackTrace();
    } catch (JFlashLibraryLoadFailedException e) {
     e.printStackTrace();
    } catch (JFlashInvalidFlashException e) {
     e.printStackTrace();
    }
   }
  } else if (menuSelectionné.getSource() == menuLire) {

   // lancer la lecture de l'animation flash
   lecteurFlash.play();
   
  } else if (menuSelectionné.getSource() == menuArreter) {
   
   // arréter la lecture de l'animation
   lecteurFlash.stop();
   
  } else if (menuSelectionné.getSource() == menuArriére) {
   
   // reculer la téte de lecture
   lecteurFlash.back();
   
  } else if (menuSelectionné.getSource() == menuAvant) {
   
   // advancer la téte de lecture instanténant
   lecteurFlash.forward();
   
  } else if (menuSelectionné.getSource() == menuRebombiner) {
   
   // comencer une nouvelle lecture de l'animation
   lecteurFlash.rewind();

  }
 }
 
Il faut spécifier la version du Flash player installée sur la machine avec la méthode setRequiredFlashVersion() :

Sélectionnez


FlashPanel.setRequiredFlashVersion("version_flash_palyer");
Avec le code fournit en haut, on utilise la version 10.
Il faut vérifier la version du player installé sur la machine avec la méthode hasFlashVersion().

Sélectionnez


FlashPanel.hasFlashVersion("version_flash_palyer"));
Si cette la méthode retourne la valeur false, il faut donc installer cette version.

Sélectionnez


FlashPanel.installFlash("num_version");
Il vaudrait mieux travailler avec une version installée au préalable.
On peut donc afficher la liste des Flash player installés :

Sélectionnez


for(int i=0;i<13;i++)
{
   System.out.println("version : "+i+" disponible ? : "+FlashPanel.hasFlashVersion(""+i));
}

IV. Liens utiles

V. Conclusion

L'API JFlashPlayer est certainement intéressante. Elle permet en fait de profiter de la puissance de Flash dans la création des animations pour les intégrer dans les interfaces graphiques créées en Java.
Si vous voulez encore publier des fichiers SWF en utilisant des instructions Java, vous pouvez consulter mon article traitant de l'API Transform SWF.

Aucun commentaire:

Enregistrer un commentaire