VueChat.java
001 package fr.isae.chat.gui;
002 
003 import fr.isae.chat.model.Chat;
004 import fr.isae.chat.model.EntreeChat;
005 import java.awt.*;
006 import java.awt.event.*;
007 import java.util.Observable;
008 import java.util.Observer;
009 import javax.swing.*;
010 import javax.swing.border.Border;
011 
012 /**
013  <code>VueChat</code> est une vue pour la classe <code>Chat</code>.
014  * Elle permet d'envoyer une chaine de caracteres a ajouter au Chat.
015  *
016  @author <a href="mailto:garion@isae.fr">Christophe Garion</a>
017  @version 1.0
018  */
019 public class VueChat extends JFrame implements Observer {
020 
021     private String nom;
022     private Chat chat;
023     private JButton boutonTexte;
024     private JTextField champTexte;
025     private JButton boutonNom;
026     private JTextField champNom;
027     private JTextArea affichage;
028 
029     /**
030      * Creer une instance de <code>VueChat</code>.
031      *
032      @param chat l'instance de <code>Chat</code> que l'on veut associer
033      @param titre le titre de la fenetre
034      @param nom le nom de l'utilisateur de cette fenetre
035      */
036     public VueChat(Chat chat, String titre, String nom) {
037         super(titre);
038 
039         this.chat = chat;
040         this.chat.addObserver(this);
041         this.setName(titre);
042         this.nom = nom;
043 
044         this.initComponents();
045 
046         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
047         this.pack();
048         this.setVisible(true);
049     }
050 
051     private void initComponents() {
052         this.boutonTexte = new JButton("Envoi");
053         this.boutonTexte.setName("bouton");
054         this.champTexte = new JTextField(20);
055         this.champTexte.setName("champ");
056         this.boutonNom = new JButton("Nom");
057         this.champNom = new JTextField(20);
058         this.affichage = new JTextArea(3020);
059         this.affichage.setEditable(false);
060         this.affichage.setName("aff");
061 
062         Border border = BorderFactory.createLineBorder(Color.BLACK);
063         this.affichage.setBorder(border);
064 
065         Container c = this.getContentPane();
066         c.setLayout(new BorderLayout());
067 
068         c.add(this.affichage, BorderLayout.CENTER);
069 
070         // un panel pour contenir ce qu'il y a en dessous de la zone
071         // d'affichage
072         JPanel panel = new JPanel();
073         panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
074 
075         // un panel pour contenir le bouton et la zone de texte pour
076         // envoyer le texte
077         JPanel panelTexte = new JPanel();
078         panelTexte.setLayout(new FlowLayout());
079 
080         panelTexte.add(this.boutonTexte);
081         panelTexte.add(this.champTexte);
082 
083         panel.add(panelTexte);
084 
085         // un panel pour contenir le bouton et la zone de texte pour
086         // changer le nom
087         JPanel panelNom = new JPanel();
088         panelNom.setLayout(new FlowLayout());
089 
090         panelNom.add(this.boutonNom);
091         panelNom.add(this.champNom);
092 
093         panel.add(panelNom);
094 
095         c.add(panel, BorderLayout.SOUTH);
096 
097         // ajout des listeners
098         EcouteurBouton ecouteur = new EcouteurBouton(this.chat,
099                                                      this.champTexte,
100                                                      this.nom);
101         this.boutonTexte.addActionListener(ecouteur);
102         this.champTexte.addActionListener(ecouteur);
103 
104         this.boutonNom.addActionListener(new ActionListener() {
105                 public void actionPerformed(ActionEvent e) {
106                     nom = champNom.getText();
107                     setTitle("Vue " + nom);
108 
109                     for (ActionListener a: boutonTexte.getActionListeners()) {
110                         boutonTexte.removeActionListener(a);
111                         champTexte.removeActionListener(a);
112                     }
113 
114                     boutonTexte.addActionListener(
115                         new EcouteurBouton(chat,
116                                            champTexte,
117                                            nom));
118                     champTexte.addActionListener(
119                         new EcouteurBouton(chat,
120                                            champTexte,
121                                            nom));
122                 }
123             });
124     }
125 
126     @Override public void update(Observable o, Object arg) {
127         affichage.append(chat.getDerniereEntree() "\n");
128     }
129 }