Skip to topic | Skip to bottom
Home
Minfo
Minfo.GlooTDjavabeansr1.1 - 26 Nov 2007 - 16:15 - PhilippeCollettopic end

Start of topic | Skip to actions

TD: Java Beans

PhilippeCollet

Introduction

Lors du premier TD, vous avez fait quelques expérimentations avec le éditeur visuel d'Eclipse, qui permet de manipuler graphiquement des widgets graphiques, AWT et Swing par exemple. La palette latérale était en fait pleine de Java Beans !

ALERT! Pour vous laisser du temps pour votre TD long, ce TD est volontairement limité à quelques expérimentations pour comprendre les principes des Java Beans.

Utilisation d'autres Java Beans

Récupération du ComponentSet

Démo

  • Lancez la démo (fichier demo.sh ou demo.bat suivant votre système).
  • Vous devez voir apparaitre une fenêtre contenant une série de boutons agencés verticalement. Chaque bouton lance une mini-démo d'un des Java Beans. Vous remarquerez que ce sont tous des petits composants tout à fait récurrents et donc réutilisables en Swing, notamment :
    • un assistant avec des panneaux sucessifs,
    • un calendrier avec plein de vues sympathiques,
    • une barre d'avancement,
    • un afficheur d'images...
  • Expérimentez les différentes démos qui sont en faites des exemples de mis en oeuvre des différents Beans.

Utilisation du JImageViewer?

ALERT! Hélas, il semble y a voir un problème avec le plugin VisualEditor? sur Eclipse. Dès la version 3.1 sur linux, il y avait un bug et il semble s'être propagé à toutes les versions et plates-formes depuis (le bug sur Eclipse 3.3 / Windows est confirmé...) : lorsqu'on sélectionne un Bean, comme cela devrait être demandé dans la question qui suit, la fenêtre de sélection n'apparaît pas.

  • Dans Eclipse, créez un nouveau projet pour cette expérimentation.
  • Ajoutez la bibliothèque componentset (le jar...) à votre projet : allez dans Projet/Propriétés. Puis sélectionnez "Java Build Path", ensuite sélectionnez l'onglet "libraries" et enfin utilisez le bouton "add external jar" (en supposant que vous avez décompacté l'archive hors du workspace Eclipse).
  • Créez une nouvelle classe visuelle (une JFrame). Vous devriez avoir l'écran central coupé en deux avec l'éditeur visuel en haut et le code en bas.
  • A partir de ce moment, vous pouvez tester votre classe en sélectionnant "Exécutez en tant que/Bean Java".
  • A l'aide la palette, ajoutez un bouton dans la zone sud (c'est un BorderLayout?). Changez le texte de ce bouton pour afficher "turn".
  • ALERT! Il serait maintenant idéal de pouvoir rajouter nos nouveaux beans dans la palette pour pouvoir les exploiter. Dans d'autres environnements qu'Eclipse, c'est relativement simple, mais Eclipse impose son système de plugins et tout nouvel élément doit être un plugin. L'avantage de ce système de packaging est qu'Eclipse peut déterminer finement tout problème de dépendances entre des plugins, donc entre des beans par exemple, ce que ne savent pas faire les autres environnements (on peut par exemple ajouter a la palette de JBuilder un Java Bean sans avoir placer les bibliothèques nécessaires a son fonctionnement et tout explose...).
  • On peut en revanche intégrer un Bean au coup par coup grâce à l'entrée Sélection du bean de la palette. C'est effectivement cette fonctionnalité qui est buggée. A l'aide de ce bouton, testez si une fenêtre apparaît :
    • si oui, le bug n'est pas présent dans votre version ! Entrez dans la fenêtre qui s'affiche le nom du Bean (JImageViewer?), validez et vous pourrez ensuite le placer dans la zone centrale de la JFrame. Normalement, vous devriez voir apparaitre la vue "Java Beans" en bas a gauche avec la structure complète de chaque Bean. Vous pouvez en sélectionner un et modifier ses propriétés. Trouvez quelle propriété du JImageViewer? permet de donner le nom d'un image et faites qu'il prenne cette image? ALERT! placez l'image dans le répertoire du projet et sélectionnez son chemin par l'option "système de fichiers"
    • sinon, il va falloir écrire à la main ce qu'aurait généré l'environnement pour vous frown :
