Semaine 11

Activité 4

Exercice pratique

Note 1 : Nous vous recommandons fortement de faire vous même les exercices de programmation avant d’aller voir la solution proposée. Plusieurs solutions sont possibles, mais il y en a des bonnes et des mauvaises!

Note 2 : Les solutions données sont des projets NetBeans qui ont été compressés sous format zip. Une fois les projets décompressés, vous pouvez ouvrir les projets par l’intermédiaire de Netbeans (Fichier > Ouvrir un projet).

Exercice 1.Veuillez utiliser le patron de conception Observer afin de créer une application de clavardage de type « peer to peer » entre deux instances (ou plusieurs autres) d’un même JFrame. Voici l’interface à développer :

exercicePratiqueObserver

Conseils : Utiliser le patron de conception Observer pour informer les autres instances du JFrame de l’écriture d’un message. Utiliser une classe indépendante avec une méthode Main afin de créer les instances des classes JFrame. La classe implémentant les méthodes de la Source est le JFrame.

Réponse

Code source de la solution : exercicePratiqueObserver.zip

Exercice 2. Vous devez implémenter une version du concept de « Nuage de mots » dans une interface graphique en utilisant le patron de conceptionComposite. Fait particulier, ce nuage de mots est représenté logiquement à partir d’un arbre (et non graphiquement, voir plus loins), où il y a une dépendance sémantique entre les termes (ex. arbre > conifère > sapin). Dans cet exemple, la taille d’affichage et l’emplacements d’affichage des mots dans le JPanel (utiliser le Null layout) ce fait aléatoirement (utiliser la méthode Math.random). De plus, l’utilisateur peut modifier la taille des mots et leur couleur pour l’ensemble du nuage à l’aide des boutons de la barre d’outils. Voici un aperçu de l’interface:

Pour vous aider, veuillez commencer l’exercice à partir de ces 2 classes et y ajouter le patron de conception Composite afin que la manipulation de la taille des mots et de la couleur soit déléguée aux instances de la classe Mot :

import java.awt.Container;
import java.util.Random;
import javax.swing.JLabel;

/**
 *
 * @author Charles
 */
public class Mot {
    
    protected JLabel terme;
    protected String texte;
    protected int size;
    protected String rgb;
        
    public Mot(Container panel, String texte) {
        this.terme = new JLabel();
        this.texte = texte;
        this.size = getRandomBetween(1, 10);
        this.rgb = "rgb(" + 
                getRandomBetween(0, 255) + "," + getRandomBetween(0, 255) + "," + getRandomBetween(0, 255) + ")";
        
        terme.setText("<html><font size='" + size + "' color='"+ rgb +"'>" + texte + "</font></html>");
              
        terme.setBounds(getRandomBetween(0, 500), getRandomBetween(0, 500), 200, 100);
        panel.add(terme);
        
    }
    
    private int getRandomBetween (int low, int high) {
        Random r = new Random();
        return r.nextInt(high-low) + low;    
    }
    
}
/**
 *
 * @author Charles
 */
public class NuageMotsJFrame extends javax.swing.JFrame {
    
    Mot vivantMot;
    Mot arbreMot; 
    Mot conifereMot;

    Mot vertebreMot;
    Mot invertebreMot;
    Mot insect;
    
    Mot reptileMot;
    Mot serpent;
    
    /**
     * Creates new form NuageMotsJFrame
     */
    public NuageMotsJFrame() {
        initComponents();
        
        //Ajouter ici le composite
        //ex.: Mot serpent = new Mot(jPanel1, "Serpent");
                
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jToolBar1 = new javax.swing.JToolBar();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setPreferredSize(new java.awt.Dimension(800, 800));
        jPanel1.setLayout(null);
        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        jToolBar1.setRollover(true);

        jButton1.setText("+");
        jButton1.setFocusable(false);
        jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton1);

        jButton2.setText("-");
        jButton2.setFocusable(false);
        jButton2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton2.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton2);

        jButton3.setText("Couleur");
        jButton3.setFocusable(false);
        jButton3.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton3.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton3);

        getContentPane().add(jToolBar1, java.awt.BorderLayout.PAGE_START);

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
    }                                        

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
    }                                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see https://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(NuageMotsJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(NuageMotsJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(NuageMotsJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(NuageMotsJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NuageMotsJFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JToolBar jToolBar1;
    // End of variables declaration                   
}
Réponse

Code source de la solution : exercicePratiqueComposite.zip