¿Cómo crear paneles expandibles con swing?

Me gustaría crear una lista de paneles expandidos y colapsados, como en esta imagen:

No he encontrado ningún componente de swing para esto, así que comencé a crear algo como esto. Traté de poner botones uno debajo del otro, que llenan el ancho disponible, pero realmente no funciona. Solo puedo ver el último agregado.

    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());

    panel.add(new JButton("Delphi Projects"), BorderLayout.NORTH);
    panel.add(new JPanel(), BorderLayout.NORTH); // hidden panel
    panel.add(new JButton("Delphi Projects | Delphi Files"), BorderLayout.NORTH);
    panel.add(new JPanel(), BorderLayout.NORTH); // hidden panel
    panel.add(new JButton("Other Files"), BorderLayout.NORTH);
    panel.add(new JPanel(), BorderLayout.NORTH); // hidden panel
    panel.add(new JButton("C++ Builder Projects | C++ Builder Files"), BorderLayout.NORTH);
    panel.add(new JPanel(), BorderLayout.NORTH); // hidden panel

    JScrollPane scroll = new JScrollPane(panel);

Respuestas a la pregunta(3)

Su respuesta a la pregunta