Reputation: 23
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
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