// la déclaration d'un attribut
   private JImageViewer jImageViewer = null;

// le code pour l'initialiser
   /**
    * This method initializes jImageViewer   
    *    
    * @return com.zfqjava.swing.JImageViewer   
    */
   private JImageViewer getJImageViewer() {
      if (jImageViewer == null) {
         jImageViewer = new JImageViewer();
         jImageViewer.setImage(Toolkit.getDefaultToolkit().getImage("CHEMIN COMPLET JUSQU A L IMAGE"));
      }
      return jImageViewer;
   }


// le code pour le placer dans la fenêtre, dans la méthode getJContentPane() 
   jContentPane.add(getJImageViewer(), BorderLayout.CENTER);

  • Ajoutez maintenant un ActionListener? sur le bouton "turn" qui fasse tourner l'image (il faut modifier une propriété du bean...). TIP La rotation est donnée par un entier entre 0 et 3, il suffit de faire un incrément modulo 4 pour faire cycler la rotation :
rotator = (rotator + 1) % 4;
...

Création d'un Java Bean : un Bean Horloge

Créez une classe Clock (dans un package) qui hérite de JPanel. Ajoutez à son interface graphique un label et débrouillez-vous pour qu'un Thread affiche l'heure dans le label en permanence. Faites que Clock implémente l'interface Runnable en fournissant la méthode run comme suit (à lire et à comprendre avant de recopier !) :

   public void run() {
      while (true) {
         Calendar calendar = new GregorianCalendar();
         jLabel.setText("" + calendar.get(Calendar.HOUR_OF_DAY) + ":"
               + calendar.get(Calendar.MINUTE) + ":"
               + calendar.get(Calendar.SECOND));
         try {
            Thread.sleep(1000);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }

ALERT! Le constructeur de Clock doit créer un thread et le démarrer (comme dans le simulateur ou le visualisateur).

  • Exécutez le Bean Horloge pour voir s'il fonctionne.
  • Par la même technique que précédemment (par la sélection de Bean si cela marche, ou par du code sinon), essayez de le placer dans la fenêtre d'affichage d'image de la question précédente.
  • Ca marche, oui, mais pourquoi ? Il n'y a pas de BeanInfo? pour dire que c'est un Bean, alors ? Quel mécanisme utilise Eclipse pour se rendre compte que c'est un Bean ?

Et si on voulait faire un BeanInfo?, et bien cela ressemblerait à ça (BeanInfo? généré par l'environnement JBuilder) :

package clock;

import java.beans.BeanInfo;
import java.beans.PropertyDescriptor;
import java.beans.SimpleBeanInfo;

public class ClockBeanInfo extends SimpleBeanInfo {
   Class beanClass = Clock.class;

   String iconColor16x16Filename;

   String iconColor32x32Filename;

   String iconMono16x16Filename;

   String iconMono32x32Filename;

   public ClockBeanInfo() {
   }

   public PropertyDescriptor[] getPropertyDescriptors() {
      PropertyDescriptor[] pds = new PropertyDescriptor[] {};
      return pds;
   }

   public java.awt.Image getIcon(int iconKind) {
      switch (iconKind) {
      case BeanInfo.ICON_COLOR_16x16:
         return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename)
               : null;
      case BeanInfo.ICON_COLOR_32x32:
         return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename)
               : null;
      case BeanInfo.ICON_MONO_16x16:
         return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename)
               : null;
      case BeanInfo.ICON_MONO_32x32:
         return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename)
               : null;
      }
      return null;
   }
}

-- PhilippeCollet - 26 Nov 2007
to top


You are here: Minfo > GLOO > GlooTDjavabeans

to top

Copyright © 1999-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding WIKIDeptinfo? Send feedback