2011-08-25 6 views
0

죄송합니다. 여기에 문제가 있습니다. 가능한 한 많이 시도했습니다. 그러나 불행하게도 도움을 요청하기 전에 그걸 알 수 없었습니다. 그리고 시간과 노력에 미리 감사드립니다.Java에서 JList를 업데이트하는 방법

새 클라이언트가 들어올 때 초기 클라이언트가 업데이트되도록 클라이언트 JList (userList)를 업데이트하려고합니다. 하지만 현재 하나의 클라이언트가있는 경우 자체를 볼 수 있지만 다른 클라이언트가 채팅에 입장하면 해당 클라이언트 만 두 클라이언트가 연결되어 있다는 것을 알게되고 초기 클라이언트는 JList의 이름으로 업데이트되지 않습니다. 자바 전문가가 아니기 때문에 모든 답변을 단순화하는 데 도움이됩니다. 고맙습니다!

ClientChat 코드 :

import java.io.*; 
import java.net.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

    public class ClientChat extends JFrame { 
private Toolkit toolkit; 
private JLabel msgLabel; 
private JButton sendBtn; 
private JTextArea genMsg; 
public static JList userList; 
private JTextField msgF; 
private ObjectOutputStream output; 
private ObjectInputStream input; 
private Socket client; 
private String chatServer; 
private int serverport; 
private String Client_name; 

public ClientChat(String host, int port,String C_Name){ 

    // set server to which this client connects 
    chatServer = host; 
    serverport = port; 
    Client_name = C_Name; 


    toolkit = Toolkit.getDefaultToolkit();  
    if(toolkit.getScreenSize().getWidth() > 600) 
     setSize(600, 605); 
    else 
     setSize((int)toolkit.getScreenSize().getWidth(),(int)toolkit.getScreenSize().getHeight() - 20);   
     setResizable(false); 
     Dimension dimension = getSize();  
     setLayout(new FlowLayout()); 

     setTitle("FRESHER MARKETING COMPANY");  
     addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0);}}); 

     Container container = getContentPane(); 
     container.setLayout(new FlowLayout()); 

     // create General Message Screen 
     genMsg = new JTextArea(30,43); 
     genMsg.setEditable(false); 
     genMsg.setFont(new java.awt.Font("Times New Roman", 0, 12)); // NOI18N 
     container.add(new JScrollPane(genMsg)); 
     JPanel genMsgPanel = new JPanel(); 
     genMsgPanel.setLayout(new BorderLayout()); 
     genMsgPanel.add(new JScrollPane(genMsg), BorderLayout.EAST); 
     genMsgPanel.setBorder(BorderFactory.createLineBorder(Color.black)); 
     container.add(genMsgPanel); 

     // create Friend List View 
     userList = new JList(); 
     userList.setPreferredSize(new Dimension(150,423)); 
     userList.setFont(new java.awt.Font("Times New Roman", 0, 12)); // NOI18N 
     container.add(userList); 
     JPanel userListPanel = new JPanel(); 
     userListPanel.setLayout(new BorderLayout()); 
     userListPanel.add(userList, BorderLayout.CENTER); 
     userListPanel.setBorder(BorderFactory.createLineBorder(Color.black)); 
     container.add(userListPanel); 

     msgLabel = new JLabel ("Message:"); 
     container.add(msgLabel); 
     JPanel msgFPanel = new JPanel(); 
     msgFPanel.setLayout(new BorderLayout()); 
     msgFPanel.add(new JScrollPane(msgLabel), BorderLayout.WEST); 
     container.add(msgFPanel); 

     // create Message Field 
     msgF = new JTextField(37); 
     msgF.setEnabled(true); 
     msgF.setText(""); 
     msgF.requestFocus(); 
     msgF.addActionListener(
      new ActionListener() { 

      // send message to server 
       public void actionPerformed(ActionEvent event) 
       { 
        //sendData(event.getActionCommand()); 
       } 
      } // end anonymous inner class 
      ); // end call to addActionListener 
     msgFPanel.add(new JScrollPane(msgF), BorderLayout.CENTER); 
      } 
