Jlabel

Galera estou fazendo 3 Jlables se movimentarem como se fossem uma tag marquee em html, onde o primeiro label é uma imagem, o segundo um texto e o terceiro outra imagem.
A movimentação ta blz. O problema é que em um dado período de tempo eu tenho que trocar essas imagens e o texto também e quando eu faço isto ele não muda.
Ou seja, eu chamo o jlabel.setIcon e ainda assim as figuras anteriores aiinda permanessem.

Alguém pode me dar uma luz???

PS: As figuras estão dentro de um pacote do meu projeto.
O nome do Pacote é Imagens.
Segue meu código.

class Movimenta extends Thread{
private int soma=0;
    public void run() {
        this.atualizaMensagem(new Mensagem("",1, "", ""));//aqui eu passo um objeto mensagem que nele contem os parametros que informam msg,tempo em que a //msg deve ficar em apresentação,nome da figura1,nome da figura 2
            int f = jLabel2.getX();
            int x = jLabel3.getX();
            int k = jLabel4.getX();
            Arquivo a = new Arquivo();
            Vector<Mensagem> list = null;
            while (true) {
                list = a.getArquivoConfig().getMsgs1();
                if (list.size() > 0) {
                    break;
                } else {
                    try {
                        this.sleep(1500);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(InternalProcessCritica.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
            int qtdMsg = list.size();
            int controle = 0;
            while (controle <= qtdMsg) {
                System.out.println(controle);
                Mensagem m = list.get(controle);
                this.atualizaMensagem(m);
                Cronometro cron = new Cronometro();
                cron.setTime(m.getTempo());
                cron.start();
                while (!cron.isLibera()) {
                    movimentarLabels(f, x, k);
                }
                controle++;
                if (controle == qtdMsg) {
                    controle = 0;
                    list = a.getArquivoConfig().getMsgs1();
                }
            }
        }

    public void atualizaMensagem(Mensagem m) {
            ImageIcon image = new ImageIcon(getClass().getResource("/Imagens/" + m.getFigura1()));
            ImageIcon image2 = new ImageIcon(getClass().getResource("/Imagens/" + m.getFigura2()));
            jLabel2.setIcon(image);
            jLabel3.setText(m.getMsg());
            jLabel4.setIcon(image2);
            /*if(!m.getFigura1().equals(""))//aqui eu tentei utilizar o getUI.udate mas não deu certo. quando não há uma img ele levanta um NullPointerException
            jLabel2.getUI().update(jLabel2.getGraphics(), jLabel2);
            if(!m.getFigura2().equals(""))
            jLabel4.getUI().update(jLabel4.getGraphics(), jLabel4);*/
        }

    public void movimentarLabels(int f, int x, int k) {

            jLabel2.setBounds(jLabel2.getX() + 5, jLabel2.getY(), jLabel2.getWidth(), jLabel2.getHeight());
            jLabel3.setBounds(jLabel3.getX() + 5, jLabel3.getY(), jLabel3.getWidth(), jLabel3.getHeight());
            jLabel4.setBounds(jLabel4.getX() + 5, jLabel4.getY(), jLabel4.getWidth(), jLabel4.getHeight());
            soma += 5;
            if (soma == 1500) {
                jLabel2.setBounds(f, jLabel2.getY(), jLabel2.getWidth(), jLabel2.getHeight());
                jLabel3.setBounds(x, jLabel3.getY(), jLabel3.getWidth(), jLabel3.getHeight());
                jLabel4.setBounds(k, jLabel4.getY(), jLabel4.getWidth(), jLabel4.getHeight());
                soma = 0;
            }
            try {
                this.sleep(100);
            } catch (InterruptedException ex) {
                Arquivo.gerarLOG(ex.toString());
            }
        }
    }

Galera eu sei que minha forma de movimentação ta muito bizarra, mas eu gostaria de resouver primeiro este problema para após melhorar a lógica.

Ninguém tem uma luz???

  1. Não use Vector. Use o ArrayList. Veja como aqui: http://www.guj.com.br/posts/list/74068.java#389435
  2. Você não pode alterar texto de labels ou outros elementos da interface gráfica a partir de outra thread. Tem que fazer essa outra thread pedir para o Swing fazer isso. Aí fica assim:

public void atualizaMensagem(Mensagem m) { EventQueue.invokeLater(new Runnable() { //Pede para o Swing executar o runnable abaixo. public void run() { ImageIcon image = new ImageIcon(getClass().getResource("/Imagens/" + m.getFigura1())); ImageIcon image2 = new ImageIcon(getClass().getResource("/Imagens/" + m.getFigura2())); jLabel2.setIcon(image); jLabel3.setText(m.getMsg()); jLabel4.setIcon(image2); } } }

Postou a dúvida as 21h, e quer a resposta as 9h da manhã?

Pois é, parece que o GUJ não é tão 24h assim…

Vini, era isto mesmo!!!
Muito obrigado aí pela ajuda!
Desculpa aí a pressa…é que eu estava bem preocupado em não conseguir resolver isto!!!