我有一个名为JFrame
的{{1}},它托管一个带Server
的套接字服务器作为控制台。每个连接的客户端都会创建一个名为TextArea
的新线程。
我的问题是:clientThread如何将字符串附加到Server中的TextArea。我想将运行类作为参数传递,但我不知道该怎么做。任何想法?
客户线程:
clientThread
服务器:
public class ClientThread extends Thread{
Socket clientSocket;
int ClientID = -1;
boolean running = true;
BufferedReader in;
PrintWriter out;
Server console;
public ClientThread(Socket s,int id,Server obj) throws IOException{
clientSocket=s;
ClientID=id;
console=obj;
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out = new PrintWriter (new OutputStreamWriter(clientSocket.getOutputStream()));
}
编辑:修复了ClientThread构造函数
答案 0 :(得分:1)
您可以将chown
作为参数添加到Server
构造函数中:
ClientThread
但是,从另一个线程修改GUI时要小心。您需要创建public ClientThread(Socket s,int id,ServerConsole obj, Server server)
以使用SwingUtilities
在主UI线程上运行。您可以使用Runnable
或runAndWait()
。
如您所知,runLater()
是静态的,因此没有main()
引用。相反,您已在this
中稍后使用Server
创建new Server()
个实例。您需要尽快创建此对象并存储对它的引用,以便您可以在任何需要的地方使用它。
修改强>
我的想法是这样的:
main()
请注意,由于您只需要一个窗口,因此您应该只执行public static void main(String args[]) {
Server server = new Server();
ClientThread clientThread = new ClientThread(clientSocket, clientID++, server);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
server.setVisible(true);
}
});
}
一次。你必须这样做才能在使用之前初始化变量,否则引用将是new Server()
,这将导致更多的问题。
答案 1 :(得分:-1)
好的,我设法解决了这个问题。对于任何有相同问题的人,这里是如何解决它:
为当前类创建一个局部变量:
static Server svr;
在类构造函数中(将Server obj传递给自身)
public Server(Server server) {
initComponents();
svr=server;
}
调用GUI调用时,发送您创建的变量的本地obj:
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Server(svr).setVisible(true);
}
});
感谢代码学徒的想法。