ChatWindow.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package client;
  2. import java.awt.BorderLayout;
  3. import java.awt.Dimension;
  4. import java.awt.GridBagConstraints;
  5. import java.awt.GridBagLayout;
  6. import java.awt.Point;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.ActionListener;
  9. import java.awt.event.KeyEvent;
  10. import java.awt.event.KeyListener;
  11. import java.io.EOFException;
  12. import java.io.File;
  13. import java.io.IOException;
  14. import java.io.ObjectInputStream;
  15. import java.io.PrintWriter;
  16. import java.net.InetSocketAddress;
  17. import java.net.Socket;
  18. import java.net.SocketTimeoutException;
  19. import java.util.ArrayList;
  20. import javax.swing.DefaultListModel;
  21. import javax.swing.JButton;
  22. import javax.swing.JFrame;
  23. import javax.swing.JLabel;
  24. import javax.swing.JList;
  25. import javax.swing.JPanel;
  26. import javax.swing.JScrollPane;
  27. import javax.swing.JTextField;
  28. import javax.swing.ListSelectionModel;
  29. import javax.swing.WindowConstants;
  30. import javax.swing.border.EmptyBorder;
  31. import common.InfoPacket;
  32. import common.MessagePacket;
  33. import common.MessagePacket.MessageType;
  34. @SuppressWarnings("serial")
  35. public class ChatWindow extends JFrame implements ActionListener, Runnable, KeyListener {
  36. Thread getMessages;
  37. static File confFile = new File("client.properties");
  38. String adress, username;
  39. ArrayList<String> lastMess = new ArrayList<String>();
  40. int port, messIndex = 0;
  41. Socket so;
  42. ObjectInputStream objIn;
  43. PrintWriter out;
  44. GridBagLayout g = new GridBagLayout();
  45. GridBagConstraints con = new GridBagConstraints();
  46. JPanel right = new JPanel();
  47. JLabel infoLabel = new JLabel("Users online:");
  48. DefaultListModel<String> model = new DefaultListModel<String>();
  49. JList<String> userList = new JList<String>(model);
  50. JButton reconnect = new JButton("Reconnect");
  51. Console chat = new Console();
  52. JScrollPane scroll = new JScrollPane(chat);
  53. JTextField write = new JTextField();
  54. public ChatWindow(String adress, int port, String username) {
  55. this.adress = adress;
  56. this.port = port;
  57. this.username = username;
  58. // List config
  59. userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  60. userList.setLayoutOrientation(JList.VERTICAL);
  61. // Label config
  62. infoLabel.setHorizontalAlignment(JLabel.CENTER);
  63. infoLabel.setBorder(new EmptyBorder(5, 5, 5, 5));
  64. // Layout config
  65. right.setLayout(g);
  66. con.fill = GridBagConstraints.HORIZONTAL;
  67. con.weightx = 1;
  68. con.gridx = 0;
  69. right.add(infoLabel, con);
  70. con.weighty = 1;
  71. con.fill = GridBagConstraints.BOTH;
  72. right.add(userList, con);
  73. con.weighty = 0;
  74. con.fill = GridBagConstraints.HORIZONTAL;
  75. right.add(reconnect, con);
  76. setLayout(new BorderLayout());
  77. add(chat, BorderLayout.NORTH);
  78. add(write, BorderLayout.SOUTH);
  79. add(right, BorderLayout.EAST);
  80. // Scrollbar config
  81. add(scroll);
  82. scroll.setMinimumSize(new Dimension(100, 100));
  83. scroll.setViewportView(chat);
  84. scroll.setSize(500, 130);
  85. // Listener config
  86. reconnect.addActionListener(this);
  87. write.addKeyListener(this);
  88. // Window config
  89. this.setLocation(new Point(100, 100));
  90. setSize(600, 600);
  91. setVisible(true);
  92. setTitle("Chat on " + adress + " | Username: " + username);
  93. setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  94. connect(adress, port, username);
  95. }
  96. public void send(String text) {
  97. if (so.isConnected() && !so.isClosed()) {
  98. out.println(text);
  99. out.flush();
  100. } else {
  101. chat.log(new MessagePacket("Not connected to server!", MessageType.WARNING));
  102. write.setEnabled(false);
  103. }
  104. }
  105. void connect(String address, int port, String username) {
  106. chat.log(new MessagePacket("Connecting to " + address + " on port " + port + ".", MessageType.INFO));
  107. if (getMessages != null)
  108. getMessages.interrupt();
  109. try {
  110. so.close();
  111. objIn.close();
  112. out.close();
  113. } catch (NullPointerException ex) {
  114. // Nothing
  115. } catch (IOException ex) {
  116. chat.log(new MessagePacket(ex.toString(), MessageType.ERROR));
  117. }
  118. try {
  119. so = new Socket();
  120. so.connect(new InetSocketAddress(address, port));
  121. objIn = new ObjectInputStream(so.getInputStream());
  122. out = new PrintWriter(so.getOutputStream(), true);
  123. } catch (SocketTimeoutException ex) {
  124. chat.log(new MessagePacket("Could not connect to server. (Connection timed out!)", MessageType.ERROR));
  125. return;
  126. } catch (IOException e) {
  127. chat.log(new MessagePacket(e.toString(), MessageType.ERROR));
  128. return;
  129. }
  130. send(username); // First packet sent to server sets username
  131. getMessages = new Thread(this);
  132. getMessages.start();
  133. write.setEnabled(true);
  134. }
  135. @Override
  136. public void actionPerformed(ActionEvent e) {
  137. if (e.getSource().equals(reconnect))
  138. connect(adress, port, username);
  139. }
  140. @Override
  141. public void run() {
  142. try {
  143. getMessages();
  144. } catch (EOFException eof) {
  145. chat.log(new MessagePacket(eof.toString() + " Disconnected from host.", MessageType.ERROR));
  146. } catch (ClassNotFoundException cnf) {
  147. chat.log(new MessagePacket(
  148. "The message recieved from the server could not be understood. Are you using the right version?",
  149. MessageType.ERROR));
  150. } catch (IOException e) {
  151. chat.log(new MessagePacket(e.toString(), MessageType.ERROR));
  152. }
  153. }
  154. public void getMessages() throws IOException, ClassNotFoundException {
  155. while (!getMessages.isInterrupted()) {
  156. Object fromServer = objIn.readObject();
  157. if (fromServer instanceof MessagePacket) {
  158. MessagePacket mess = ((MessagePacket) fromServer);
  159. chat.log(mess);
  160. } else if (fromServer instanceof InfoPacket) {
  161. InfoPacket info = (InfoPacket) fromServer;
  162. infoLabel.setText("<html>" + info.toString().replace("\n", "<br>"));
  163. model = new DefaultListModel<String>();
  164. for (String user : info.usersOnline)
  165. model.addElement(user);
  166. userList.setModel(model);
  167. } else if (fromServer instanceof String) {
  168. chat.log(new MessagePacket((String) fromServer, MessageType.NORMAL));
  169. } else
  170. throw new ClassNotFoundException();
  171. }
  172. }
  173. @Override
  174. public void keyPressed(KeyEvent eKey) {
  175. int keyCode = eKey.getKeyCode();
  176. switch (keyCode) {
  177. case KeyEvent.VK_UP:
  178. if (messIndex > 0)
  179. messIndex--;
  180. if (!lastMess.isEmpty())
  181. write.setText(lastMess.get(messIndex));
  182. break;
  183. case KeyEvent.VK_DOWN:
  184. if (messIndex <= lastMess.size())
  185. messIndex++;
  186. if (messIndex >= lastMess.size()) {
  187. messIndex = lastMess.size();
  188. write.setText("");
  189. } else
  190. write.setText(lastMess.get(messIndex));
  191. break;
  192. case KeyEvent.VK_ENTER:
  193. String text = write.getText().trim();
  194. if (!text.equals("")) {
  195. send(text);
  196. lastMess.add(text);
  197. messIndex = lastMess.size();
  198. write.setText("");
  199. }
  200. break;
  201. }
  202. }
  203. @Override
  204. public void keyReleased(KeyEvent arg0) {
  205. }
  206. @Override
  207. public void keyTyped(KeyEvent arg0) {
  208. }
  209. }