Thread + imprimir mensagem

Boa tarde!

Eu tenho uma Thread, como faço para poder jogar uma mensagem para um jTextField enquanto a thread estiver rodando?

Use o comando:

EventQueue.invokeLater(new Runnable() { public void run() { seuTextField.setText(valor); } });

Mas claro, seu problema talvez seja como obter a variável seuTextField. Nesse caso, passe o JTextField como parâmetro para a classe da thread. Outra opção é fazer a thread disparar um evento.

È gambiarra se eu declarar um jTextField estático da página principal para receber as informações da Thread, neste caso é a página principal que invoca a Thread, mas a Thread é um arquivo separado da página prncipal…

O que eu fiz funcionou, apenas gosatria de saber se isso é gambiarra?

[quote=ricardoluizv]È gambiarra se eu declarar um jTextField estático da página principal para receber as informações da Thread, neste caso é a página principal que invoca a Thread, mas a Thread é um arquivo separado da página prncipal…

O que eu fiz funcionou, apenas gosatria de saber se isso é gambiarra?[/quote]

Totalmente gambiarra.

Primeiro, porque você não vai chamar o invokeLater nele, e campos tem que ser atualizados pela Thread do Swing. Depois, você não vai conseguir abrir duas instâncias dessa tela. Além disso, a tela não será coletada pelo garbage collection e você terá problemas de sincronização. Além disso, qual é o problema de passar o JTextField como parâmetro?

Essa Thread possui uma hirearquias de funções se eu passar o jTextBox como parâmetro vou ter um problema de complexidade no código e vou perder o total controle de envio no extato momento que a ação está funcionando para o jTextBox, e porque invocar o invokeLater? E porque não pode ser dessa forma se o jTextBox sempre deverá ficar declarado para qualquer situação?

Em termos de perda de controle, o static é mais problemático. Como ele é como se fosse uma variável global, você pode ter problemas sérios ao utiliza-lo. Lembre-se que static será compartilhado entre todas as classes que resolverem ler ou ouvir a variável, e isso é especialmente pior quando vc tem um contexto multi-thread.

O invokeLater é necessário porque somente a Thread do Swing pode atualizar o Swing:
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html

http://download.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

Entendi…

Digamos que eu chame a Thread na minha tela principal e passe por parâmetro o jTextField, ok! Eu posso chamar uma Thread chamada imprimeStatus e passar como parâmetro o esse jTextField que passei, e toda vez que eu precisar imprimir uma mensagem eu chamo um método estático dentro desta thread imprimeStauts que se encarrega de fazer o invokerLater…

obs: Neste caso as Thread’s segue um padrão hireárquico…

Isso eu poderia fazer?

Primeiro de tudo, se você vai trabalhar com multithreading, risque do seu vocabulário a palavra static. Nada de métodos estáticos, variáveis estáticas, etc. O máximo que vc vai usar são constantes estáticas e, ainda assim, só de objetos imutáveis.

O que você quer dizer com “as threads seguem um padrão hierarquico”? Quantas threads vc tem afinal, e para que elas servem?

Geralmente, se você tiver várias threads, o ideal é ter outra só para imprimir o status. No caso, pode ser a própria thread do Swing já que o método invokeLater atua como uma fila de mensagens.

Entendi… muito obrigado pela ajuda!

Ola a todos, estou criando uma aplicação, e presciso que essa aplicação envie uma mensagem a todos os usuários, que estiverem completando ano de vida na data em questão, exemplo da mensagem: um JFrame com JTextArea contendo a mensagem :!:

Grave a mensagem no banco de dados… quando fizer a consulta para mostrar a mensagem na tela filtra pela data no SQL… A data que você passará será data de aniversário que o usuário tem no cadastro.

Se for mensagem via e-mail, é só fazer uma conslta e listar todos os usuários que fazem aniversário nesta data, faz um loop e envia a mensagem para esses usuários

Espero ter ajudado!

Será q vc poderia manda um exemplo em código??? :?:

  1. Diga exatamente onde está sua dúvida. Você sabe usar banco de dados? Sabe comparar datas? Que tal criar seu próprio tópico para a dúvida?

  2. Não pegue carona no tópico dos outros. Como esse tópico era sobre Threads (um assunto bastante difícil), poucos o visitarão e vc mesmo sairá prejudicado;

  3. O autor desse tópico, e todos que participaram dele, ficarão recebendo e-mails quando vc tratar seu novo assunto, que pode não ser do interesse deles.

É que eu sou novo no forúm e não sei bem com tratar esse assunto!!! :-o