如何将当前正在运行的类作为对象?

时间:2016-09-16 20:47:35

标签: java swing netbeans

我有一个名为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构造函数

2 个答案:

答案 0 :(得分:1)

您可以将chown作为参数添加到Server构造函数中:

ClientThread

但是,从另一个线程修改GUI时要小心。您需要创建public ClientThread(Socket s,int id,ServerConsole obj, Server server) 以使用SwingUtilities在主UI线程上运行。您可以使用RunnablerunAndWait()

如您所知,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);
                }
            });

感谢代码学徒的想法。