Erro ao Chamar Frame [RESOLVIDO]

7 respostas
pedroroxd

Pessoal, tenho um Client e um Server, de tipo um msn..

Client:
public class Client extends JFrame {
    
////////////////////////////////////////////////////////////////////////////
private static Client instance = new Client("127.0.0.1");
////////////////////////////////////////////////////////////////////////////


    public JTextField enterField;
    public JTextArea displayArea;
    public ObjectOutputStream output;
    public ObjectInputStream input;
    public String message = "";
    public String chatServer;
    public Socket client;

    //inicializa chatServer e configura a GUI
        private Client(String host) { ///////////////////////aki vai pra public
            super("Cliente (ENVIA MENSAGEM)");

            chatServer = host;
            enterField = new JTextField();
            enterField.setEditable(false);

       
            enterField.addActionListener(
                        new ActionListener() {

                             //envia a mensagem ao servidor
                             public void actionPerformed (ActionEvent event)
                             {
                                sendData(event.getActionCommand());
                                enterField.setText("");
                             }
                         }
                    );

                    add(enterField, BorderLayout.NORTH);

                    displayArea = new JTextArea();
                    add(new JScrollPane(displayArea), BorderLayout.CENTER);

                    setSize(300,150);
                    setVisible(true);
        }

        /////////////////////////////////////////////////////////
        public static Client getInstance() {
          //  instance.runClient();
         return instance;
      }
/////////////////////////////////////////////////////////
        //conecta-se ao servidor e processa as mensagens a partir do servidor
        public  void runClient()
        {
            try //conecta-se ao servidor,obtém fluxos, processa a conexão
            {
     
                connectToServer();
                getStreams();
                processConnection();
            }

                catch (EOFException eofException)
                {
                    displayMessage("\nConexão Terminada");
                }

            catch(IOException ioException) {
                ioException.printStackTrace();
            }

            finally
            {
                    closeConnection();
            }
            }

        //conecta-se ao servidor
            public void connectToServer() throws IOException {
                displayMessage("Conectando\n");

                client = new Socket(InetAddress.getByName(chatServer), 12345);

                displayMessage("\Conectado a: " + client.getInetAddress().getHostName());
            }

            //obtém fluxos para enviar e receber dados
                public void getStreams() throws IOException
                {
                    output = new ObjectOutputStream(client.getOutputStream());
                    output.flush();

                    input = new ObjectInputStream(client.getInputStream());
                }

                //processa a conexão com o servidor
                    public void processConnection() throws IOException {
                        setTextFieldEditable(true);

                        do //processa as mensagens enviadas do servidor
                        {
                            try //le e exibe a mensagem
                            {
                                message = (String) input.readObject();
                                displayMessage("\n+ message");
                            }

                            catch (ClassNotFoundException classNotFoundException)
                            {
                                displayMessage("\nUnknown objetct type received");
                            }
                        } while (!message.equals("SERVER>>> TERMINATE"));
                    }

                    //fecha os fluxos e o socket
                        public void closeConnection() {
                            displayMessage("\nClosing connection");
                            setTextFieldEditable(false);

                            try {
                                output.close();
                                input.close();
                                client.close();
                            }
                            catch (IOException ioException) {
                                ioException.printStackTrace();
                            }
                        }

                        //envia mensagem ao servidor
                            public void sendData(String message) {

                                try //envia o objeto ao servidor
                                {
                                    output.writeObject("MESA 01 >>" +message);
                                    output.flush();
                                    displayMessage("MESA 01 >>" +message);
                           
                                }

                                catch (IOException ioException) {
                                    displayArea.append("\nError writing object");
                                }
                            }

                            //manipula a displayArea na thread de despacho de eventos
                                public void displayMessage(final String messageToDisplay) {
                                    SwingUtilities.invokeLater(

                                            new Runnable() {
                                                public void run()
                                                {
                                                    displayArea.append(messageToDisplay);
                                                    }
                                    }
                                            );
                                }


                                //manipula o enterField na thread de despacho de eventos
                                    public void setTextFieldEditable(final boolean editable)
                                    {
                                        SwingUtilities.invokeLater(
                                                new Runnable() {
                                                public void run()
                                                {
                                                    enterField.setEditable(editable);
                                                }
                                        }
                                                );

                                    }

/////////////////////////////////////////////////////////////////// /*
    public static void main (String args[]) {
       getInstance().runClient();
        }
    
///////////////////////////////////////////////////////////////////

}
Ele roda certinho... Agora eu quero chamar o Client quando eu clicar num botão de outro frame.. Coloquei isso:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            Client.getInstance().runClient();   
    }
Mas não dá certo... Algo me diz que é porque o client é frame também... não sei... O que posso fazer?

7 Respostas

ViniGodoy

Na verdade, é porque você está usando o padrão Singleton. Então, todo “instance” que você retorna no getInstance() refere-se ao mesmo client.

pedroroxd

Eu tentei colocar o client public, e tirar o getInstance()…
Ae no client eu colokei isso no main:

public static void main (String args[]) { Client k = new Client("127.0.0.1"); k.runClient(); }
E em vez de mandar o runclient no botão, chamei o main…
Mas dá na mesma, roda o client, mas fica “transparente” (tipo quando uma janela fica não respondendo), e não aparece as coisas que tem dentro…
O chato é que quando mando rodar o Client da certo, não dá é pra chamar ele no botão…

pedroroxd

Ahhhh…
Muito estranho isso
;X

Alguém que saca isso, se quiser o código adiciona eu no msn que eu passo o projeto pra vocês verem se acham o erro…
[email removido]

Desde já agradeço…

pedroroxd

O estranho, é que quando eu mando rodar o Client, ele roda certinho… E o main dele é isso:

public static void main (String args[]) { getInstance().runClient(); }

Agora quando eu vou rodar pelo clique de um botão:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { Client.getInstance().runClient(); }

Não dá certo…
Já tentei de tudo…

pedroroxd

Deletei o programa e fiz outro.
Portanto… [RESOLVIDO]

ViniGodoy

hehehehe… desculpe não ter respondido, mas esse programa aí tava meio bagunçado mesmo. Eu quase te sugeri isso. :slight_smile:

Mas é assim que aprende. :wink:

pedroroxd

Hehe…
Só para constar: eu utilizei o programa que você postou em outro tópico, quando alguém tava com a mesma dúvida que eu… rs
Mas vlw ae… Agora ta funcionando :smiley:

Criado 16 de setembro de 2009
Ultima resposta 26 de set. de 2009
Respostas 7
Participantes 2