JList没有显示在jframe中

时间:2017-02-20 20:27:30

标签: java swing arraylist jframe jlist

我正在聊天客户端(我没有成功)。我正在制作一个谁是在线列表,它不会出现。这是代码

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();
}
}

守则仍然需要工作。有谁知道为什么列表没有出现?

1 个答案:

答案 0 :(得分:2)

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

上面的代码什么也没做。您将一个字符串添加到列表。但是,您永远不会将List的内容添加到JList。 equals(..)方法用于比较对象,以查看一个Object是否等于另一个Object。

当您添加到JList时,您会将数据添加到ListModel的{​​{1}}。最简单的方法是创建JList并将模型添加到JList。然后,您可以将数据直接添加到模型中(不需要DefaultListModel):

List

然后,当您添加新人时,您只需在DefaultListModel model = new DefaultListModel(); model.addElement("Online People"); JList list = new JList( model ); 上调用addElement(...)方法。

阅读How to Use Lists上Swing教程中的部分以获取工作示例。 DefaultListModel中的“Hire”按钮显示了如何添加项目。另请注意教程中的示例如何添加ListDemo JScrollPane`,以便在添加更多用户时显示滚动条。

JList to a

不要使用魔法变量。人们不知道“东方”是什么意思。 API将包含可用作约束的变量。例如:

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