2013-12-14 76 views
0

我在做一個聊天室。我有一個用Netbeans創建的jFrame,但我有一個問題。我有兩個重要的課程。其中之一就是界面本身。另一個是帶有運行方法的java類,它可以提供新的消息。我將啓動一個將運行此運行方法的線程。每次我讀取消息時,我都想使用接口的發送方法。此方法會將消息附加到JEditorPane。但它不會追加它。我確實收到了一條消息,但沒有出現在jeditorpane中...請幫助我嗎?我無法訪問另一個類的用戶的jEditorPane

此方法位於ClientForm1(接口)上。它會將文本附加到編輯器窗格。我從這裏開始檢查傳入消息的線程

public void send(String message){ 
    String messages; 
    messages = jEditorPane1.getText(); 
    jEditorPane1.setText(messages+message+"\n"); 
} 

這是從服務器檢查傳入消息的運行方法。所有的JFrame變量都是私有的。

public ResMesClient(Socket socket, BufferedReader br, PrintStream p){ 
    this.socket = socket; 
    is=br; 
    ps = p; 
} 
@Override 
@SuppressWarnings("empty-statement") 
public void run(){ 
    String messages; 
    try { 
    //This thread will read the server messages 
     ClientForm1 cf = new ClientForm1(socket,ps); //I create an object 
     JFrame frame1 = cf; //I create a frame and set it visible. 
     frame1.setVisible(true); 
    while(true){ 
     messages = is.readLine(); 
     System.out.println("From ResMesClient : "+messages); 
     if(!messages.equals("QUITCLIENT")); 
     else cf.send("Set text works"); //I call a send method of ClientForm1 class 
    } 
    } catch (IOException ex) { 
    } 

這兩個是不同文件中的2個不同的java類。 但它不追加...我嘗試了很多東西,但它不工作...至少,我可以肯定地告訴我,我確實收到一條消息,只是它不追加

在此先感謝您

+1

作爲參考,顯示了一個完整的工作示例[此處](http://stackoverflow.com/a/3245805/230513)。 – trashgod

+0

我剛看到你的完整代碼,我認爲這個問題只是socket和serversocket的概念。如果你願意,我可以在星期日之前爲你提供一個簡單的例子。另外看看Java Net API和Socket編程。 – Diversity

回答

0

注意從不屬於原始Swing或SWT Thread - > Other Process或ThreadGroup的線程中調用SWT或Swing方法。

使用SWT這意味着調用text.setText方法必須使用Display對象

display.asyncExec(new Runnable() { 
    public void run() { 
     cf.send(message) 
    } 
}); 

使用擺動執行意味着

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     cf.send(message); 
    } 
}); 

所以你looü應該是這樣的

while(true){ 
    messages = is.readLine(); 
    System.out.println("From ResMesClient : "+messages); 
    if(!messages.equals("QUITCLIENT")) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
      cf.send(message); 
     } 
    } else { 

     //Quit programm or whatever 
    } 
}); 
} 

我認爲應該有你的問題。

+0

非常感謝。我現在真的在哭。我花了2晚,試圖解決這個問題!非常感謝!如果對你來說不難,你能否簡單地解釋一下SwindUtilities.invokeLater(new Runnable())是什麼?謝謝 – user2350122

+0

好的問題是。你必須有不同的線程。一個控制你的Socket網絡應用程序和Swing Thread的線程。如果你想從SwingThread的外部影響任何類型的Swing UI,它必須被放入到Swing(AWT-EventQueue)中,以便以正確的方式顯示它,這是通過invokeLater方法完成的。通過的線程已正確插入到AWT-EventQueue中並由Swing API以正確的方式執行 – Diversity