2010-10-18 75 views
0

我正在寫一個RMI聊天程序。在我的程序中,我能夠接收和發送消息,但我無法在TextArea中顯示它。我不確定錯誤是什麼。我也試過使用Event Dispatch方法。它沒有幫助。更新jTextArea的問題

public class client extends javax.swing.JFrame implements inter { 

public client() { 
    initComponents(); 
} 


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    try { 
     final inter i = (inter) Naming.lookup("rmi://localhost:1111/client1"); 
     final String msg = jTextField1.getText(); 
     if (msg.length() > 0) { 
      jTextArea1.append("Me :" + msg); 
      java.awt.EventQueue.invokeLater(new Runnable() { 

       public void run() { 
        try { 
         i.rcvMsg("Client 1 : " + msg); 
        } catch (RemoteException ex) { 
        } 
       } 
      }); 


     } 
    } catch (RemoteException ex) { 
    } catch (NotBoundException ex) { 
    } catch (MalformedURLException ex) { 
    } 
}           

public void rcvMsg(String msg) { 
    final String s = msg; 
    java.awt.EventQueue.invokeLater(new Runnable() { 

     public void run() { 
      System.out.println("server called"); 
      System.out.println(s); 
      jTextArea1.append(s); 
      System.out.println("client msg" + java.awt.EventQueue.isDispatchThread()); 
      jTextArea1.update(jTextArea1.getGraphics()); 
     } 
    }); 
} 

public static void main(String args[]) { 
    try { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new client().setVisible(true); 
      } 
     }); 
     client c2 = new client(); 
     inter stub = (inter) UnicastRemoteObject.exportObject(c2, 0); 
     Registry registry = LocateRegistry.createRegistry(1113); 
     registry.bind("client2", stub); 
    } catch (AlreadyBoundException ex) { 
    } catch (AccessException ex) { 
    } catch (RemoteException ex) { 
    } 
} 
} 

請幫助...

+0

也許你空的catch語句隱藏了一些信息? – 2010-10-18 06:18:13

+0

nope ...我剛剛刪除了代碼,以便在stackoverflow中發帖。 – rgksugan 2010-10-18 06:31:09

回答

1

只是使用共享的getGraphics()某些信息不理解並會導致問題,

jTextArea1.update(jTextArea1.getGraphics());

和我也創建聊天應用程序與RMI:

Pass by reference problem in RMI?也有客戶寫在那裏,可能是這將是對你有用。

0

main創建c2後,打電話c2.setVisible(true);

rcvMsg的代碼被稱爲上的clientC2實例。由於c2實例永遠不可見,因此您看不到任何更改。

您可能希望客戶端連接到服務器,而不是直接連接到另一個客戶端。客戶端到客戶端將用於2個端點。但是如果你想添加第三個,會發生什麼?第四?你真的想要一個server作爲所有客戶的中介。