JLabel

Galera, estou fazendo que 3 JLabels se movam dentro de um JPanel.
Segue o código.

class Movimentar extends Thread{
        @Override
    public void run(){
        int f=jLabel2.getX();
        int x=jLabel3.getX();
        int y=jLabel4.getX();
          int soma=0;
    while(true)    {

        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){//o problema ta aqui.
            jLabel2.setBounds(f, jLabel2.getY(), jLabel2.getWidth(), jLabel2.getHeight());
             jLabel3.setBounds(x, jLabel3.getY(), jLabel3.getWidth(), jLabel3.getHeight());
             jLabel4.setBounds(y, jLabel4.getY(), jLabel4.getWidth(), jLabel4.getHeight());
            soma=0;
        }
                try {
                    this.sleep(40);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    Arquivo.gerarLOG(ex.toString());
                }
    }
    }

Os Lables se movimentam normalmente. O problema é quando ele entra na condição de soma== 1500.
Os Labels ficam uns por cima dos outros.
Já tentei utilizar o setComponentZOrder do painel mas não deu certo.
Tentei também fazer com que o Layout do painel fosse o gridLayout e também continuou da mesma maneira.

Você já experimentou usar o depurador pra ver o que acontece?

SIm…já!
AS variaveis recebem os valores corretos…

Bem se eu não estiver enganado da forma que você está fazendo os JLabels numca chegaram
no ponto em que iniciaram porque quando chega no ponto em que a soma está com 1500 você
simplesmente colocar valor 0 nela, só que você não faz com que os JLabels voltem a sua posição
inicial. Para isso pegue os valores iniciais deles e guarde-os para utilizá-los na hora em que a soma
chegar a 1500.

Foi isso que entendi.

Mas os valores iniciais estão guardados na variaveis x,y,f é tanto que ele volta sim a posição original, porém ao voltar os mesmos ficam um por cima do outro.
E este é justamente o meu problema…

Oi. O que você quer dizer com “um fica por cima do outro”? Pode postar um screenshot de antes de depois de isso acontecer?

Algumas dicas:

  1. O seu código ficará mais simples se você usar o método setLocation no lugar do setBounds;
  2. Você não pode alterar propriedades dos objetos Swing de fora da thread do Swing. Você deve fazer com que sua thread externa envie uma mensagem para a thread do Swing. Você faz isso assim:

private setLocation(final JLabel label, int x, int y) { EventQueue.invokeLater(new Runnable() { public void run() { label.setLocation(x, y); } } }

  1. Talvez seja mais fácil usar para isso o Java 2D. Veja tutoriais de como no meu site.

Vini no momento estou sem poder postar imagens, mas posso te dar um breve exemplo aqui…
Suponha que img é uma imagem.
Então eu tenho

Bem, na primeira passagem tudo fica blz. As imagens e o texto se movimentam na ordem correta.
Ao chegar no fim, ou seja, quando os componentes desaparecerem(por sairem de dentro do painel-visualmente) eu reinicio as posições dos mesmos.
então tudo fica assim:

Ou seja: Os JLabels ficam uns sobre os outros.
Eu já tentei chamar a Thread do swing, mas continua da mesma maneira, já tentei dar um repaint nos labels e no Panel, também não modifica nada.
Aproveitando a oportunidade gostaria de saber também se existe alguma maneira para se saber o a posição final de um elemento na tela.
Por exemplo, o ultimo ponto do painel.

O último ponto de um painel, na vertical, é o width() dele.
O último ponto na horizontal é o height() dele.

Se você estiver sobre um JFrame, aí é um pouco mais complicado. É necessário descontar os insets, que são as bordas do frame. Assim, o primeiro ponto é:
(0 + getInsets().left, 0 + getInsets().top)
(getWidth() - getInsets().left - getInsets().right(), getHeight() - getInsets().top - getInsets().width())

Esse comportamento que você descreve é estranho. Você tem pouco controle sobre o ciclo de pintura se tentar animar componentes. Nessas horas, é melhor mesmo recorrer ao Java 2D. De qualquer forma, você não pode anexar um zip com seu código todo no seu post aqui do GUJ? Basta usar a opção de attachments do próprio GUJ.

ok vini…
Havia me esquecido do Attchments…
:lol:


Pois é, no seu código o setBounds quando soma == 1500 está com x setado para uma soma maluca…

Outra coisa. Pq tem tanto “Vector”? O Vector é uma classe que não deveria ser usada desde o java 1.2.

Vini foi mau, eu estava fazendo alguns testes e enviei sem corrigir. Inicialmente esta parte estava como encontra-se no meu primeiro post.
Eu resolvi o problema da seguinte forma.

jLabel2.setBounds(8, jLabel2.getY(), jLabel2.getWidth(), jLabel2.getHeight());
             jLabel3.setBounds(jLabel2.getWidth()+20, jLabel3.getY(), jLabel3.getWidth(), jLabel3.getHeight());
             jLabel4.setBounds(jLabel3.getWidth()+60, jLabel4.getY(), jLabel4.getWidth(), jLabel4.getHeight());

é gambiarra, mas ajustei os labels nas suas posições corretas.
Eu realmente não sabia desse fato do Vector.
Passarei a utilizar apartir de agora o ArrayList.

Legal. Só fique atento para usar através da interface List.

Por exemplo, para criar uma lista de inteiros, você faria:

Assim fica fácil se você precisar trocar a implementação da lista no futuro.

Valeu aí pela força galera!