2017-02-20 104 views
-1

我正在聊天客户端(我没有做到)。我正在制作一个谁在线列表,它不会显示。这里是代码JList不在jframe中显示

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

它可能是,它只是小给你看,试图在一个'JScrollPane'包装'listDisplay'并将其添加到该帧,而不是 – MadProgrammer

+0

您还需要看看[并发在Swing中](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/),因为你违反了Swing的单线程规则 – MadProgrammer

回答

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

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

当您添加到JList时,您将数据添加到JListListModel。最简单的方法是创建一个DefaultListModel并将该模型添加到JList。然后你就可以将数据直接添加到模型(也没有必要为List):

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

然后当你添加新的人,你只是调用的DefaultListModeladdElement(...)方法。

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

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

请勿使用魔术变量。人们不知道“东方”是什么意思。该API将具有可用作约束的变量。例如:

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

谢谢,它看起来像它的工作,但我不缝能够从列表中删除某人 –

+0

'我不缝以能够从列表中删除某人' - 您是否阅读了教程并下载了演示代码? “Hire”和“Fire”按钮完全符合你的要求。 – camickr