• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

olexmal

Threads e JTextArea

13 mensagens neste tópico

Boa tarde a todos.

Estou fazer um chat com vários clientes e meu problema é o seguinte. Estou a fazer um visual para o cliente que vai ter uma JTextArea onde vão aparecer mensagens dos restantes utilizadores.

Quando o cliente é iniciado é executado o void main() do cliente que se liga ao servidor. Depois disso como class Client é Runnable se transforma em Thread e fica a espera de mensagens do servidor o que o utilizador digita alguma coisa. Quando tento adicionar algum texto ao text area o texto não aparece :wallbash:.

Já fiz vários testes como por exemplo se adicionar x linhas a text area e ver quantas linhas tem a mesma ele diz que tem x linhas, mas eu não as consigo ver.

Alguma sugestão??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não te é mostado qualquer erro?

Como é que estás a adicionar o texto?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não me mostra nada.

Já tentei das duas formas .setText() e .append(). Ele simplesmente não diz nada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esta aqui o codigo:

public Cl() {
        //construct preComponents
        String[] lstUsersItems = {"Item 1", "Item 2", "Item 3"};

        //construct components
        lblMensagens = new JLabel ("Mensagens:");
        txtMensagens = new JTextArea (5, 5);
        txtMensagem = new JTextField (5);
        btnSend = new JButton ("Send");
        lblUsers = new JLabel ("Utilizadores:");
        lstUsers = new JList (lstUsersItems);
        txtServer = new JTextArea (5, 5);
        lblServerMessages = new JLabel ("Server:");

        //set components properties
        txtMensagens.setToolTipText ("Menssagens gerais");
        txtMensagens.disable();
        txtMensagem.setToolTipText ("Digite aqui sua mensagem.");
        btnSend.setToolTipText ("Enviar mensagem.");
        lstUsers.setToolTipText ("Utilizadores on-line");
        txtServer.setToolTipText ("Mensagens de servidor.");

        //adjust size and set layout
        setPreferredSize (new Dimension (692, 509));
        setLayout (null);

        //add components
        add (lblMensagens);
        add (txtMensagens);
        add (txtMensagem);
        add (btnSend);
        add (lblUsers);
        add (lstUsers);
        add (txtServer);
        add (lblServerMessages);

        //set component bounds (only needed by Absolute Positioning)
        lblMensagens.setBounds (5, 5, 100, 25);
        txtMensagens.setBounds (5, 30, 555, 310);
        txtMensagem.setBounds (5, 465, 555, 25);
        btnSend.setBounds (565, 465, 115, 25);
        lblUsers.setBounds (565, 5, 100, 25);
        lstUsers.setBounds (565, 30, 115, 310);
        txtServer.setBounds (5, 370, 675, 75);
        lblServerMessages.setBounds (5, 345, 100, 25);
    }
    
    public void setTxt(String text){
    	this.txtMensagens.append("\n"+text);
    }
    
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo código que mostraste não vejo erros, a não ser que a variável 'text' venha vazia não há motivo para isso não estar a funcionar.

Verifica se a variável contém algum valor, e faz uma sessão de debug para veres se na execução do programa não há nada que esteja a limpar a área de texto.

Já agora, porque é que estás a usar o método 'disable' que já não devias usar e posicionamento absoluto? Ou estou a ler mal o teu código?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O metodo txtMensagens.disable(); faz com que o utilizador não possa alterar a text area. O meu problema é que classe é runnable e a certa altura tenho a seguinte instrução

new Theread(Cliente()).start();

e o metodo run()  da mesma classe é que tem de alterar a text area.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sei o que o método faz, mas esse método está marcado para remoção, pelo que não o deves usar, deverias estar a usar a alternativa.

O facto de ser um thread a alterar o texto não parece ser um problema, embora eu implemente esse tipo de situções recorrendo a listeners, mas por isso é que perguntei se te estava a dar algum erro, uma vez que threads externas ao swing não devem modificar componentes swing.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim. Uso setEditable(false), porque o objectivo era que o utilizador não pudesse editar a text area.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Serve, se bem que o método que veio substituir o disable é o setEnable(), mas essa faz mais sentido.

Já agora, podes indicar qual era o erro?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como foi escrito nos posts anteriores o visual foi escrito no contrutor da propria classe client que era runnable. A classe criava o JFrame e adicionava a propria classe. Depois como a classe era runnable tenha seguinte instrução new Theread(Cliente()).start();

Para resolver o erro separei a classe em duas, uma continha o visual e outra é a Thread que recebe as mensagens do servidor e escreve as na tal JTextArea.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Essa é toda uma situação muito estranha, não estou a ver nada de especial no cenário que mostraste que possa impedir o sistema de funcionar correctamente. Enfim, o problema está resolvido e isso é que é importante :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora