gpt4 book ai didi

java - 从另一个类追加到 JTextArea

转载 作者:行者123 更新时间:2023-11-30 11:38:20 25 4
gpt4 key购买 nike

我的 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 条消息,它会跳过第一条消息,获取第二条消息,依此类推。感谢您的帮助!

最佳答案

您正在从 BufferedReader 读取两次:

        System.out.println(reader.readLine()); // *** here ***
TextArea.append(reader.readLine()+"\n"); // *** and here ***

这就是为什么您只能看到每隔一行的原因。由于您试图在事件线程上调用 readLine(),您的程序可能会卡住 - 不要那样做。

每行只从 BufferedReader 读取一次。我还会更改 while 循环,并在 Runnable 的外部 执行缓冲读取器的读取。

   private String line = ""; // a class field

public void checker() {
try {

while ((line = reader.readLine()) != null) {

System.out.println(line);
SwingUtilities.invokeLater(new Runnable() {
TextArea.append(line + "\n");
});
}

} catch (Exception ex) {
System.out.println("checker is crying: " + ex);
}
}


public void run() {
checker();
}

或者更好——使用 SwingWorker 对象并将行发布/处理到您的 JTextArea。

顺便说一句,您需要了解并让您的代码遵守 Java 命名约定,包括让所有类名都以大写字母开头,所有变量和方法都以小写字母开头。这样做将使其他人能够更轻松、更快速地理解您的代码,并且可能会帮助您在这里更快、更好地获得帮助。

关于java - 从另一个类追加到 JTextArea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13660518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com