4

クライアントにはGUIと追加のスレッドがあります(ソケット入力を処理し、PrintStreamタイプのパスオブジェクトに出力するため)。GUIフォームにはnew javax.swing.JTextArea()PrintStream書き込むオブジェクトをスレッド化するために渡す必要があります: ClientThreadIn(PrintStream inOutput){...}ClientThreadInを使用してデータフォームを受け入れるためにGUIJTextAreaを作成/バインドする方法は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()に似たものはありますか?

4

1 に答える 1

10

1つの方法は、JTextAreaをOutputStreamにリンクするクラス(TextAreaOutputStreamなど)を作成し、OutputStreamを拡張することです。オーバーライドで構築している文字列を保持するStringBuilderオブジェクトを指定し、write(int b)テキストを書き込む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オブジェクトでラップし、ソケットで使用するのは簡単です。

于 2012-06-03T19:27:04.303 に答える