Search code examples
javajpaneljlayeredpane

adding JLayeredPane to JPanel


I am trying to add a JLayeredPane to a JPanel and then add an image (JLabel icon) and a button to the JLayeredPane, but neither show up. I've tested the image without the button and the layeredpane so I know that works. Here is some of the code I am using. Is there something I am missing or doing wrong?


public class MyClass extends JPanel 
{
    private JLayeredPane layeredPane;
    private JLabel imageContainer = new JLabel();
    private JButton info = new JButton("i");

    MyClass(ImageIcon image)
    {
        super();

        this.imageContainer.setIcon(image);

        this.layeredPane = new JLayeredPane();
        layeredPane.setPreferredSize(new Dimension(300, 300));
        layeredPane.add(imageContainer, new Integer(50));
        layeredPane.add(info, new Integer(100));

        this.add(layeredPane);
    }
}       


Solution

  • From the tutorial

    By default a layered pane has no layout manager. This means that you typically have to write the code that positions and sizes the components you put in a layered pane.

    See the changes to your code:

    import java.awt.*;
    import javax.swing.*;
    public class MyClass extends JPanel {
        private JLayeredPane layeredPane;
        private JLabel imageContainer = new JLabel();
        private JButton info = new JButton("i");
    
        MyClass(ImageIcon image) {
            super();
    
            this.imageContainer.setIcon(image);
    
            this.layeredPane = new JLayeredPane();
            layeredPane.setPreferredSize(new Dimension(300, 300));
            layeredPane.add(imageContainer, new Integer(50));
            layeredPane.add(info, new Integer(100));
            this.add(layeredPane);
            // CHANGED CODE
            // Manually set layout the components. 
            imageContainer.setBounds( 0, 0,  
                                      image.getIconWidth(),
                                      image.getIconHeight() ); 
            info.setBounds( 200, 00,  50, 40 );
        }
        public static void main( String [] args ) {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            frame.add( new MyClass( new ImageIcon("logo.png")  ) );
            frame.pack();
            frame.setVisible( true );
        }
    }       
    

    Additional notes:

    1) It is better ( in my opinion ) to put the opening brace in the same line. That's how most Java code looks like.

    2) Avoid inheriting from JPanel ( or any other component ) if you don't are not really creating a subclass. You can use it directly without having to inherit ( unless you're indeed creating a new component.