I have tried to make a chat application that only saves the recieved messages which can then be deleted. I'm having some major problems with it.
Can anyone please point out or correct my coding. I have tried for ages to get this working but with no joy.
Client Code
import java.awt.*; import java.awt.event.*; import java.io.EOFException; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.InetAddress; import java.net.Socket; import javax.swing.*; import javax.swing.event.*; public class Client extends JPanel implements ListSelectionListener { private JList save; private DefaultListModel saveList; private static final String sendString = "Send"; private static final String deleteString = "Delete"; private JButton deleteBtn; private JTextField enterMsg; private static InetAddress host; ObjectOutputStream output; ObjectInputStream input; String message = ""; public Client() { super(new BorderLayout()); saveList = new DefaultListModel(); saveList.addElement("Hi How are you?"); saveList.addElement("I'm ok. How are the kids?"); saveList.addElement("Thats good to hear. I will have to give you a call for a meeting soon."); //Create the list and put it in a scroll pane. save = new JList(saveList); save.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); save.setSelectedIndex(0); save.addListSelectionListener(this); save.setVisibleRowCount(5); JScrollPane listScrollPane = new JScrollPane(save); JButton sendBtn = new JButton(sendString); SendListener sendListener = new SendListener(sendBtn); sendBtn.setActionCommand(sendString); sendBtn.addActionListener(sendListener); sendBtn.setEnabled(false); deleteBtn = new JButton(deleteString); deleteBtn.setActionCommand(deleteString); deleteBtn.addActionListener(new DeleteListener()); enterMsg = new JTextField(100); enterMsg.addActionListener(sendListener); enterMsg.getDocument().addDocumentListener(sendListener); String name = saveList.getElementAt( save.getSelectedIndex()).toString(); //Create a panel that uses BoxLayout. JPanel buttonPane = new JPanel(); buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS)); buttonPane.add(deleteBtn); buttonPane.add(Box.createHorizontalStrut(5)); buttonPane.add(new JSeparator(SwingConstants.VERTICAL)); buttonPane.add(Box.createHorizontalStrut(5)); buttonPane.add(enterMsg); buttonPane.add(sendBtn); buttonPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); add(listScrollPane, BorderLayout.CENTER); add(buttonPane, BorderLayout.PAGE_END); } class DeleteListener implements ActionListener { public void actionPerformed(ActionEvent e) { //This method can be called only if //there's a valid selection //so go ahead and remove whatever's selected. int index = save.getSelectedIndex(); saveList.remove(index); int size = saveList.getSize(); if (size == 0) { //Nobody's left, disable firing. deleteBtn.setEnabled(false); } else { //Select an index. if (index == saveList.getSize()) { //removed item in last position index--; } save.setSelectedIndex(index); save.ensureIndexIsVisible(index); } } } //This listener is shared by the text field and the send button. class SendListener implements ActionListener, DocumentListener { private boolean alreadyEnabled = false; private JButton sendBtn; public SendListener(JButton button) { this.sendBtn = button; } //Required by ActionListener. public void actionPerformed(ActionEvent e) { String message = enterMsg.getText(); //User didn't type in a unique name... if (message.equals("") || alreadyInList(message)) { Toolkit.getDefaultToolkit().beep(); enterMsg.requestFocusInWindow(); enterMsg.selectAll(); return; } int index = save.getSelectedIndex(); //get selected index if (index == -1) { //no selection, so insert at beginning index = 0; } else { //add after the selected item index++; } saveList.insertElementAt(enterMsg.getText(), index); //If we just wanted to add to the end, we'd do this: //listModel.addElement(employeeName.getText()); //Reset the text field. enterMsg.requestFocusInWindow(); enterMsg.setText(""); //Select the new item and make it visible. save.setSelectedIndex(index); save.ensureIndexIsVisible(index); } protected boolean alreadyInList(String name) { return saveList.contains(name); } //Required by DocumentListener. public void insertUpdate(DocumentEvent e) { enableButton(); } //Required by DocumentListener. public void removeUpdate(DocumentEvent e) { handleEmptyTextField(e); } //Required by DocumentListener. public void changedUpdate(DocumentEvent e) { if (!handleEmptyTextField(e)) { enableButton(); } } private void enableButton() { if (!alreadyEnabled) { sendBtn.setEnabled(true); } } private boolean handleEmptyTextField(DocumentEvent e) { if (e.getDocument().getLength() <= 0) { sendBtn.setEnabled(false); alreadyEnabled = false; return true; } return false; } } //This method is required by ListSelectionListener. public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() == false) { if (save.getSelectedIndex() == -1) { //No selection, disable delete button. deleteBtn.setEnabled(false); } else { //Selection, enable the delete button. deleteBtn.setEnabled(true); } } } private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("ListDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. JComponent newContentPane = new ListDemo(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible(true); } public void runClient() { Socket client; try { // Step 1: Create a Socket to make connection. host = InetAddress.getLocalHost(); //............... client = new Socket(host, 50000 ); // Step 2: Get the input and output streams. output = new ObjectOutputStream( client.getOutputStream() ); output.flush(); input = new ObjectInputStream( client.getInputStream() ); // Step 3: Process connection. enterMsg.setEnabled( true ); do { try { message = (String) input.readObject(); enterMsg.setCaretPosition( enterMsg.getText().length() ); } catch ( ClassNotFoundException cnfex ) { } } while ( !message.equals( "SERVER>>> TERMINATE" ) ); // Step 4: Close connection. output.close(); input.close(); client.close(); } catch ( EOFException eof ) { System.out.println( "Server terminated connection" ); } catch ( IOException e ) { e.printStackTrace(); } } private void sendData( String s ) { try { message = s; output.writeObject( "CLIENT1>>> " + s ); output.flush(); } catch ( IOException cnfex ) { } } class FireListener implements ActionListener { public void actionPerformed(ActionEvent e) { //This method can be called only if //there's a valid selection //so go ahead and remove whatever's selected. int index = save.getSelectedIndex(); saveList.remove(index); int size = saveList.getSize(); if (size == 0) { //Nobody's left, disable firing. deleteBtn.setEnabled(false); } else { //Select an index. if (index == saveList.getSize()) { //removed item in last position index--; } save.setSelectedIndex(index); save.ensureIndexIsVisible(index); } } } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }
Server Code
import java.awt.*; import java.awt.event.*; import java.io.EOFException; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import javax.swing.*; import javax.swing.event.*; public class Server extends JPanel implements ListSelectionListener { private JList save; private DefaultListModel saveList; private static final String sendString = "Send"; private static final String deleteString = "Delete"; private JButton deleteBtn; private JTextField enterMsg; private static InetAddress host; ObjectOutputStream output; ObjectInputStream input; String message = ""; public Server() { super(new BorderLayout()); saveList = new DefaultListModel(); saveList.addElement("Hi How are you?"); saveList.addElement("I'm ok. How are the kids?"); saveList.addElement("Thats good to hear. I will have to give you a call for a meeting soon."); //Create the list and put it in a scroll pane. save = new JList(saveList); save.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); save.setSelectedIndex(0); save.addListSelectionListener(this); save.setVisibleRowCount(5); JScrollPane listScrollPane = new JScrollPane(save); JButton sendBtn = new JButton(sendString); SendListener sendListener = new SendListener(sendBtn); sendBtn.setActionCommand(sendString); sendBtn.addActionListener(sendListener); sendBtn.setEnabled(false); deleteBtn = new JButton(deleteString); deleteBtn.setActionCommand(deleteString); deleteBtn.addActionListener(new DeleteListener()); enterMsg = new JTextField(100); enterMsg.addActionListener(sendListener); enterMsg.getDocument().addDocumentListener(sendListener); String name = saveList.getElementAt( save.getSelectedIndex()).toString(); //Create a panel that uses BoxLayout. JPanel buttonPane = new JPanel(); buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS)); buttonPane.add(deleteBtn); buttonPane.add(Box.createHorizontalStrut(5)); buttonPane.add(new JSeparator(SwingConstants.VERTICAL)); buttonPane.add(Box.createHorizontalStrut(5)); buttonPane.add(enterMsg); buttonPane.add(sendBtn); buttonPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); add(listScrollPane, BorderLayout.CENTER); add(buttonPane, BorderLayout.PAGE_END); } class DeleteListener implements ActionListener { public void actionPerformed(ActionEvent e) { //This method can be called only if //there's a valid selection //so go ahead and remove whatever's selected. int index = save.getSelectedIndex(); saveList.remove(index); int size = saveList.getSize(); if (size == 0) { //Nobody's left, disable firing. deleteBtn.setEnabled(false); } else { //Select an index. if (index == saveList.getSize()) { //removed item in last position index--; } save.setSelectedIndex(index); save.ensureIndexIsVisible(index); } } } //This listener is shared by the text field and the send button. class SendListener implements ActionListener, DocumentListener { private boolean alreadyEnabled = false; private JButton sendBtn; public SendListener(JButton button) { this.sendBtn = button; } //Required by ActionListener. public void actionPerformed(ActionEvent e) { String message = enterMsg.getText(); //User didn't type in a unique name... if (message.equals("") || alreadyInList(message)) { Toolkit.getDefaultToolkit().beep(); enterMsg.requestFocusInWindow(); enterMsg.selectAll(); return; } int index = save.getSelectedIndex(); //get selected index if (index == -1) { //no selection, so insert at beginning index = 0; } else { //add after the selected item index++; } saveList.insertElementAt(enterMsg.getText(), index); //If we just wanted to add to the end, we'd do this: //listModel.addElement(employeeName.getText()); //Reset the text field. enterMsg.requestFocusInWindow(); enterMsg.setText(""); //Select the new item and make it visible. save.setSelectedIndex(index); save.ensureIndexIsVisible(index); } protected boolean alreadyInList(String name) { return saveList.contains(name); } //Required by DocumentListener. public void insertUpdate(DocumentEvent e) { enableButton(); } //Required by DocumentListener. public void removeUpdate(DocumentEvent e) { handleEmptyTextField(e); } //Required by DocumentListener. public void changedUpdate(DocumentEvent e) { if (!handleEmptyTextField(e)) { enableButton(); } } private void enableButton() { if (!alreadyEnabled) { sendBtn.setEnabled(true); } } private boolean handleEmptyTextField(DocumentEvent e) { if (e.getDocument().getLength() <= 0) { sendBtn.setEnabled(false); alreadyEnabled = false; return true; } return false; } } //This method is required by ListSelectionListener. public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() == false) { if (save.getSelectedIndex() == -1) { //No selection, disable delete button. deleteBtn.setEnabled(false); } else { //Selection, enable the delete button. deleteBtn.setEnabled(true); } } } private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("ListDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. JComponent newContentPane = new ListDemo(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible(true); } public void runServer() { ServerSocket server; Socket connection; int counter = 1; try { // Step 1: Create a ServerSocket. server = new ServerSocket(50000 ); while ( true ) { // Step 2: Wait for a connection. display.setText( "Waiting for connection\n" ); connection = server.accept(); display.append( "Connection " + counter + " received from: " + connection.getInetAddress().getHostName() ); // Step 3: Get input and output streams. output = new ObjectOutputStream( connection.getOutputStream() ); output.flush(); input = new ObjectInputStream( connection.getInputStream() ); display.append( "\nGot I/O streams\n" ); // Step 4: Process connection. String message = "SERVER>>> Connection successful"; output.writeObject( message ); output.flush(); enter.setEnabled( true ); do { try { message = (String) input.readObject(); display.append( "\n" + message ); display.setCaretPosition( display.getText().length() ); } catch ( ClassNotFoundException cnfex ) { display.append( "\nUnknown object type received" ); } } while ( !message.equals( "CLIENT>>> TERMINATE" ) ); // Step 5: Close connection. display.append( "\nUser terminated connection" ); enter.setEnabled( false ); output.close(); input.close(); connection.close(); ++counter; } } catch ( EOFException eof ) { System.out.println( "Client terminated connection" ); } catch ( IOException io ) { io.printStackTrace(); } } private void sendData( String s ) { try { output.writeObject( "CLIENT2>>> " + s ); output.flush(); display.append( "\nCLIENT2>>>" + s ); } catch ( IOException cnfex ) { display.append( "\nError writing object" ); } } public static void main( String args[] ) { Server app = new Server(); app.runServer(); } }//end of Server
Thanks in advance