Alguém pode me ajudar?

Olá, eu estou precisando de ajuda, eu criei um projeto e no inicio com o seguinte objetivo: Criar uma janela, e infinitamente fazer com que jlabels (no máximo 9 por vez) fossem criadas de um lado aleatório da janela e se movesse até o outro, na posição y aleatória de acordo com a altura da janela, e quando chegasse ao outro lado a jlabel fosse destruída e assim várias jlabels ficariam andando pela tela. Porém passei o dia todo tentando fazer isso, más acabei me perdendo nos códigos e não cheguei a lugar nenhum, alguém pode me ajudar?
Meus códigos são esses, talvez ajude vocês a entenderem o que que eu quero fazer:
Classe Movepassaros
`
package Pacote;

 import java.util.Random;
 import javax.swing.ImageIcon;
 import javax.swing.JFrame;
 import javax.swing.JLabel;

public class Movepassaros extends JFrame{

  public ImageIcon img = new ImageIcon(getClass().getResource("/Assets/pássaro.gif"));
  public static Random rdm = new Random();
  public static int passquant = 0;
  public static boolean bo = false;
  public static int posi = 0;
   Movepassaros(){
 
   this.setTitle("Movendo os passaros");
   this.setVisible(true);
   this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   this.setLocationRelativeTo(null);
   this.setExtendedState(JFrame.MAXIMIZED_BOTH);
   
   mover m = new mover();
   
}
public static void main(String[]args){
 new Movepassaros();
}
}

`
Classe mover

`
package Pacote;

import javax.swing.JLabel;

public class mover extends Thread{
public void run(){
	while(true){
		Movepassaros.passquant = Movepassaros.rdm.nextInt(8);
			for(int i = 0; i<=Movepassaros.passquant; ++i){
                mov m = new mov();
			}
		}
	} 
}`

Classe mov
`
package Pacote;

import javax.swing.JLabel;

public class mov extends Thread{
  
public void run(){
  
int altura = new Movepassaros().getHeight();
  int largura = new Movepassaros().getWidth();
  
  Movepassaros.bo = Movepassaros.rdm.nextBoolean();
   if(Movepassaros.bo==true){
	  int x = 0;
      JLabel l = new JLabel(new Movepassaros().img);
      int bound = Movepassaros.rdm.nextInt(altura);
      l.setLocation(0,bound);
       while(x<=largura){
          try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
         x+=1;
         l.setLocation(x,bound);
       }
   }else if(Movepassaros.bo==false){
	   int x = 0;
	      JLabel l = new JLabel(new Movepassaros().img);
	      int bound = Movepassaros.rdm.nextInt(altura);
	      l.setLocation(largura,bound);
	       while(x!=0){
              try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
             x-=1;
             l.setLocation(x,bound);
	    }
   }
   }
}

`

Eu consegui resolver, o código ficou assim
`

package Objects;

import java.awt.Component;
import java.awt.Image;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;

public class Passaro extends JFrame{
 Random rdm = new Random();
 boolean bo;
 int passquant;
 public void remover(Component c){
  this.remove(c);
 }

Passaro(){
 setTitle("Título");
 setVisible(true);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 setLocationRelativeTo(null);
 setExtendedState(JFrame.MAXIMIZED_BOTH);
 setLayout(null);
 
 int width = this.getWidth();

passquant = rdm.nextInt(5);
 while(true){
  for(int i = 0; i<=passquant; ++i){
   bo = rdm.nextBoolean();
   System.out.println(bo);
   if(bo==true){ 
 ImageIcon img = new ImageIcon(getClass().getResource("/Assets/pássaro-i.gif"));
 img.setImage(img.getImage().getScaledInstance(img.getIconWidth()-500,img.getIconHeight()-400, Image.SCALE_DEFAULT));
 int largura = img.getIconWidth();
 int altura = img.getIconHeight();
 JLabel p = new JLabel(img);
 p.setBounds(0,rdm.nextInt(this.getHeight()),largura,altura);
 this.add(p);
 this.repaint();
 new Thread(new Runnable(){
	 public void run(){
		System.out.println("rund");
		while(true){
		 if(p.getX()!=width){
		  p.setBounds(p.getX()+1,p.getY(),largura,altura);
		 }else if(p.getX()==width){
            remover(p);
		 }
		  try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		}
	 }
     }).start();
   }else if(bo==false){
   ImageIcon img = new ImageIcon(getClass().getResource("/Assets/pássaro.gif"));
   img.setImage(img.getImage().getScaledInstance(img.getIconWidth()-500,img.getIconHeight()-400, Image.SCALE_DEFAULT));
   int largura = img.getIconWidth();
   int altura = img.getIconHeight();
   JLabel p = new JLabel(img);
   p.setBounds(this.getWidth()-100,rdm.nextInt(this.getHeight()),largura,altura);
   this.add(p);
   this.repaint();
     new Thread(new Runnable(){
    	 public void run(){
    		 System.out.println("run");
    		while(true){
       		 if(p.getX()!=width){
    		  p.setBounds(p.getX()-1,p.getY(),largura,altura);
       		 }else if(p.getX()==width){
       			 
       		 }
       		 try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
    		}
    	 }
     }).start();
}
 try {
	Thread.sleep(2300);
} catch (InterruptedException e) {
	e.printStackTrace();
}
 passquant = rdm.nextInt(5);
}
}
 }
 public static void main(String[]args){
 Passaro pass = new Passaro();

}
}

`