简体   繁体   中英

JList not showing in jframe

I was working on a chat client (I did not make it). I was making an who is online list and it would not show up. Here is the code

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * A simple Swing-based client for the chat server.  Graphically
 * it is a frame with a text field for entering messages and a
 * textarea to see the whole dialog.
 *
 * The client follows the Chat Protocol which is as follows.
 * When the server sends "SUBMITNAME" the client replies with the
 * desired screen name.  The server will keep sending "SUBMITNAME"
 * requests as long as the client submits screen names that are
 * already in use.  When the server sends a line beginning
 * with "NAMEACCEPTED" the client is now allowed to start
 * sending the server arbitrary strings to be broadcast to all
 * chatters connected to the server.  When the server sends a
 * line beginning with "MESSAGE " then all characters following
 * this string should be displayed in its message area.
 */
public class ChatClient {
    List<String> names = new ArrayList<String>();
    BufferedReader in;
    PrintWriter out;
    JFrame frame = new JFrame("Chatter");

    JTextArea messageArea = new JTextArea(8, 40);
JTextField textField = new JTextField(40);
JList listDisplay = new JList();

/**
 * Constructs the client by laying out the GUI and registering a
 * listener with the textfield so that pressing Return in the
 * listener sends the textfield contents to the server.  Note
 * however that the textfield is initially NOT editable, and
 * only becomes editable AFTER the client receives the NAMEACCEPTED
 * message from the server.
 */
public ChatClient() {

    // Layout GUI
    names.add("Online People");
    listDisplay.equals(names);

    textField.setEditable(false);
    messageArea.setEditable(false);
    frame.getContentPane().add(listDisplay, "East");
    frame.getContentPane().add(textField, "South");
    frame.getContentPane().add(new JScrollPane(messageArea), "North");

    frame.pack();
    // Add Listeners
    textField.addActionListener(new ActionListener() {
        /**
         * Responds to pressing the enter key in the textfield by sending
         * the contents of the text field to the server.    Then clear
         * the text area in preparation for the next message.
         */
        public void actionPerformed(ActionEvent e) {
            out.println(textField.getText());
            textField.setText("");
        }
    });
}

/**
 * Prompt for and return the address of the server.
 */
private String getServerAddress() {
    return JOptionPane.showInputDialog(
        frame,
        "Enter IP Address of the Server:",
        "Welcome to the Chatter",
        JOptionPane.QUESTION_MESSAGE);
}

/**
 * Prompt for and return the desired screen name.
 */
String getName() {
    String name = JOptionPane.showInputDialog(
            frame,
            "Choose a screen name:",
            "Screen name selection",
            JOptionPane.PLAIN_MESSAGE);
    return name;
}

/**
 * Connects to the server then enters the processing loop.
 */
private void run() throws IOException {

    // Make connection and initialize streams
    String serverAddress = getServerAddress();
    @SuppressWarnings("resource")
    Socket socket = new Socket(serverAddress, 25565);
    in = new BufferedReader(new InputStreamReader(
        socket.getInputStream()));
    out = new PrintWriter(socket.getOutputStream(), true);
    String name = getName();

    // Process all messages from server, according to the protocol.
    while (true) {
        String line = in.readLine();
        if (line.startsWith("SUBMITNAME")) {

            out.println(name);
        } else if (line.equals("NAMEACCEPTED " + name)){
            textField.setEditable(true);
            names.add(name);
            listDisplay.equals(names);
        }

        else if (line.startsWith("NAMEACCEPTED ")) {
            line.replaceAll("NAMEACCEPTED ", "");
            names.add(name);
            listDisplay.equals(names);
        } 

        else if (line.startsWith("MESSAGE")) {
            messageArea.append(line.substring(8) + "\n");
                 messageArea.setCaretPosition(messageArea.getDocument().getLength());
        } else if (line.startsWith("KICK " + name) ){
            JOptionPane.showMessageDialog(null, "YOU HAVE BEEN KICKED \nRestart the program to join again", "KICK", JOptionPane.WARNING_MESSAGE);
            textField.setEditable(false);
        } else if (line.startsWith("SILENT")){
            textField.setEditable(false);
        }
    }

}

/**
 * Runs the client as an application with a closeable frame.
 */
public static void main(String[] args) throws Exception {
    ChatClient client = new ChatClient();
    client.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    client.frame.setVisible(true);
    client.run();
}
}

The Code still needs work. Does anyone know why it list does not show up?

names.add("Online People");
listDisplay.equals(names);

The above code does nothing. You add a String to a List. But you never add the contents of the List to the JList . The equals(..) method is used to compare Objects, to see if one Object is equal to another Object.

When you add to a JList you add the data to the ListModel of the JList . The easiest way to do this is to create a DefaultListModel and add the model to the JList. Then you can add data directly to the model (there is no need for the List ):

DefaultListModel model = new DefaultListModel();
model.addElement("Online People");
JList list = new JList( model );

Then as you add new people you just invoke the addElement(...) method on the DefaultListModel .

Read the section from the Swing tutorial on How to Use Lists for a working example. The "Hire" buttons from the ListDemo show how to add an item. Also note how the example in the tutorial adds the JList to a JScrollPane` so scrollbar can appear as more users are added.

frame.getContentPane().add(listDisplay, "East");

Don't use magic variables. People don't know what "East" means. The API will have variables that you can use as the constraint. For example:

frame.getContentPane().add(listDisplay, BorderLayout.EAST);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM