我的 Reader 类用于在服务器发送消息时显示服务器消息。此代码在直接打印到命令行时完美运行,我收到服务器发送的任何消息。但是,JTextArea 仅显示每隔一行左右。我不确定在这里做什么。我读了一些关于 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 条消息,它会跳过第一个得到第二个等等。谢谢您的帮助!