简体   繁体   中英

Swing GUI doesn't show when using thread

I'm programming an IRC client for fun, and this is the basic outline of the program threads:

  • Main Swing thread
  • Thread for output from server
  • (Not done) Thread for input from server

The problem is, when I start the thread using Thread.start(), it doesn't show my swing gui. I still see the debug messages, but no components on the JFrame. If it helps, here's my code for the thread (I'm using the O'Reilly java hack code:

try{
        // Connect directly to the IRC server.
        Socket socket = new Socket(server, 6667);
        final BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(socket.getOutputStream( )));
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(socket.getInputStream( )));

        //pause for a second so that the gui can do its thing
        this.sleep(500);

        // Log on to the server.
        writer.write("NICK " + nick + "\r\n");
        writer.write("USER " + login + " 8 * : IRC Custom Client-" + "\r\n");
        writer.flush( );

        System.out.println("hi this is to verify bla.");

        appendTo.append("Sent login request.");

        // Read lines from the server until it tells us we have connected.
        String line = null;
        while ((line = reader.readLine( )) != null) {
            appendTo.append(line);
            if (line.indexOf("004") >= 0) {
                appendTo.append("You are now logged in!");
            }
            else if (line.indexOf("433") >= 0) {
                appendTo.append("Nickname is already in use.");
                return;
            }
            else if (line.contains("PING")) {
                // We must respond to PINGs to avoid being disconnected.
                writer.write("PONG " + line.substring(5) + "\r\n");
                writer.write("PRIVMSG " + channel + " : Pinged!!\r\n");
                writer.flush( );
            }
            //after we read the line, sleep.
            sleep(10);
        }

        // Join the channel. 
        writer.write("JOIN " + channel + "\r\n");
        writer.flush( );


        // Keep reading lines from the server.
        while ((line = reader.readLine( )) != null) {
            appendTo.append(line);
            if (line.contains("PING")) {
                // We must respond to PINGs to avoid being disconnected.
                writer.write("PONG " + line.substring(5) + "\r\n");
                writer.write("PRIVMSG " + channel + " :I got pinged!\r\n");
                writer.flush( );
            }
            else {
                // Print the raw line received by the bot.
                appendTo.append(line);
            }
            sleep(10);
        }

        socket.close();
        writer.close();
        reader.close();
    }
    catch (Exception e){

    }

And here's how I start the thread:

new Thread(){

        public void run(){
            try {
                connectToIRC(nickname, login, server, channel);
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }.start();

You should not update your swing UI from threads other then main thread. To update your UI from other threads use SwingWorker class. Check this article.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM