Estou com esse problema tb, acho que é necessário o uso de multiplas Threads! Alguém sabe como faz isso, tipo a cada linha que andar no evento executar imediatamente? :?
a ideia das threads eh interessante…mas acho que a sincronizacao delas poderia gerar inconsistencia em alguns casos…
qdo mais precisamente vc precisa alterar o conteudo da jTextArea???
nao poderia fazer por um metodo generico para atualizacao???
eu tenho um simulador que eu atualizo diversos campos na tela em tempo real…dai fiz um metodo tipo o repaint (da applet)…que pode reexibir apenas um campo atualizado…ou varrer os outros para saber se possui modificacoes…
nao sei se encaixa na sua necessidade…mas qquer coisa fala mais sobre oq vc precisa que mando novas ideias!!
Normalmente os objetos visuais sofrem acões de threads não previstas pelo programador para causar o refresh, ou seja, as vezes simplesmente não precisa fazer nada. Resumindo…depende da situação em que vc se encontra.
Se o seu código não for muito grande, coloque em um post para podermos ajuda-lo melhor.
Para adicionar este jar a seu projeto faca o seguinte
No netbeans navegue em>> ferramentas>>paleta>>Componentes swing/awt
Na janela que ira abrir va em>> adicionar do jar
Agora nesta janela procure pelo arquivo jar TimerBean que voce baixou e seleciona ele>>depois de next>selecione timer e de next>>selecione beans e depois concluir…
Assim eh so adicionar o componente Timer do bean e adicionar ele em seu projeto
Peço desculpa mas o meu código é um bocado grande, mas vou vos dar um exemplo:
[code]private void txtDateFocusLost(java.awt.event.FocusEvent evt) {
//Configuração das mensagens na Consola
JTextArea output = getTxtConsole(); //output.setText("");
output.getText();
// Now create a new TextAreaOutputStream to write to our JTextArea control and wrap a
// PrintStream around it to support the println/printf methods.
PrintStream out = new PrintStream( new TextAreaOutputStream( output ) );
// redirect standard output stream to the TextAreaOutputStream
System.setOut( out );
// redirect standard error stream to the TextAreaOutputStream
System.setErr( out );
String data = this.txtDate.getText();
DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
//Validar o Campo Data
if(data.equals("")){
//Apresenta mensagem de erro na Consola
System.out.println("Defina uma data");
//E não deixa carregar no botão de ok
this.bttOk.setEnabled(false);
}else{
try {
if(data.length() != 8){
throw new ParseException("", 0);
}
Date date = (Date) formatter.parse(data);
System.out.println("date - "+date);
this.bttOk.setEnabled(true);
} catch (ParseException ex) {
System.out.println("Data incorrecta");
this.bttOk.setEnabled(false);
return;
}
}
} [/code]
O meu problema é que só no final de correr a função é que aparecem as mensagens.
O que eu queria era ao logo da função quando aparece-se um System.out.println() apresenta-se logo na JTextArea.
La vai como vc pode fazer para resolver a sua duvida…
Depois de fazer o que eu te disse
adiciona o componente bean no projeto…
configure o delay dele na janela de propriedades, o delay é o tempo em milisegundo. la vai estar 1000 ou seja a cada segundo ele fara algo…
depois adicione o evento OnTime[Timer1OnTime]
O que colocar neste evento(que no momento metodo) sera o que ele fara a cada tempo
E declare o metodo Timer1.start() no metodo da classe
exemplo do evento:
public minhaClasse(){
//declaracoes de init componentes e outros metodos
//E a declaracao do metodo Timer.start():
Timer.start():
}
private void Timer1OnTime(algo que nao me lembro){
//aqui dentro vai oque ele vai fazer a cada segundo,se delay for 1000
//por exemplo
system.out.println("Ola sou o segundo");//vai aparecer esta mensagen a cada segundo
}
As mensagens não aparecem de imediato porque a thread da “função” é prioritária; por isso que elas só aparecem quando a “função” termina, a outra thread (a que faz o refresh) processa logo em seguida.
Tem muito código dentro do seu método.
Talvez para resolver isto você tenha que colocar o TextArea em uma outra thread ou simplesmente desacoplar esta parte do código do código do método.
Faça um teste sem utilizar o invokeLater para ver o que acontece.
Se não me falha a memória o invokeLater coloca sua thread em uma especie de fila de execução, ou seja, será executado tardiamente (later). Sem o invokeLater a VM tera que compartilhar o tempo de execução no mesmo momento.
Se o código que coloque no post como exemplo estiver executando conforme o esperado, siguinifica que o problema pode estar em outro lugar do seu código.
Se isto se confirmar será dificil lhe ajudar sem o ver o teu código completo.
Você consegue isolar o problema em algumas classes pequenas que possam ser executadas para que a gente possa analisar?