2017-02-20 37 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

Это, вероятно, это просто мал для вас, чтобы увидеть, пытаясь оберточной 'listDisplay' в' JScrollPane' и добавить его к раме вместо – 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 вы добавляете данные в ListModel из JList. Самый простой способ сделать это - создать DefaultListModel и добавить модель в JList. Затем вы можете добавить данные непосредственно в модели (нет необходимости в List):

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

Затем по мере добавления новых людей, вы просто вызвать метод addElement(...) на DefaultListModel.

Прочтите раздел из учебника Swing по How to Use Lists для рабочего примера. Кнопки «Hire» от ListDemo показывают, как добавить элемент. Также обратите внимание на то, как в примере в учебнике добавлена ​​панель JScrollPane , поэтому панель прокрутки может появляться по мере добавления большего количества пользователей.

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

Не используйте магические переменные. Люди не знают, что означает «Восток». API будет иметь переменные, которые можно использовать в качестве ограничения. Например:

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

Спасибо, похоже, что он работает, но я не делаю шва уметь удалить кого-либо из списка –

+0

'i do not seam, чтобы удалить кого-то из списка' - вы прочитали учебник и загрузили демо-код ??? Кнопки «Hire» и «Fire» выполняют именно то, что вы хотите. – camickr