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(30, 20);
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 }
|