Hi,

I got this piece of code from this forum and i was trying to modify it so that I can make it dynamic. I modified it a little bit to add multiple collapsible panels. But I need some help.

1. I need to add these panels dynamically. If I click on a button it will add the panels one at a time and make a sort of queue layout(this queue layout is a problem too).

2. At the queue layout whenever I click a panel, it should move to the bottom of the list and then expand(as opposed to expanding in its own place).

For some reason I cant wrap my head around it. Please help :)

package desktopapplication2;

import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.image.BufferedImage;
import javax.swing.*;


public class Test {
	public static void main(String[] args) {

		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Container contentPane = f.getContentPane();
                //contentPane.setLayout(new BoxLayout(contentPane,BoxLayout.PAGE_AXIS));
                //contentPane.setLayout(new BoxLayout(contentPane,BoxLayout.Y_AXIS));
                // Define the layout for the subpanels
                GridBagLayout layout = new GridBagLayout();
                contentPane.setLayout( layout );
                GridBagConstraints gbc = new GridBagConstraints();
                //gbc.insets = new Insets(10, 0, 5, 0);
                gbc.weightx = 1.0;
		gbc.fill = gbc.HORIZONTAL;
		gbc.gridwidth = gbc.REMAINDER;

                CollapsablePanel cp1 = new CollapsablePanel("test1", buildPanel());
                gbc.insets = new Insets(10, 0, 5, 0);
                contentPane.add(cp1,gbc);

                CollapsablePanel cp2 = new CollapsablePanel("test2", buildPanel());
                gbc.insets = new Insets( 5, 0, 5, 0 );
		contentPane.add(cp2,gbc);

                CollapsablePanel cp3 = new CollapsablePanel("test3", buildPanel());
		contentPane.add(cp3,gbc);

                f.setSize(360, 500);
		f.setLocation(200, 100);
		f.setVisible(true);



	}



	public static JPanel buildPanel() {
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.insets = new Insets(2, 1, 2, 1);
		gbc.weightx = 1.0;
		gbc.weighty = 1.0;

		JPanel p1 = new JPanel(new GridBagLayout());
		gbc.gridwidth = gbc.RELATIVE;
		p1.add(new JButton("button 1"), gbc);
		gbc.gridwidth = gbc.REMAINDER;
		p1.add(new JButton("button 2"), gbc);
		gbc.gridwidth = gbc.RELATIVE;
		p1.add(new JButton("button 3"), gbc);
		gbc.gridwidth = gbc.REMAINDER;
		p1.add(new JButton("button 4"), gbc);

		return p1;
	}
}

class CollapsablePanel extends JPanel {

	private boolean selected;
	JPanel contentPanel_;
	HeaderPanel headerPanel_;

	private class HeaderPanel extends JPanel implements MouseListener {
		String text_;
		Font font;
		BufferedImage open, closed;
		final int OFFSET = 30, PAD = 5;

		public HeaderPanel(String text) {
			addMouseListener(this);
			text_ = text;
			font = new Font("sans-serif", Font.PLAIN, 12);
			// setRequestFocusEnabled(true);
			setPreferredSize(new Dimension(200, 20));
			int w = getWidth();
			int h = getHeight();

			/*try {
				open = ImageIO.read(new File("images/arrow_down_mini.png"));
				closed = ImageIO.read(new File("images/arrow_right_mini.png"));
			} catch (IOException e) {
				e.printStackTrace();
			}*/

		}

		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			Graphics2D g2 = (Graphics2D) g;
			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_ON);
			int h = getHeight();
			/*if (selected)
				g2.drawImage(open, PAD, 0, h, h, this);
			else
				g2.drawImage(closed, PAD, 0, h, h, this);
                        */ // Uncomment once you have your own images
			g2.setFont(font);
			FontRenderContext frc = g2.getFontRenderContext();
			LineMetrics lm = font.getLineMetrics(text_, frc);
			float height = lm.getAscent() + lm.getDescent();
			float x = OFFSET;
			float y = (h + height) / 2 - lm.getDescent();
			g2.drawString(text_, x, y);
		}

		public void mouseClicked(MouseEvent e) {
			toggleSelection();
		}

		public void mouseEntered(MouseEvent e) {
		}

		public void mouseExited(MouseEvent e) {
		}

		public void mousePressed(MouseEvent e) {
		}

		public void mouseReleased(MouseEvent e) {
		}

	}

	public CollapsablePanel(String text, JPanel panel) {
		super(new GridBagLayout());
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.insets = new Insets(1, 3, 0, 3);
		gbc.weightx = 1.0;
		gbc.fill = gbc.HORIZONTAL;
		gbc.gridwidth = gbc.REMAINDER;

		selected = false;
		headerPanel_ = new HeaderPanel(text);

		setBackground(new Color(200, 200, 220));
		contentPanel_ = panel;

		add(headerPanel_, gbc);
		add(contentPanel_, gbc);
		contentPanel_.setVisible(false);

		JLabel padding = new JLabel();
		gbc.weighty = 1.0;
		add(padding, gbc);

	}

	public void toggleSelection() {
		selected = !selected;

		if (contentPanel_.isShowing())
			contentPanel_.setVisible(false);
		else
			contentPanel_.setVisible(true);

		validate();

		headerPanel_.repaint();
	}

}

OK I have added this code after the buildpanel() so that it till create a new collapsible panel. What am I doing wrong and how do I show it in the main[]

public static JPanel thumbnail() {

        //addMouseListener(this);
        JPanel t = new JPanel();
        JButton jb = new JButton("Thumb");


        jb.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                buildPanel();
            }
        });


        t.add(jb);



        return t;
    }

