Problema com Threads (SIMPLES) - Desespero..não funciona!
21 respostas
iwallas
olá pessoal!
Eu estou tentando fazer um slideshow com imagens contidas em uma pasta, mas está dando problema..quando inicio o método, trava toda a aplicação! só pelo taskmanager para fechar=/. Alguém pode me ajudar?
packagelib;importjavax.swing.ImageIcon;importjavax.swing.JLabel;importjava.io.File;publicclassSlideShow{privateJLabellblImg;publicSlideShow(JLabelimg){this.lblImg=img;}publicvoidplay(){Stringdir="C:\app\dist\imgs\"; File diretorio = new File(dir); File imgs[] = diretorio.listFiles(); Thread t = new Thread(); t.start(); int i = 0; double tempo = 0; while (true){ try{ t.sleep(3500); tempo += 3500; if(i>imgs.length-1){ i = 0; } this.lblImg.setIcon(new ImageIcon(dir+imgs[i].getName())); i++; if(tempo >15000) return; }catch(Exception e) {} } }}
Estou chamando assim dentro de um form com um jlabel:
SlideShow slide = new SlideShow(this.lblImgs);
slide.play();
Mas meu, vc já sabe a solução, usa thread, qual a sua dúvida em relação as threads?
iwallas
eu nunca usei threads, dai pesquiseiaqui como fazia… e tentei implementar desse jeito, mas trava a aplicação toda! gostaria de saber pq trava =/
Guilherme_Gomes
Tira esse
Threadt=newThread();t.start();
do seu código e substitua
t.sleep(3500);
por
Thread.sleep(3500);
E veja o que acontece!
iwallas
no começo tinha feito isso! Mas não funciona. Só funciona se executar essaclasse sozinha, neste caso eu estou criando um objeto e executando a partir de um JFrame, trava tudo…
Guilherme_Gomes
Dentro do seu catch, manda imprimir a exception e fala pra gente qual é!
init:
deps-jar:
compile-single:
run-single:
null
null
null
null
Java Result: 1
EXECUTADO COM SUCESSO (tempo total: 43 segundos)
Detalhe: Quando clico no botão ele permanece"clicado"… =/
Guilherme_Gomes
Entendi o que você está fazendo.
Eu não sou bom desenvolvedor de aplicações Desktop, mas pelo que estou vendo do seu projeto tem uma coisa que não está legal!
O botão fica clicado acho que é por que você chama o SlideShow e espera ele retornar, mas ele demora, o que gera o problema.
Tente fazer o botão iniciar uma thread e essa thread é o SlideShow, ou faça o SlideShow iniciar em outra janela (um novo JFrame) e nesse novo JFrame você faz o slide show. Assim a primeira janela pode ficar livre quanto a execução desse slides…
iwallas
puts… eh q esses slides tem que estarna mesma janela =/
ViniGodoy
O trecho de código que vai ser disparado para outra thread tem que estar dentro de um Runnable.
Esse Runnable é então passado para classe Thread, para só então vc dar o start.
Tente assim:
packagelib;importjavax.swing.ImageIcon;importjavax.swing.JLabel;importjava.io.File;publicclassSlideShow{privateJLabellblImg;publicSlideShow(JLabelimg){this.lblImg=img;}publicvoidplay(){Threadt=newThread(newSlideRun());t.start();}privateclassSlideRunimplementsRunnable{publicvoidrun(){Stringdir="C:\app\dist\imgs\"; File diretorio = new File(dir); File imgs[] = diretorio.listFiles(); int i = 0; double tempo = 0; try { while (true) { Thread.sleep(3500); tempo += 3500; if (i > imgs.length - 1) { i = 0; } SlideShow.this.lblImg.setIcon(new ImageIcon(dir + imgs[i].getName())); i++; if (tempo > 15000) return; } } catch (InterruptedException e) {} } }}
Agora o porblema foi outro. Me parece que o lblImg nã foi inicializado e se encontra nulo, então o lblImg.setIcon() joga um NullPointerException. Pelo menos é mais facil o problema ser aí.
poxa cara vlew… mas fiquei até triste… nada q tem lá eu consegui usar…tudo da erro…po sem esperanças…
iwallas
o jlabel está instanciado, mas como mostrei ali, eu passo ele como referencia para o construtor da classe slideshow, agora… será q eu nao posso mais acessar esse jlabel de dentro desta classe?
iwallas
Aaaaah!!! deixei um SYSTEM>OUT e ele imprimi o nome das imagens!!! a execução está OK, o problema agora é acessar o JLabel!!
Tow matutando aqui…ajuda será bem vinda rs
Marcio_Biza
Pode sim… continua dando o NullPointer?
iwallas
sim! continua! E PIOR, não consigo acessar nada! Tentei colocar ela como innerclass, mesmo assim não rola… tentei imprimir só o length do array de imgs…e nao rolou, segue:
se eu colocar a declaração do array de imgs dentro da classe SlideRun e imprimir com getName() ele imprime o caminho de todas imagens da pasta… então eu acho que funcionando está, mas nao consigo acessar o array ou qualquer elemento que seja fora dessa classe =/