Umme
Umme

Reputation: 23

Not Having any output after having added two JPanel on a JLayeredPane

What I'm trying to do is overwriting two panels, where I am Inserting an Image in the background panel through the use of a JLabel, and I want another smaller panel to appear on that same background Image! Here is what I have written:

import javax.swing.*;
import javax.swing.text.html.ImageView;

import java.awt.*;

public class addImage extends JFrame {

    private JLabel label;
    private ImageIcon Image;
    private JButton b;
    private JPanel panel1;
    private JPanel panel2;
    private JLayeredPane layerpanel;

    public addImage() {
        // JFRame
        super("First Time adding Image");
        setLayout(null);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setSize(400, 400);

        // JLabel containing Image
        Image = new ImageIcon(getClass().getResource("image1.jpg"));
        // Adding Image in JLabel
        label = new JLabel(Image);

        // Adding Label to panel1
        panel1 = new JPanel();
        panel1.add(label);

        // JPanel2
        panel2 = new JPanel();
        panel2.setBackground(Color.darkGray);
        panel2.setPreferredSize(new Dimension(200, 200));
        panel2.setOpaque(true);

        // LAyeredPane adding both panels
        layerpanel = new JLayeredPane();
        layerpanel.setLayout(new BorderLayout());
        layerpanel.add(panel1, new Integer(0), 0);
        layerpanel.add(panel2, new Integer(1), 1);

        add(layerpanel);

    }

    public static void main(String[] args) {
        new addImage();

    }

}

After executing the piece of code Im not getting any output except the empty frame! I am getting these errors :

Exception in thread "main" java.lang.IllegalArgumentException: cannot add to layout: constraint must be a string (or null)
    at java.awt.BorderLayout.addLayoutComponent(Unknown Source)
    at java.awt.Container.addImpl(Unknown Source)
    at javax.swing.JLayeredPane.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at addImage.<init>(addImage.java:45)
    at addImage.main(addImage.java:53)

I have checked all the question related but still I have not been able to find the solution!!!! Any kind of help will be appreciated ! Thank you

Upvotes: 0

Views: 59

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347184

You're problem is here:

layerpanel.setLayout(new BorderLayout());
layerpanel.add(panel1, new Integer(0), 0);
layerpanel.add(panel2, new Integer(1), 1);

and it's not helped by

setLayout(null);

The JLayeredPane now requires that you pass it one of the valid constraints for BorderLayout (like BorderLayout.NORTH).

Having said that, I'm not sure what you hope to achieve doing this.

You could get the same effect by using a CardLayout with a lot less mess, see How to Use CardLayout for more details

I can "replicate" your desired output using something like...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class AddImage extends JFrame {

    private JLabel label;
    private ImageIcon Image;
    private JButton b;
    private JPanel panel1;
    private JPanel panel2;
    private JLayeredPane layerpanel;

    public AddImage() {
        // JFRame
        super("First Time adding Image");
        setLayout(new BorderLayout());
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setSize(400, 400);

        // JLabel containing Image
//      Image = new ImageIcon(getClass().getResource("image1.jpg"));
        // Adding Image in JLabel
        label = new JLabel("Help");

        // Adding Label to panel1
        panel1 = new JPanel();
        panel1.add(label);

        // JPanel2
        panel2 = new JPanel();
        panel2.setBackground(Color.darkGray);
        panel2.setPreferredSize(new Dimension(200, 200));
        panel2.setOpaque(true);

        // LAyeredPane adding both panels
        layerpanel = new JLayeredPane();
        layerpanel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        layerpanel.add(panel1, gbc);
        layerpanel.add(panel2, gbc);

        layerpanel.setLayer(panel1, new Integer(0));
        layerpanel.setLayer(panel2, new Integer(1));

        add(layerpanel);

    }

    public static void main(String[] args) {
        new AddImage();

    }

}

Upvotes: 1

Related Questions