public void runClient() 
{ 
    // connect to server, get streams, process connection 
    try { 
     // Step 1: Create a Socket to make connection 
     connectToServer(); 
     // Step 2: Get the input and output streams 
     getStreams(); 
     handShake(); 
    }// server closed connection 
    catch (EOFException eofException) { 
     System.out.println("Server terminated connection"); 
    } 

    // process problems communicating with server 
    catch (IOException ioException) { 
     ioException.printStackTrace(); 
    } 
} 
private void connectToServer() throws IOException 
{ 
    genMsg.setText("Attempting connection\n"); 
    // create Socket to make connection to server 
    client = new Socket(InetAddress.getByName(chatServer), serverport); 
    // display connection information 
    genMsg.append("Connected to: " +client.getInetAddress().getHostName()); 
} 

private void getStreams() throws IOException 
{ 
    // set up output stream for objects 
    output = new ObjectOutputStream(client.getOutputStream()); 
    // flush output buffer to send header information 
    output.flush(); 
} 
private void handShake() throws IOException 
{ 
    String message; 
    String value[]; 
    value = new String [100]; 
    try { 
    output.writeObject(Client_name); 
    output.flush(); 
    input = new ObjectInputStream(client.getInputStream()); 
    genMsg.append("\n Client Name Send" ); 
    message = (String) input.readObject(); 
    int i=0; 
    while (!message.equals(".")){ 

     //genMsg.append("\n"+message); 
     value[i++] =message; 
     message = (String) input.readObject(); 
    } 
    userList.setListData(value); 
    message = (String) input.readObject(); 
    genMsg.append("\n"+message); 
    } 
    // process problems sending object 
    catch (IOException ioException) { 
     genMsg.append("\nError writing object"); 
    } 
    catch (ClassNotFoundException classNotFoundException) { 
     System.out.println("\nUnknown object type received"); 
     } 

} 
public static void main(String args[]) { 

    ClientChat application; 
    application = new ClientChat("127.0.0.1",5130,args[0]); 
    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    application.runClient(); 
    } 
} 

ServerChat 코드 :

import java.io.*; 
import java.net.*; 
import java.util.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ServerChat extends JFrame 
{ 
private ObjectInputStream input; 
private ObjectOutputStream output; 
private JTextField enterField; 
public static JTextArea displayArea; 
private ServerSocket server; 
private Socket connection; 
private ServerThread c1[]; 
//private Client Cname; 
private static String clientList[]; 
private int counter = 0; 

public ServerChat() 
{ 
    super("Server"); 
    Container container = getContentPane(); 
    clientList = new String[100]; 
    // create enterField and register listener 
    enterField = new JTextField(); 
    enterField.setEnabled(false); 
    enterField.addActionListener(

    new ActionListener() { 
     // send message to client 
     public void actionPerformed(ActionEvent event) 
     { 
      //sendData(event.getActionCommand()); 
     } 
    } // end anonymous inner class 
    ); // end call to addActionListener 

    container.add(enterField, BorderLayout.NORTH); 
    // create displayArea 
    displayArea = new JTextArea(); 
    container.add(new JScrollPane(displayArea), BorderLayout.CENTER); 
    setSize(300, 150); 
    setVisible(true); 
} 
public void runServer() 
{ 
    // set up server to receive connections; 
    // process connections 
    try { 
    // Step 1: Create a ServerSocket. 
    server = new ServerSocket(5130, 100); 
    c1 = new ServerThread[100]; 
    while (true) { 
     // Step 2: Wait for a connection. 
     waitForConnection(); 
     handShake(); 
     displayArea.append("\nHanshake Complete"); 
     //c1[counter] = new ServerThread(connection,counter); 
     //c1[counter].start(); 
     ++counter; 
     } 
    } 
    // process EOFException when client closes connection 
    catch (EOFException eofException) { 
    System.out.println("Client terminated connection"); 
    } 
    // process problems with I/O 
    catch (IOException ioException) { 
    ioException.printStackTrace(); 
    } 
} 
private void waitForConnection() throws IOException 
{ 
    displayArea.append("\nWaiting for connection "); 
    // allow server to accept a connection 
    connection = server.accept(); 
    displayArea.append("\nClient connected : Client"); 
} 
private void handShake() throws IOException 
{ 
    output = new ObjectOutputStream(connection.getOutputStream()); 
    output.flush(); 
    String message; 
    input = new ObjectInputStream(connection.getInputStream()); 
    try { 
     message = (String) input.readObject(); 
     clientList[counter]= message; 
     displayArea.append("\nClient connected : "+message); 
     for (int i=0; i<=counter;i++) 
     { 
      output.writeObject(clientList[i]); 
      output.flush(); 
     } 
     output.writeObject("."); 
     output.flush(); 
     } 
    // catch problems reading from client 
    catch (ClassNotFoundException classNotFoundException) { 
     System.out.println("\nUnknown object type received"); 
     } 
     catch (IOException ioException) { 
    ioException.printStackTrace(); 
    } 
} 
public static void main(String args[]) 
{ 
    ServerChat application = new ServerChat(); 
    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    application.runServer(); 
} 
} 

