Alterar texto do jButton

Olá, estou com uma duvida bem simples e ja desisti de tentar resolve-la por conta propria.

Estou desenvolvendo um programinha para ordenaçao de dados, lidos num txt e passados para vetores

Como vcs devem saber, demora muito tempo para ordenar grandes quantidades de dados, em diferentes metodos de ordenaçao, entao eu gostaria apenas de mostrar para o usuário que o programa nao travou, apenas está ordenando os dados

Por que é que o texto “Ordenando…” não é mostrado no button?
Ele ja vai direto para a execuçao do codigo abaixo, e somente no final o jButton é atualizado e recebe as modificaçoes no texto, porem é imperceptível ao usuario.

Fiz alguns testes e coloquei um Dialog para abrir logo apos o texto do button ser alterado, quando o dialog apareceu, o jbutton foi atualizado e eu pude ver o “Ordenando…”, porem sem essa “parada” no processamento do codigo nao daria para perceber.

private void jButtonExecutarActionPerformed(java.awt.event.ActionEvent evt) { 
     jButtonExecutar.setText("Ordenando...");

     //codigo de ordenaçao

     jButtonExecutar.setText("Executar");
}

Realmente é muito rapido, voçe poderia colocar entao um delay no seu codigo de ordenação so para esperar um poquinho. Entao o usuario poderia ver a mensagem no botao, mas para isso vc vai ter que entender a classe Timer. Pesquisa um pouco a respeito se nao entender nada posto um codigo e explico pra vc, más aconselho voce a pesquisar tambem… T+

Obrigado pela resposta, mas a questao nao é por ser muito rapido e sim por nao acontecer em tempo de execuçao. Resumindo, quando eu seto o texto do jbutton, é aplicado no codigo, mas nao no frame, e só depois que a ordenaçao termina é que o frame é atualizado.

Fala brow,

Quanto a sua duvida, eu nao imagino a causa do problema…

Mas voce nao poderia usar um JProgressBar para demonstrar
que o processo ainda esta em execucao?

Abraco!

Já passei por essa situação… o que acontece que o texto ''Ordenando" só vai mudar após ele ler o arquivo como você mencionou … eu resolvi isso usando uma thread posteriormente coloquei um progress bar como o amigo falo, para isso também precisei de uma thread (Que é uma forma do processo dividir a si mesmo em multiplas tarefas +/- isso )

O seu problema é que os eventos de botão ocorrem na thread do Swing. É a mesma thread que faz a pintura dos componentes. Portanto, até que o código de um botão acabe, nenhum componente será atualizado.

Para resolve-lo, mova o processamento pesado para outra thread. Mais informações:
http://download.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

Na verdade o evento do botão não faz nenhum processamento pesado. Todos os métodos de ordenação e de carregamento dos dados ocorrem em classes específicas, as quais eu acesso via objetos criados no evento do botão. Cada classe trabalha com uma thread própria ou também usa a do swing?

Vou ler os artigos, obrigado pelas respostas.

[quote=nojiruca]Na verdade o evento do botão não faz nenhum processamento pesado. Todos os métodos de ordenação e de carregamento dos dados ocorrem em classes específicas, as quais eu acesso via objetos criados no evento do botão. Cada classe trabalha com uma thread própria ou também usa a do swing?

Vou ler os artigos, obrigado pelas respostas.[/quote]

Thread é thread, classe é classe.

Quando a thread atual chama o método de uma classe, ainda é a thread atual que roda dentro desse método. Portanto, as classes que o seu botão usa fazem processamento pesado, seu botão está fazendo processamento pesado.

Cuidado para não confundir a classe Thread com a thread disparada por ela. A classe Thread é apenas um disparador, e coleta informações da thread que disparou. A thread em si, é a execução do código, que inicia assim que você chama o método start(), a partir da primeira linha do método run().

Ok, dei uma olhada e pelo que entendi preciso criar um thread usando o SwingWorker por exemplo. Mas não consegui implementar o exemplo dado no site da sun.

Exemplo do site:

[code]…//in the main method:
final SwingWorker worker =
new SwingWorker() {
public Object construct() {
return new
expensiveDialogComponent();
}
};
worker.start();

…//in an action event handler:
JOptionPane.showMessageDialog
(f, worker.get());[/code]

No meu código:

[code]
//dentro de public static void main(String args[])
SwingWorker worker = new SwingWorker() {
public Object construct() {
return “teste”;
}

        @Override
        protected Object doInBackground() throws Exception {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    };

worker.start(); //erro cannot find symbol[/code]

O Java não reconheceu o método start(). Além do mais o objeto worker, criado no método main, não está disponível no evento ActionPerformed do meu jButton.

O que fiz de errado? Poderiam me dar outro exemplo?

Obrigado

alguma sugestão?