OK I am taking the original post out and substituting it with this simpler problem. If you look at the code, you will see in the buildMainPanel() all I am trying to do is to create a new panel in the main container. But obciously there is this scope issue how can I get rid of this problem?

package desktopapplication2;

import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class Test {

    public static void main(String[] args) {

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final Container contentPane = f.getContentPane();

        GridBagLayout layout = new GridBagLayout();
        contentPane.setLayout(layout);
        final GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(10, 0, 5, 0);
        gbc.weightx = 1.0;
        gbc.fill = gbc.HORIZONTAL;
        gbc.gridwidth = gbc.REMAINDER;

        CollapsablePanel cp1 = new CollapsablePanel("Main Queue", buildMainPanel());
        //gbc.insets = new Insets(10, 0, 5, 0);
        contentPane.add(cp1, gbc);

        JButton j = new JButton("IOI");

        j.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                CollapsablePanel cp4 = new CollapsablePanel("test4", buildPanel());
                contentPane.add(cp4, gbc);
                contentPane.validate();
                contentPane.repaint();
            }
        });
        contentPane.add(j, gbc);


        f.setSize(360, 500);
        f.setLocation(200, 100);
        f.setVisible(true);



    }
    // Building the Main Panel

    public static JPanel buildMainPanel() {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;

        JPanel p1 = new JPanel(new GridBagLayout());

        JButton bt1 = new JButton(new ImageIcon("/Users/sha33/NetBeansProjects/DesktopApplication2/src/desktopapplication2/r1.jpg"));
        p1.add(bt1, gbc);
        bt1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                CollapsablePanel cp4 = new CollapsablePanel("test4", buildPanel());
                contentPane.add(cp4, gbc);
                contentPane.validate();
                contentPane.repaint();
            }
        });


        JButton bt2 = new JButton(new ImageIcon("/Users/sha33/NetBeansProjects/DesktopApplication2/src/desktopapplication2/r2.jpg"));
        p1.add(bt2, gbc);

        JButton bt3 = new JButton(new ImageIcon("/Users/sha33/NetBeansProjects/DesktopApplication2/src/desktopapplication2/r3.jpg"));
        p1.add(bt3, gbc);


        return p1;
    }

    public static JPanel buildPanel() {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(2, 1, 2, 1);
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;

        JPanel p1 = new JPanel(new GridBagLayout());
        gbc.gridwidth = gbc.RELATIVE;
        p1.add(new JButton("button 1"), gbc);
        gbc.gridwidth = gbc.REMAINDER;
        p1.add(new JButton("button 2"), gbc);
        gbc.gridwidth = gbc.RELATIVE;
        p1.add(new JButton("button 3"), gbc);
        gbc.gridwidth = gbc.REMAINDER;
        p1.add(new JButton("button 4"), gbc);
        ;

        return p1;
    }
}

class CollapsablePanel extends JPanel {

    private boolean selected;
    JPanel contentPanel_;
    HeaderPanel headerPanel_;

    private class HeaderPanel extends JPanel implements MouseListener {

        String text_;
        Font font;
        BufferedImage open, closed;
        final int OFFSET = 30, PAD = 5;

        public HeaderPanel(String text) {
            addMouseListener(this);
            text_ = text;
            font = new Font("sans-serif", Font.PLAIN, 12);
            // setRequestFocusEnabled(true);
            setPreferredSize(new Dimension(200, 20));
            int w = getWidth();
            int h = getHeight();

            /*try {
            open = ImageIO.read(new File("images/arrow_down_mini.png"));
            closed = ImageIO.read(new File("images/arrow_right_mini.png"));
            } catch (IOException e) {
            e.printStackTrace();
            }*/

        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            int h = getHeight();
            /*if (selected)
            g2.drawImage(open, PAD, 0, h, h, this);
            else
            g2.drawImage(closed, PAD, 0, h, h, this);
             */ // Uncomment once you have your own images
            g2.setFont(font);
            FontRenderContext frc = g2.getFontRenderContext();
            LineMetrics lm = font.getLineMetrics(text_, frc);
            float height = lm.getAscent() + lm.getDescent();
            float x = OFFSET;
            float y = (h + height) / 2 - lm.getDescent();
            g2.drawString(text_, x, y);
        }

        public void mouseClicked(MouseEvent e) {
            toggleSelection();
        }

        public void mouseEntered(MouseEvent e) {
        }

        public void mouseExited(MouseEvent e) {
        }

        public void mousePressed(MouseEvent e) {
        }

        public void mouseReleased(MouseEvent e) {
        }
    }

    public CollapsablePanel(String text, JPanel panel) {
        super(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(1, 3, 0, 3);
        gbc.weightx = 1.0;
        gbc.fill = gbc.HORIZONTAL;
        gbc.gridwidth = gbc.REMAINDER;

        selected = false;
        headerPanel_ = new HeaderPanel(text);

        setBackground(new Color(200, 200, 220));
        contentPanel_ = panel;

        add(headerPanel_, gbc);
        add(contentPanel_, gbc);
        contentPanel_.setVisible(false);

        JLabel padding = new JLabel();
        gbc.weighty = 1.0;
        add(padding, gbc);

    }

    public void toggleSelection() {
        selected = !selected;

        if (contentPanel_.isShowing()) {
            contentPanel_.setVisible(false);
        } else {
            contentPanel_.setVisible(true);
        }

        validate();

        headerPanel_.repaint();
    }
}

But contentPane is no known inside the buildMainPanel class as it is declared in the main method and the gbc must be declared final. so the code does not compile.

This article has been dead for over six months. Start a new discussion instead.