Java 如何获取当前正在运行的类作为对象?
我有一个名为Java 如何获取当前正在运行的类作为对象?,java,swing,netbeans,Java,Swing,Netbeans,我有一个名为Server的JFrame,它托管一个socket服务器,其中有一个TextArea作为控制台。每个连接的客户端都会创建一个名为clientThread的新线程 我的问题是:clientThread如何将字符串附加到服务器中的TextArea。我想通过running类作为一个参数,但我不知道怎么做。有什么想法吗 客户端线程: public class ClientThread extends Thread{ Socket clientSocket; int Clien
Server
的JFrame
,它托管一个socket服务器,其中有一个TextArea
作为控制台。每个连接的客户端都会创建一个名为clientThread
的新线程
我的问题是:clientThread如何将字符串附加到服务器中的TextArea。我想通过running类作为一个参数,但我不知道怎么做。有什么想法吗
客户端线程:
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()));
}
服务器:
public class Server extends javax.swing.JFrame {
/**
* Creates new form Server
*/
public Server() {
initComponents();
}
static public void writeToConsole(String s) {
jTextArea1.append(s);
}
public static void main(String args[]) {
try {
ServerSocket servSocket = new ServerSocket(8008);
writeToConsole("Server Started\n");
int clientID = 1;
while (true) {
Socket clientSocket = servSocket.accept();
//Pass this class to the ClientThread As object??
ClientThread clientThread = new ClientThread(clientSocket, clientID++, (theObjectOfThisClass))
);
clientThread.start();
}
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Server().setVisible(true);
}
});
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
编辑:固定客户端线程构造函数您可以将
服务器
作为参数添加到客户端线程
构造函数:
public ClientThread(Socket s,int id,ServerConsole obj, Server server)
但是,从另一个线程修改GUI时要小心。您需要创建一个Runnable
,以便在主UI线程上运行。您可以使用runAndWait()
或runLater()
正如您所知,main()
是静态的,因此没有this
引用。相反,您已经在稍后的main()
中使用newserver()
创建了一个Server
实例。您需要更快地创建这个对象,并存储对它的引用,以便您可以在任何需要的地方使用它
编辑:
我的想法是这样的:
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);
}
});
}
请注意,由于您只需要一个窗口,因此只能执行一次
newserver()。您必须在使用变量之前进行初始化,否则引用将为null
,这将导致更多问题。好的,我设法解决了这个问题。对于任何有相同问题的人,这里是如何解决的:
为当前类创建局部变量:
static Server svr;
在类构造函数中(将服务器对象传递给自身)
调用GUI调用时,发送所创建变量的本地obj:
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Server(svr).setVisible(true);
}
});
感谢代码学徒的创意。是的。那部分我知道。我想知道在这里做什么?ClientThread ClientThread=新的ClientThread(clientSocket,clientID++,(对象类))@RenierSwart您需要对服务器对象的引用。最简单的方法是在循环之前创建它,然后稍后重用相同的实例来调用setVisible(true)
。但是,我认为您会遇到其他问题,因为while
循环是无限的。这可能会起作用,我会尝试一下,然后让您知道。您是否正在查找this
?@chrylis Ah是的,这个关键字可以工作,但是类是非静态的,并且语句在main方法中。有什么想法吗?我不知道你是如何创建线程的。这是在无限循环中发生的,因此即使您知道如何将JFrame
的实例发送到每个线程,您也永远不会显示窗口。因此,为了澄清一下,这些ClientThread
的目的是什么?它们将如何在您正在构建的系统的其余部分中使用?更重要的是,为什么您需要无限多的线程?将服务器传递给服务器构造函数的目的是什么?你有多个窗口吗?为什么变量是静态的?将服务器传递给服务器构造函数的目的是允许将当前正在运行的类发送到ClientThread,这不会创建多个服务器窗口,它是静态的,因为服务器是在公共静态void main中创建的。它允许ClientThread接收从客户端发送的数据,并显示在服务器的文本区域中。服务器类已具有此引用,因此您无需向构造函数发送另一个引用。此外,静态与o对象的创建位置无关。它更多的是关于如何访问它。您是否仍在main()中创建ClientThreads,或者您是否更改了它。如果您没有更改它,那么将服务器传递给服务器构造函数将毫无帮助。
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Server(svr).setVisible(true);
}
});