Commit | Line | Data |
---|---|---|
15850b4c JB |
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 | ||
92d3f605 | 15 | import java.util.Random; |
15850b4c JB |
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; | |
92d3f605 JB |
32 | //FIXME: use a random name by thread for now, should be setable |
33 | private String randName; | |
15850b4c JB |
34 | |
35 | IHM() { | |
36 | sendMessages = new ArrayList<String>(); | |
92d3f605 JB |
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; | |
15850b4c JB |
54 | } |
55 | ||
56 | public void go() { | |
92d3f605 | 57 | JFrame cadre = new JFrame("Client de discussion de " + randName); |
15850b4c JB |
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 | ||
ef87f1a8 | 87 | synchronized public String getNextMessageToSend() { |
15850b4c JB |
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); | |
e2e6395d JB |
97 | if (!mess.isEmpty()) { |
98 | System.out.println("IHM -> message a envoyer : " + mess); | |
99 | return randName + "> " + mess; | |
100 | } else { | |
73a5e231 | 101 | return ""; |
e2e6395d | 102 | } |
15850b4c JB |
103 | } |
104 | ||
ef87f1a8 JB |
105 | public void writeMessage(String mess) { |
106 | System.out.println("IHM -> message a ecrire : " + mess); | |
15850b4c JB |
107 | entrants.append(mess + "\n"); |
108 | } | |
109 | ||
15850b4c | 110 | } // fin classe SimpleClientDiscussion |