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.
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.
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.
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?
[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”;
}
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?