私の Reader クラスは、サーバーがメッセージを送信するたびにサーバー メッセージを表示するために使用されます。このコードは、コマンドラインに直接出力するときに完全に機能し、サーバーから送信されたメッセージを受信します。ただし、JTextArea は 1 行おきにしか表示されません。ここで何をすべきかわかりません。InvokeLater について何か読んだことがありますが、これを使用するのが正しい状況かどうかはわかりません。
また、接続ボタンをクリックすると、GUI クラスからスレッドが開始されます。
public class Reader implements Runnable {
public static Socket s = null;
public static JTextArea TextArea;
public static BufferedReader reader = null;
/*Takes in a Socket. Sets up a input stream.
*
*/
public Reader(Socket sIn, JTextArea display) {
TextArea=display;
s = sIn;
try {
reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch (IOException ex) {
System.out.println("Error in constructor Reader: " + ex);
}
}
public void checker() {
try {
/*Sits and waits for a Server Response*/
while (!reader.ready()) {}
System.out.println(reader.readLine());
TextArea.append(reader.readLine()+"\n");
} catch (Exception ex) {
System.out.println("checker is crying: " + ex);
}
}
public void run() {
while (true) {
checker();
}
}
}
回答と例をありがとうございます。checker() メソッドに以下を追加しました。
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TextArea.append(reader.readLine() + "\n");
} catch (Exception eee) {
System.out.println("Error" + eee);
}
}
});
同じ問題が存在します (他のすべてのサーバー メッセージのみを受信します) が、他のすべてのメッセージでロックアップします。サーバーが 4 つのメッセージを送信すると、最初のメッセージがスキップされて 2 番目のメッセージが取得されます。ご協力ありがとうございます。