Imprimir dado no JtextField

3 respostas
jframejava
W

Buenas, estou com um problema que não estou conseguindo resolver.
Tenho um Frame1 (Modulado pelo Netbeans) que recebe o dado em uma String de outro Frame2.
O Frame 1 recebe perfeitamente esse dado e armazena nessa String ‘nome’ que ao usar o System.out.println(nome) imprime corretamente, mas não imprime no JtextField. Segue o codigo.

public void enviar (Frame2 recebeDado, String nome ){  //Codigo Frame 1
        JtextField1.setText(nome); //Nao imprime o dado no JtextField informado
        System.out.println(nome); //Imprime corretamente o dado que veio do Frame2
}

Algo esta errado?

3 Respostas

L
JtextField1.setText(nome)

Esse trecho de código está sendo executado na Event Dispatching Thread?

W

Desculpe minha ignorância. 'Event Dispatching Thread’
Esta sendo executado logo apos

public Frame1() {

initComponents();

}

public void enviar (Frame2 recebeDado, String nome ){ //Codigo Frame 1
JtextField1.setText(nome); //Nao imprime o dado no JtextField informado
System.out.println(nome); //Imprime corretamente o dado que veio do Frame2
}

L

Então,

Quando estamos lidando com Swing, existe uma thread muito importante: A chamada AWT Event Dispatching Thread (ou EDT). É na EDT que ocorrem eventos do Swing (como o fechar de uma janela, um clique de botão, etc), por exemplo. O ponto mais importante a saber sobre ela é, por uma série de razões: qualquer alteração na interface de usuário deve ser feita na EDT.

Quando você quer alterar a UI (isso inclui setar uma String em um JTextField), essa operação deve ser executada na EDT.

No teu caso, você mostrou que a String é impressa no terminal, mas não aparece na interface de usuário. Meu primeiro instinto é dizer que o trecho de código JTextField1.setText(nome) não está sendo executado na EDT, mas em alguma outra thread.

Pode ser que o problema não tenha nada a ver com isso, mas é um ponto a se verificar, já que aparentemente não há nenhuma exception acontecendo.

A consequência de fazer mudanças na UI fora da EDT é justamente essa, as mudanças não acontecem (ou demoram à acontecer). Você está lidando com algum tipo de multi-threading (ex: Fazendo requisições assíncronas, cirando threads explicitamente, etc)?

Uma forma de verificar isso, é colocar um breakpoint naquela linha e executar o debugger. Na hora que a execução parar naquele breakpoint, procure na IDE a informação sobre a thread onde aqwuela instrução está sendo executada.

De qualquer forma, para executar uma instrução na EDT, faz assim (Java 8):

SwingUtilities.invokeLater(() -> JTextField.setText(nome));

Se estiver utilizando uma versão anterior ao Java 8, ao invés da closure, você vai precisar utilizar uma classe anônima ou algo do gênero.

Talvez exista algum erro de digitação nessa linha de código, to no celular. Amanhã quando eu acordar eu testo, se você ainda não tiver testado.

Criado 13 de fevereiro de 2017
Ultima resposta 14 de fev. de 2017
Respostas 3
Participantes 2