Passar painéis entre componentes

galera to com em exercício aqui de arrancar os cabelos das bolas, como passa painéis para o array e depois para o JLayeredPane ? to usando o netBeans então vou tentar nao passar o código todo. tenho uma classe principal uma q vai servir para adicionar os painéis com as labels cada painel, isso em um sistema de ranque.


public class Principal extends javax.swing.JFrame {

    public Principal() {

        initComponents();
        camadaBK_Folha();
        editBTN();
    } private void btn_OpenTelaADDActionPerformed(java.awt.event.ActionEvent evt) {                                                

        RegistraKey addPaineis = new RegistraKey();
        addPaineis.setVisible(true);

    }                                               

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Principal().setVisible(true);
            }
        });
    }
    public ArrayList<PlanosDefundo> paineis = new ArrayList();
    public PlanosDefundo painel_C1;

    ///////////
    PlanosDefundo bkFolha = new PlanosDefundo("/res/24K.png", 0, 0, 1519, 1075);// Para 130 DPI, paisagem 

    public void camadaBK_Folha() {

        jScrollPane1.setLayout(null);

        camadas.setPreferredSize(new Dimension(1519, 1075)); // em x de .setBounds
        camadas.revalidate(); // Atualiza layout do JScrollPane
        //texte();
        
       for (int i = 0; i < paineis.size(); i++) {
    camadas.add(painel_C1.add(paineis.get(i)));
    
}
        /////
        bkFolha.setLayout(null);
        bkFolha.setOpaque(true);
        bkFolha.setBackground(Color.BLUE);

        camadas.add(bkFolha);

        bkFolha.repaint();
        camadas.repaint();
    }

    public void editBTN() {

        btn_OpenTelaADD.setText("<html><Add>Adicionar<br>Key</center></html>");
        btn_OpenTelaADD.setMargin(new Insets(0, 0, 0, 0)); //umaforma de centralizar o texto
        btn_OpenTelaADD.setOpaque(false);           

        btn_OpenTelaADD.setFocusPainted(false);      

    }

    public JLayeredPane getCamadas() {
        return camadas;
    }

    public void setCamadas(JLayeredPane camadas) {
        this.camadas = camadas;
    }

}

public class RegistraKey extends javax.swing.JFrame {
    
      private Principal refPrincipal =new Principal(); // aqui vamos guardar a janela Main
   
    public RegistraKey() {
      initComponents();
     }
 private void btn_adicionarKeyActionPerformed(java.awt.event.ActionEvent evt) {                                                 
         
addPaineis();
    }                                                

    public static void main(String args[]) {
     
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new RegistraKey().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton btn_adicionarKey;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JLabel lbl_Info1;
    private javax.swing.JTextField textFild_AtletaA;
    private javax.swing.JTextField textFild_AtletaB;
    private javax.swing.JTextField textFild_DadosA;
    private javax.swing.JTextField textFild_DadosB;
    // End of variables declaration                   

   
PlanosDefundo p; 
    public void addPaineis(){
    
     refPrincipal.paineis.add( new PlanosDefundo("",50,50,200,150));
     refPrincipal.bkFolha.repaint();
 }

}

public class PlanosDefundo extends JPanel {

 
    private BufferedImage imagem_BKs;
    private String caminhoImagem = "";
    public int largura;
    public int altura;
    public int posicaoX;
    public int posicaoY;

    public PlanosDefundo(String caminhoImagem, int posicaoX, int posicaoY, int largura, int altura) {
      
        this.caminhoImagem = caminhoImagem;
        this.largura = largura;
        this.altura = altura;
        this.posicaoX = posicaoX;
        this.posicaoY = posicaoY;
        this.setBackground(Color.BLUE);
  montarImagem();
    }

    public void montarImagem() {

        try {
            InputStream is = getClass().getResourceAsStream(caminhoImagem);
            if (is != null) {
                BufferedImage original = ImageIO.read(is);

                BufferedImage redimensionada = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_ARGB);
                Graphics g = redimensionada.createGraphics();
                g.drawImage(original, 0, 0, largura, altura, null);
                g.dispose();

                imagem_BKs = redimensionada;
                // Também ajusta o tamanho do painel para o novo tamanho da imagem
                this.setPreferredSize(new java.awt.Dimension(largura, altura));
                this.setSize(largura, altura);
            } else {
                System.err.println("Imagem não encontrada");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    
  
    @Override
    protected void paintComponent(Graphics g) {

        
        if (imagem_BKs != null) {
            g.drawImage(imagem_BKs, 0, 0, getWidth(), getHeight(), this);

        }
        setOpaque(false); // ← Garante que o fundo não sobreponha os filhos
    }

}

Tem coisas muito estranhas no seu código:

  • A classe Principal tem um método main;

  • A classe RegistraKeytambém tem um método main;

  • A classe principal tá instanciando a classe RegistraKey;

  • A classe RegistraKey também está instanciando a classe Principal;

  • A classe PlanosDefundodeveria ter nome no singular, já que cada instância dela representa um único plano de fundo;

Acredito que primeiramente você precisa decidir o que exatamente quer fazer, aí elaborar a pergunta melhor…