있는 ServerThread 코드 :

import java.io.*; 
import java.net.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public class ServerThread extends Thread 
{ 
private Socket connection; 
private ObjectOutputStream output; 
private ObjectInputStream input; 
private int counter; 
public ServerThread(Socket con,int count) 
{ 
    connection = con; 
    counter = count; 

} 
public void run() 
{ 
     try 
     { 
      getStreams(); 
      processConnection(); 
     } 
     // process EOFException when client closes connection 
    catch (EOFException eofException) { 
    System.out.println("Client terminated connection"); 
    } 

    // process problems with I/O 
    catch (IOException ioException) { 
    ioException.printStackTrace(); 
    } 
} 
    private void getStreams() throws IOException 
    { 
    // set up output stream for objects 
    output = new ObjectOutputStream(connection.getOutputStream()); 
    // flush output buffer to send header information 
    output.flush(); 
    output.writeObject("SERVER>>> Connection successful"); 
    output.flush(); 
    } 
private void processConnection() throws IOException 
{ 
    // send connection successful message to client 
    String message = "SERVER>>> Connection successful"; 

    output.writeObject(message); 
    output.flush(); 
} 
private void closeConnection() throws IOException 
{ 
    ServerChat.displayArea.append("\nUser terminated connection"); 

    output.close(); 
    input.close(); 
    connection.close(); 
    } 
} 
+0

좋아 모든 방법을 변경하므로 서버 측 코드는 사용자가 새로운 연결된 클라이언트에 업데이트하지만 exsiting없는 사용자를 보냅니다. 또한 모델 변경 목록을 알리는 코드는 표시되지 않습니다. – Saint

답변

2

당신이 Concurency in Swing와 실제 문제가, BackGround Tasks의 모든 출력이되어야합니다 invokeLater()에 래퍼되어 있습니다. 추가/

2) 방법은 /는 JTextArea 랩에 문자열을 추가 추가 JTextArea

에 문자열을 추가에 대한 신랄한 가능하고 반복 네트워크 오류 (들) 후 더 나은의 invokeAndWait()로 될 것이다는

1) 하나의 방법을 만들 invokeLater로()

3 )이 thread을 확인하고 수정/주어진 예를

+0

답변 해 주셔서 감사합니다. – user863550

+0

@ user863550을 이해할 수 없다면 직접 JList 메서드를 호출 할 수 없습니다. SwingUtilities.invokeLater (Runnable)를 호출 해, Runnable 내의 JList와 상호 작용할 필요가 있습니다. http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html을 읽어보십시오. 그러면 이해할 수 있습니다. – Gili

+0

좋습니다, 고맙습니다, 그것을 읽으십시오. – user863550

관련 문제