我正在聊天客户端(我没有成功)。我正在制作一个谁是在线列表,它不会出现。这是代码
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();
}
}
守则仍然需要工作。有谁知道为什么列表没有出现?
答案 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");