JOptionpane não exibe mensagem após conexão do servidor e cliente por socket

Olá,
é meu primeiro post no forum, mas aqui deixo uma duvida que não consigo resolver:
Fiz um programa e este funciona perfeitamente com exceção do JOptionpane. Meu programa funciona como um Skype usando a API Gstreamer para linux, mas entre dois computadores apenas. Todo processo funciona bem quando uso System.out.print() mas se eu tentar um JOptionpane, o box aparece assim como seu titulo, mas nenhuma mensagem ou botao aparece. Alem disso, metodos estanciados tbm não funcionam e acaba deixando meu programa funcional mas não como eu queria.

Abaixo, parte do codigo que tenho tido este problema:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
import org.gstreamer.State;

public class Interacao {

    //Sockets
    ServerSocket serverSocket;
    Socket conexaoChamada;
    int recebendoChamada = 0;
    int resposta = 1;
    static Execucao_GStreamer criar = new Execucao_GStreamer();

    
    
    public void Iniciar() throws IOException  {
        
                            

            serverSocket = new ServerSocket(5002);

            while (recebendoChamada < 6) {
               
                
                System.out.println("Servidor Esperando Conexão...");
                Socket novaConexao = serverSocket.accept();

                System.out.println("Conexão Estabelecida!");

                // Após receber uma solicitação, criar streams de entrada e saída de dados.
                DataInputStream stream_entrada = new DataInputStream(novaConexao.getInputStream());
                DataOutputStream stream_saida = new DataOutputStream(novaConexao.getOutputStream());

                //receber dados pela nova conexao
                recebendoChamada = stream_entrada.readInt();
                System.out.println("Valor recebido pelo Server: " + recebendoChamada);

                if (recebendoChamada == 1) {
                    
                    System.out.println("Aceitar ou Rejeitar chamada?");
                     criar.Rodar();                    // nao funciona aqui e JOptionPane também nao
                    
                   
                    stream_saida.writeInt(recebendoChamada += 1);
                    
                    
                    
                    System.out.println("Valor Enviado Server dever ser dois e o enviando foi:" + recebendoChamada);
                    //}
                    
                }

                if (recebendoChamada == 3) {

                    System.out.println("Inicializando Pipies do Servidor!");
                    Execucao_GStreamer.pipeCVideo.setState(State.PLAYING);
                    Execucao_GStreamer.pipeCVoz.setState(State.PLAYING);
                    Execucao_GStreamer.pipeSVideo.setState(State.PLAYING);
                    Execucao_GStreamer.pipeSVoz.setState(State.PLAYING);
                   
                    //DoisEmUm.frame.setVisible(true);
                    System.out.println("SERVER ENVIANDO VALOR 4");
                    stream_saida.writeInt(recebendoChamada += 1);

                    
                }

                //System.out.println("Fechando entradas e saidas SERVIDOR...");
                stream_entrada.close();
                stream_saida.close();
                novaConexao.close();

                if (recebendoChamada == 5) {

                    System.out.println("Fechando Sockets SERVIDOR...");
                    //serverSocket.close(); 
                    recebendoChamada = 0;

                }
            }
        


    }
}

JOptionpane ou qualquer metodo de qualquer outra classe não funcionam corretamente a partir de

Socket novaConexao = serverSocket.accept();

qualquer linha acima, tudo funciona corretamente.

Alguem saberia ou teria uma ideia do porque? lembrando que o box do JOptionpane quando chamo aparece, mas a mensagem ou opçoes nao.

Obrigado desde já.

ServerSocket.accept() é um método bloqueante, ou seja, travará a thread em que for executado até que uma conexão seja realizada.

Para que seu programa possa fazer outras coisas enquanto a conexão não se realiza, execute ServerSocket.accept() numa thread em separado.

Entendo…

mas me veio uma pergunta. Neste meu codigo, após haver a conexão o tal do “Socketserver” que mencionei, ai sim começaria a realizar os metodos e threads que criei. Por exemplo: o server aguarda conexao do cliente, apoś estabelecida será trocado numeros inteiros e para cada um haverá um IF que realizará alguns comandos (ver a linha 42 do codigo). O server liga; o cliente conecta; o server recebe o numero 1 e chama o JOptionPane e o metodo rodar e devolve o numero 2 para o cliente; e assim vai …

Nao entendo como isso afetaria o restante do programa levando em consideração de que a conexão ja foi realizada… como proceder?

Se você quiser dar suporte a apenas um cliente de cada vez, não há o que modificar no seu programa.

Exatamente, um cliente de cada vez, mas gostaria de fazer o metodo criar.Rodar de uma outra classe e o JOptionPane funcionarem dentro do IF da linha 42… o metodo faz tudo, só nao executa a thread dele e o JOptionPane cria uma janela só com titulo e sem mensagem ou opção. Meu grande problema é justamente esses dois. Arrumando isso, tudo estaria perfeito!

Talvez seja questão de você estar usando JOptionPane fora da thread do Swing. Experimente usar JOptionPane na linha 42 da seguinte forma:

SwingUtilities.invokeAndWait(new Runnable() {
  @Override public void run() {
    // Use JOptionPane aqui
  }});

Agradeço a sua atenção.

usando InvokeAndWait nao deu certo, fiz dessa maneira e funcionou, mas trouxe outro probleminha:

[code]if (recebendoChamada == 1) {
SwingUtilities.invokeLater(new Runnable() {

                public void run() {
                    
                    //Chama uma classe qualquer!  
                  resposta =  JOptionPane.showOptionDialog(null,
                            "Aceitar chamada?",
                            "Recebendo chamada... ",
                            JOptionPane.DEFAULT_OPTION,
                            JOptionPane.QUESTION_MESSAGE,
                            null,
                            options,
                            options[0]);
                }
            });
            System.out.println("Aceitar ou Rejeitar chamada?");


            if(resposta == 0){
            stream_saida.writeInt(recebendoChamada += 1);

            criar.Rodar();

            System.out.println("Valor Enviado Server dever ser dois e o enviando foi:" + recebendoChamada);
            }

        }[/code]

o meu novo problema é o

[code] if(resposta == 0){
stream_saida.writeInt(recebendoChamada += 1);

            criar.Rodar();

            System.out.println("Valor Enviado Server dever ser dois e o enviando foi:" + recebendoChamada);
            }

[/code]

que está fora do SwingUtilities. Se eu deixar como está os metodos do if (recebendoChamada ==1) irao funcionar corretamente, mas será enviado o valor que eu quero para o cliente sem antes esperar que eu responda se quero ou nao aceitar a chamada, ou seja, ele passa para as proximos IFs sem antes esperar eu terminar o primeiro que tem o JOptionPane perguntando se quero ou nao aceitar a chamada. Assim, esse botao se torna inutil.

Ai tem outro porem… seu colocar o

stream_saida.writeInt(recebendoChamada += 1);

dentro do SwingUtilities,o netbeans me obriga a seta-lo como final e fazndo isso o restante nao funciona.

Tudo que eu preciso eh que apareça o JOptionPane pergutnando e ao selecionar a opção ele execute os metodos e enviaria um valor inteiro para o cliente. Ideias?

Desde já agradeço.