package vn.edu.rmit.sadi; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.rmi.Naming; import java.util.Observable; import java.util.Observer; public class ChatClient extends JFrame implements Observer, ActionListener { private ChatServerRemote chatServer; // reference to the remote chat server private JTextArea txtDisplay = new JTextArea(10, 10); private JTextField txtMessage = new JTextField(40); private JButton btnSend = new JButton("Send"); private JButton btnLeave = new JButton("Leave"); private String userName; public ChatClient() { super("ChatClient"); txtDisplay.setEditable(false); txtDisplay.setLineWrap(true); txtDisplay.setWrapStyleWord(true); add(new JScrollPane(txtDisplay)); JPanel buttonsPanel = new JPanel(new GridLayout()); buttonsPanel.add(btnSend); buttonsPanel.add(btnLeave); JPanel controlPanel = new JPanel(new BorderLayout()); controlPanel.add(txtMessage); controlPanel.add(buttonsPanel, BorderLayout.EAST); add(controlPanel, BorderLayout.SOUTH); pack(); setLocationRelativeTo(null); txtMessage.addActionListener(this); btnSend.addActionListener(this); btnLeave.addActionListener(this); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { quit(); } public void windowOpened(WindowEvent e) { connect(); } }); } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == btnSend || src == txtMessage) { sendMessage(); } else if (src == btnLeave) { quit(); } } private void connect() { try { chatServer = (ChatServerRemote) Naming.lookup(ChatServer.REMOTE_OBJECT_URL); CallBackRemoteObject callback = new CallBackRemoteObject(this); ChatServerRemote.Status status; do { userName = JOptionPane.showInputDialog(this, "Enter your username", "ChatClient", JOptionPane.QUESTION_MESSAGE); if (userName == null || userName.equals("")) { quit(); } status = chatServer.connect(userName, callback); if (status != ChatServerRemote.Status.Success) { JOptionPane.showMessageDialog(this, "Username is invalid or in use", "Error", JOptionPane.ERROR_MESSAGE); } } while (status != ChatServerRemote.Status.Success); } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(this, "Connection error", "Error", JOptionPane.ERROR_MESSAGE); quit(); } } private void quit() { if (chatServer != null) { try { chatServer.disconnect(userName); } catch (Exception e) { } } System.exit(0); } private void sendMessage() { try { chatServer.sendChatMessage(userName, txtMessage.getText()); txtMessage.setText(null); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Connection error", "Error", JOptionPane.ERROR_MESSAGE); } } // Called by CallBackRemoteObject (when the server sent a message to it) public void update(Observable o, Object arg) { txtDisplay.append(arg.toString() + '\n'); txtDisplay.setCaretPosition(txtDisplay.getDocument().getLength()); } public static void main(String[] args) { final JFrame frame = new ChatClient(); frame.setVisible(true); } }