Alterar texto do jButton

9 respostas
N

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");
}

9 Respostas

Henrique.tenorio

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+

N

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.

kenneth

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!

kbardock15

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 )

ViniGodoy

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

N

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.

ViniGodoy

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.

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().

N

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:
...//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());
No meu código:
//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

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

N

alguma sugestão?

Criado 22 de setembro de 2010
Ultima resposta 24 de set. de 2010
Respostas 9
Participantes 5