2012-06-03 11 views
4

客戶端有gui和額外的線程(用於處理套接字輸入並將其輸出以傳遞PrintStream類型的對象)。 gui形式有new javax.swing.JTextArea()。我需要傳遞給對象PrintStream以寫入:ClientThreadIn(PrintStream inOutput){...}。如何創建/綁定gui JTextArea接受數據表ClientThreadIn使用PrintStream如何將swing.JTextArea綁定到PrintStream以接受數據


客戶:

in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
    out = new PrintWriter(new OutputStreamWriter(s.getOutputStream())); 
ClientThreadIn threadIn = new ClientThreadIn(in, System.out); // client passes it's System.out to thread for writing 

所以JTextArea中應該是相似的安慰。它應該能夠接受來自線程的數據(實際上線程寫入到gui的PrintStream)... 是否有類似於JTextArea.getInputStream()?

回答

10

一種方法是創建一個將JTextArea鏈接到OutputStream(稱爲TextAreaOutputStream)並使其擴展OutputStream的類。爲它提供一個StringBuilder對象來保存它正在構建的字符串,併爲其指定要向其寫入文本的JTextArea。然後,當遇到新行字符時,將字符串寫入JTextArea,但一定要在Swing事件線程或EDT上執行此操作

例如:

import java.io.IOException; 
import java.io.OutputStream; 

import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

public class TextAreaOutputStream extends OutputStream { 

    private final JTextArea textArea; 
    private final StringBuilder sb = new StringBuilder(); 
    private String title; 

    public TextAreaOutputStream(final JTextArea textArea, String title) { 
     this.textArea = textArea; 
     this.title = title; 
     sb.append(title + "> "); 
    } 

    @Override 
    public void flush() { 
    } 

    @Override 
    public void close() { 
    } 

    @Override 
    public void write(int b) throws IOException { 

     if (b == '\r') 
     return; 

     if (b == '\n') { 
     final String text = sb.toString() + "\n"; 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       textArea.append(text); 
      } 
     }); 
     sb.setLength(0); 
     sb.append(title + "> "); 

     return; 
     } 

     sb.append((char) b); 
    } 
} 

然後,它是平凡的PrintStream對象來包裝這一點,並使用它你的插座。

+0

什麼是*字符串標題*用於? –

+1

@RCola:這沒有必要。這只是我在我的一個程序中使用的代碼,其中有一個JTextArea從幾個套接字接收字符串,並且我必須在JTextArea中指示字符串的來源。例如,我有一個輸出流和一個錯誤流來顯示。 –

相關問題