Matis Lepik
Matis Lepik

Reputation: 1162

JLayeredPane white background next to component

Experimenting with layered panes here and I'm having a problem. I have two JPanels. I'm adding them both to a JLayeredPane - panel1 is big enough to take up the whole space, while panel2 is smaller and centered using FlowLayout. The problem is that with JLayeredPane, the background next to panel2 seems to be painted white when I add it. Here's a picture to illustrate. panel1 is blue, panel2 is red:

As you can see, the bottom part of the panel1 is still painted, but for some reason the sides are just white. The panel2 is 700 pixels wide and centered, while the frame is 800 pixels wide, so it's definitely not a problem with that. Here's the entire class:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class Errortest extends JFrame {

    public static void main(String[] args) {
        //Creating frame and setting the JLayeredPane as contentpane
        Errortest frame = new Errortest();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLayeredPane pane = new JLayeredPane();
        pane.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        pane.setPreferredSize(new Dimension(800,600));
        frame.setContentPane(pane);
        frame.pack();

        //Creating panels
        JPanel panel1 = new JPanel();
        panel1.setPreferredSize(new Dimension(800,600));
        panel1.setBackground(Color.BLUE);        
        JPanel panel2 = new JPanel();
        panel2.setPreferredSize(new Dimension(700,500));
        panel2.setBackground(Color.RED);       

        pane.add(panel1, new Integer(0));
        pane.add(panel2, new Integer(1));

        frame.setVisible(true);        
    }
}

Hopefully that wasn't too confusing. From what I can tell, the white background comes from the JFrame itself, since when I do frame.setBackground(Color.YELLOW); it turns yellow.

Upvotes: 1

Views: 310

Answers (2)

Paul Samsotha
Paul Samsotha

Reputation: 209062

If you add a component to a JLayeredPane, it's like adding it to a null layout using container: you must fully specify the component's size and position.

import java.awt.*;
import javax.swing.*;

public class ErrorTest extends JFrame {

    public static void main(String[] args) {
        // Creating frame and setting the JLayeredPane as contentpane
        ErrorTest frame = new ErrorTest();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JComponent pane = new JLayeredPane();
        //pane.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));  // Take out FlowLayout
        pane.setPreferredSize(new Dimension(800, 600));
        frame.setContentPane(pane);

        // Creating panels
        JPanel panel1 = new JPanel();
        panel1.setBackground(Color.BLUE);
        panel1.setBounds(0, 0, 800, 600);  // <<<---- Set Bounds

        JPanel panel2 = new JPanel();
        panel2.setBackground(Color.RED);
        panel2.setBounds(50, 0, 700, 500); // <<---- Set Bounds 

        pane.add(panel1, new Integer(1));
        pane.add(panel2, new Integer(2));

        frame.pack();
        frame.setVisible(true);

    }
}

enter image description here

Upvotes: 1

Matis Lepik
Matis Lepik

Reputation: 1162

I believe I found out what the problem is. Has to do with the answer here: JLayeredPane not respecting layers

You need a layout manager which understands the Z-Axis. The default layout managers don't understand the Z-Axis of the JLayeredPane.

So it's the FlowLayout that's messing me up. I'll just use absolute positioning for my project and use setBounds() to make sure the red panel ends up in the middle. Otherwise I'd have to look into custom layout managers I suppose.

Upvotes: 1

Related Questions