2011-08-25 9 views
0

申し訳ありませんが、私はここに問題があります。しかし残念ながら、助けを求めることを考える前に、それを取り戻すことはできませんでした。そしてあなたの時間と労力のために事前に感謝します。JavaでJListを更新する方法チャット

新しいクライアントが入ったときに最初のクライアントが更新されるように、クライアントJList(userList)を更新しようとしています。現在のところ、1つのクライアントがある場合は、それ自体を見ることができますが、別のクライアントがチャットに入ると、そのクライアントだけが2つのクライアントが接続されていることがわかり、初期のクライアントはJListの名前で更新されません。 私はJavaの専門家ではないため、回答を簡略化するのに役立ちます。ありがとうございました!

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

を変更/修正。また、モデル変更のリストを通知するコードは表示されません。 – Saint

答えて

2

あなたはConcurency in Swingとの実際の問題を持って、BackGround Tasksからのすべての出力がなければなりませんinvokeLater()にラップされています

1の追加/のための唯一の方法を作成))を良好にinvokeAndWaitの(になるであろう可能と繰り返さネットワーク障害(複数可)

itingする JTextArea

2)メソッドに文字列を追加JTextAreaラップに文字列を追加/追加invokeLater()

3)には、このthreadをチェックし、サーバー側のコードが唯一の新しい接続されたクライアントへのユーザーの更新を送信するが、ユーザーをexsitingないので、[OK]を与えられた例ですべてのメソッド

+0

お返事ありがとうございます。 しかし、私は – user863550

+0

@ user863550を理解していないので、JListメソッドを直接呼び出すことはできません。 SwingUtilities.invokeLater(Runnable)を呼び出し、Runnable内のJListと対話する必要があります。 http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.htmlを完全に読んで理解してください。 – Gili

+0

よろしくお願いいたします。 – user863550

関連する問題