Entenderam? huahuaa, queria fazer algo assim para colocar na barra de status… para dizer que a leitura esta andando, tem como fazer isso usando thread, ou que ferramento devo utilizar para fazer este efeito bem rápido e constante…
dá uma procurada sobre SwingUtilities … ele ajuda bastante a trabalhar com threads simples e swing…
jopss
Olá… existe as classes do framework JGoodies, do pacote com.jgoodies.animation para fazer animações com letras na tela… tem um exemplo na JavaMagazine (acho que a 42) que explica passo a passo como faz.
Mas se vc quiser, pode fazer na mão tbm. É simples. Veja um exemplo abaixo para fazer o seguinte: (sem os pontos…shaudhas)
…Olá
…Olá
…Olá
…Olá
…Olá
…Olá
Olá
Olá
privateintxpos=0;privateThreadthreadAnime=null;privatejavax.swing.JLabeltext=newjavax.swing.JLabel();privatevoidanimation(){try{//seta a variavel que irá contar a posiçãoxpos=1000;//faz uma nova linha de execucao, indo para o metodo run()if(threadAnime==null){threadAnime=newThread(this);threadAnime.start();}}catch(Exceptionex){ex.printStackTrace();}}//Inicia a execucao da animacao do painel sulpublicvoidrun(){Stringt="";//laço infinitowhile(threadAnime!=null){//faz o label de boas vindast="Olá";//seta o texto no labeltext.setText(t);//se a posicao for 5, páraif(xpos<=5){xpos=5;text.setBounds(xpos,0,800,20);panel.add(text);//dorme 3 segundostry{Thread.sleep(3000);}catch(InterruptedExceptionex){}//reseta a variavel que conta a posicaoxpos=1000;}//anda a variavel xpostext.setBounds(xpos,0,800,20);panel.add(text);//diminuixpos-=6;panel.repaint();//dorme 0.1 segundos, tempo de o label anda na animacao (fps)try{Thread.sleep(10);}catch(InterruptedExceptionex){};}}
Tenho um JPanel chamado panel que tem a dimensão [1022,23] e com NullLayout… a “animacao” passa da direita para esquerda
Adapte para oq vc quer ae…
jopss
dcbasso
Na linha 13, voce passa o THIS… o que seria o THIS, o painel em si?
jopss
opss… foi malz… esse é um fragmento de um código que está em um JFrame… a tela (e o panel) já foi setado antes! O “this” no construtor da Thread indica a classe que implementa Runnable e o método run(), para ele poder criar a linha de execução. No meu caso, é a propria tela JFrame, por isso o this.
jopss
dcbasso
Bem de qualquer forma ainda estou confuso... estou fazendo isso em um JFrame, onde tem uma JLabel... como faço para colocar o thread dentro deste código... eu ia criar uma classe assim:
Uma Thread pode ser feito dessa forma ou implemetando a inteface Runnable, o que é preferível. Como disse, esse é um fragmento de um código em um JFrame onde o panel é setado antes, como se faz normalmente. Mas tá aí esse exemplo dentro de uma classe JFrame que funciona!
packagejavaapplication1;importjava.awt.BorderLayout;importjavax.swing.JFrame;importjavax.swing.JPanel;publicclassTelaAnimacaoextendsJFrameimplementsRunnable{privateJPanelpanel;privateintxpos=0;privateThreadthreadAnime=null;privatejavax.swing.JLabeltext=newjavax.swing.JLabel();publicTelaAnimacao(){this.setTitle("animacao");this.setSize(1022,55);this.setLayout(newBorderLayout());this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);panel=newJPanel();this.add(panel,BorderLayout.CENTER);animation();}privatevoidanimation(){try{//seta a variavel que irá contar a posição xpos=1000;//faz uma nova linha de execucao, indo para o metodo run() if(threadAnime==null){threadAnime=newThread(this);threadAnime.start();}}catch(Exceptionex){ex.printStackTrace();}}//Inicia a execucao da animacao do painel sul publicvoidrun(){Stringt="";//laço infinito while(threadAnime!=null){//faz o label de boas vindas t="Olá";//seta o texto no label text.setText(t);//se a posicao for 5, pára if(xpos<=5){xpos=5;text.setBounds(xpos,0,800,20);panel.add(text);//dorme 3 segundos try{Thread.sleep(3000);}catch(InterruptedExceptionex){}//reseta a variavel que conta a posicao xpos=1000;}//anda a variavel xpos text.setBounds(xpos,0,800,20);panel.add(text);//diminui xpos-=6;panel.repaint();//dorme 0.1 segundos, tempo de o label anda na animacao (fps) try{Thread.sleep(10);}catch(InterruptedExceptionex){}}}publicstaticvoidmain(String[]args){newTelaAnimacao().setVisible(true);}}
PS: dessa forma que faço, dependendo da máquina, a animação fica mais rápida ou lenta!!
PS2: alterando
sim, nao garante que ela irá parar (e a animacao)… somente “manda” o SO finalizar… ele faz quando quer :lol:
o que vc quer fazer com isso?? Seria legal vc colocar num frame ou panel equando nao quer mais, finaliza ou “apaga” da tela…
jopss
dcbasso
é apenas uma janela, que se irá fazer um efeito “de busca” para o usuário! Mais por estetica… hehehe, dai se ele achar ele fecha a janela e abre uma outra janela, caso não ache, ele retorna a janela anterior…
entendeu?! Acho que o “efeito” vai ficar legal, para o usuário!
jopss
legal… entao pega o exemplo da minha tela ae de cima… ela abre uma tela com a animacao… vc pode “melhorar” e fazer com JDialog, por causa do modal…
mas se vc quiser surpreender mesmo, dá uma pesquisada no JGoodies Animation… tem uma animação que as letras ficam “pulando” (GlyphAnimation), mt legal…
jopss
dcbasso
A vou olgar sim… hehehe quem sabe já uso ae! uhauhauha
Estou vendo como vou fazer ela, se uso Dialog, ou sobreponho a janela que antecede ele… pensando no caso!
To arrumando umas coisas no Banco de Dados tbm, hehe… não é fácil 1001 coisas…
Brigadão pela força ae!!!
Abraçosss
dcbasso
Cara… consegui rodar ele hoje… hehe, ficou legal… efeito com a thread ficou 10!
Agora tenho que me entender melhor, dar uma lida sobre o assunto, ver como faço ele bem certinho hehe!!!
Abraços!
dcbasso
Cara, vou precisar de outro HELP teu!
importjava.io.File;importjava.util.Vector;/* * checkSD.java * * Created on 16 de Abril de 2008, 15:27 */importjava.util.logging.Level;importjava.util.logging.Logger;/** * * @author Dantinho */publicclasscheckSDextendsjavax.swing.JDialog{privateFiledir;privateThreadthread=null;/** Creates new form checkSD */publiccheckSD(java.awt.Frameparent,booleanmodal,Filef){super(parent,modal);initComponents();this.dir=f;// go();}publicbooleango(){// initComponents();thread=newThread();thread.start();if(accept().size()>0){returntrue;}returnfalse;}publicvoidrun(){inti=0;this.jProgresso.setValue(i);while(this.jProgresso.getValue()<100){try{if((i%6)==1){this.jMensagem.setText("Procurando Arquivo(s)");}else{this.jMensagem.setText(this.jMensagem.getText()+".");}this.jProgresso.setValue(i);i++;thread.sleep(65);}catch(InterruptedExceptionex){Logger.getLogger(checkSD.class.getName()).log(Level.SEVERE,null,ex);}}this.thread.stop();this.thread=null;}privateVector<File>accept(){Vector<File>novo=newVector<File>();File[]f=this.dir.listFiles();for(inti=0;i<f.length;i++){Stringname=f[i].getName().toLowerCase();if(name.endsWith("cxp")){novo.add(f[i]);}}returnnovo;}/** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */// <editor-fold defaultstate="collapsed" desc="Generated Code">privatevoidinitComponents(){jMensagem=newjavax.swing.JLabel();jProgresso=newjavax.swing.JProgressBar();setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);setTitle("Verificando SD");jMensagem.setText("Procurando Arquivo(s)");javax.swing.GroupLayoutlayout=newjavax.swing.GroupLayout(getContentPane());getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(10,10,10).addComponent(jMensagem)).addComponent(jProgresso,javax.swing.GroupLayout.DEFAULT_SIZE,225,Short.MAX_VALUE)).addContainerGap()));layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(jProgresso,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jMensagem).addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE)));pack();}// </editor-fold>/** * @param args the command line arguments */publicstaticvoidmain(Stringargs[]){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){checkSDdialog=newcheckSD(newjavax.swing.JFrame(),true,null);dialog.addWindowListener(newjava.awt.event.WindowAdapter(){publicvoidwindowClosing(java.awt.event.WindowEvente){System.exit(0);}});dialog.setVisible(true);}});}// Variables declaration - do not modifyprivatejavax.swing.JLabeljMensagem;privatejavax.swing.JProgressBarjProgresso;// End of variables declaration}
Eu fiz os gráficos no NB e o resto do Eclipse… mas isso não tem nada haver… seguinte, o problema que eu quando eu chamo esta jDialog, eu logo após coloco jdialog.go(), e preciso pegar o retorno… mas parece que o código go() não esta indo… nem quando eu chamo ele pela linha 28, nem quando chamo ele por referencia…
que pode ser de errado??!?!?!
jopss
existe duas formar de usar Threads…
extendendo a classe Thread e reescrevendo o método run()…
implementando a interface Runnable e implementando o método run()…
No seu caso, vc já usa extends, entao sobra a interface… (e mesmo que nao usasse extends, eh melhor por interface mesmo)
Alem disso, vc tem que passar para o construtor da Thread a classe que implementa Runnable, e o run()… no caso eh a mesma classe, entao mude:
thread = new Thread();
para:
thread = new Thread(this);
deve funfar!
jopss
dcbasso
AA, antes tava como “new Thread(this)” e ele deu erro… o implements ok, realmente não vi esta besteira que fiz… hehe
Vou isso sim, valeu camarada!!!
dcbasso
Ainda não funfou… to vendo oque pode ser… :S
Quando rodo ele sozinho a thread funciona normal, mas quando ele ta na aplicação nada aparece…
dcbasso
Hum, o erro o seguinte, vou comentar aqui mas to tentando resolver… parece que a thread esta sendo executada depois de fechar a janela!!!
Vou ver o causo aqui! huauhahauha
Abraços
dcbasso
HAHAHAHA… olha isso cara… resolvi assim:
Erro:
public boolean mostra(){
super.setVisible(true);
thread = new Thread(this);
thread.start();
if (accept().size() > 0){
this.dispose();
return true;
}
this.dispose();
return false;
}
Correto:
public boolean mostra(){
thread = new Thread(this);
thread.start();
super.setVisible(true);
if (accept().size() > 0){
this.dispose();
return true;
}
this.dispose();
return false;
}
Alguém sabe me explicar a razão deste problema? Ou melhor, por somente solucionei assim? deve haver alguma razão para tal…
*Ignorem a parte do DISPOSE! hauhauhauha