| 1 | import java.awt.BorderLayout; |
| 2 | import java.awt.event.ActionEvent; |
| 3 | import java.awt.event.ActionListener; |
| 4 | import java.util.ArrayList; |
| 5 | |
| 6 | import javax.swing.BoxLayout; |
| 7 | import javax.swing.JButton; |
| 8 | import javax.swing.JFrame; |
| 9 | import javax.swing.JPanel; |
| 10 | import javax.swing.JScrollPane; |
| 11 | import javax.swing.JTextArea; |
| 12 | import javax.swing.JTextField; |
| 13 | import javax.swing.ScrollPaneConstants; |
| 14 | |
| 15 | import java.util.Random; |
| 16 | |
| 17 | /** |
| 18 | * Applications réparties |
| 19 | * TP 1 |
| 20 | * Chat, Sockets |
| 21 | * |
| 22 | * IHM pour l'application cliente |
| 23 | * |
| 24 | * @author Toto |
| 25 | * @version 1.0 |
| 26 | */ |
| 27 | public class IHM implements ActionListener { |
| 28 | |
| 29 | private JTextArea entrants; |
| 30 | private JTextField sortants; |
| 31 | private ArrayList<String> sendMessages; |
| 32 | //FIXME: use a random name by thread for now, should be setable |
| 33 | private String randName; |
| 34 | |
| 35 | IHM() { |
| 36 | sendMessages = new ArrayList<String>(); |
| 37 | randName = randomName(); |
| 38 | } |
| 39 | |
| 40 | private String randomName() { |
| 41 | |
| 42 | int leftLimit = 97; // letter 'a' |
| 43 | int rightLimit = 122; // letter 'z' |
| 44 | int targetStringLength = 8; |
| 45 | Random random = new Random(); |
| 46 | StringBuilder buffer = new StringBuilder(targetStringLength); |
| 47 | for (int i = 0; i < targetStringLength; i++) { |
| 48 | int randomLimitedInt = leftLimit + (int)(random.nextFloat() * (rightLimit - leftLimit + 1)); |
| 49 | buffer.append((char)randomLimitedInt); |
| 50 | } |
| 51 | String generatedString = buffer.toString(); |
| 52 | |
| 53 | return generatedString; |
| 54 | } |
| 55 | |
| 56 | public void go() { |
| 57 | JFrame cadre = new JFrame("Client de discussion de " + randName); |
| 58 | JPanel panneau = new JPanel(); |
| 59 | entrants = new JTextArea(15, 30); |
| 60 | entrants.setLineWrap(true); |
| 61 | entrants.setWrapStyleWord(true); |
| 62 | entrants.setEditable(false); |
| 63 | JScrollPane zoneTexte = new JScrollPane(entrants); |
| 64 | zoneTexte.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); |
| 65 | zoneTexte.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); |
| 66 | sortants = new JTextField(24); |
| 67 | JButton boutonEnvoi = new JButton("Envoi"); |
| 68 | boutonEnvoi.addActionListener(this); |
| 69 | panneau.add(zoneTexte); |
| 70 | panneau.add(sortants); |
| 71 | panneau.add(boutonEnvoi); |
| 72 | cadre.getContentPane().add(BorderLayout.CENTER, panneau); |
| 73 | cadre.setSize(400, 310); |
| 74 | cadre.setVisible(true); |
| 75 | |
| 76 | panneau.setLayout(new BoxLayout(panneau, BoxLayout.Y_AXIS)); |
| 77 | cadre.pack(); |
| 78 | } // fin methode go |
| 79 | |
| 80 | synchronized public void actionPerformed(ActionEvent ev) { |
| 81 | sendMessages.add(sortants.getText()); |
| 82 | sortants.setText(""); |
| 83 | sortants.requestFocus(); |
| 84 | this.notify(); |
| 85 | } |
| 86 | |
| 87 | synchronized public String getNextMessageToSend() { |
| 88 | try { |
| 89 | if (sendMessages.isEmpty()) |
| 90 | this.wait(); |
| 91 | } |
| 92 | catch (Exception e) { |
| 93 | System.err.println("Exception : " + e); |
| 94 | e.printStackTrace(); |
| 95 | } |
| 96 | String mess = (String)sendMessages.remove(0); |
| 97 | if (!mess.isEmpty()) { |
| 98 | System.out.println("IHM -> message a envoyer : " + mess); |
| 99 | return randName + "> " + mess; |
| 100 | } else { |
| 101 | return ""; |
| 102 | } |
| 103 | } |
| 104 | |
| 105 | public void writeMessage(String mess) { |
| 106 | System.out.println("IHM -> message a ecrire : " + mess); |
| 107 | entrants.append(mess + "\n"); |
| 108 | } |
| 109 | |
| 110 | } // fin classe SimpleClientDiscussion |