Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Swing - how to show a panel on top of another panel?

I wish to have an internal (non window) dialog to ask for member input. I would like the dialog to be placed centrally on an existing JPanel.

I have looked at layeredpanes and these seem unusable due to only having a single layout manager (or no layout manager) across all the panes. I guess I could try to override JLayeredPane and provide a custom layout but this seems extreme.

Glass panes don't seem to be appropriate either.

How can this be done? Is there no usable concept of z-indexes in Swing?

EDIT

The reason Layered Panes weren't appropriate was due to the lack of a layout manager per layer. The panel is resizeable, Panel A should stay at 100% of area and Panel B should stay centralized.

like image 215
Pool Avatar asked May 12 '09 12:05

Pool


People also ask

Can I add a panel inside a panel in Java?

We can add most of the components like buttons, text fields, labels, tables, lists, trees, etc. to a JPanel. We can also add multiple sub-panels to the main panel using the add() method of Container class.

Can a JFrame have multiple panels?

Creating a JFrame Window with Multiple panels added to it Now Let's do some improvisation by adding multiple panel into the JFrame with different colors into it. So you can see that I created 4 Panels and set their location and size according to your own will by using the setBounds() function.

What is overlay layout in Java?

An OverlayLayout is a subclass of Object class and it can arrange the components over the top of each other and uses components specified alignments to position them relatively. When different sizes are given to any of the components, we can see all the components.


1 Answers

I think LayeredPane is your best bet here. You would need a third panel though to contain A and B. This third panel would be the layeredPane and then panel A and B could still have a nice LayoutManagers. All you would have to do is center B over A and there is quite a lot of examples in the Swing trail on how to do this. Tutorial for positioning without a LayoutManager.

public class Main {     private JFrame frame = new JFrame();     private JLayeredPane lpane = new JLayeredPane();     private JPanel panelBlue = new JPanel();     private JPanel panelGreen = new JPanel();     public Main()     {         frame.setPreferredSize(new Dimension(600, 400));         frame.setLayout(new BorderLayout());         frame.add(lpane, BorderLayout.CENTER);         lpane.setBounds(0, 0, 600, 400);         panelBlue.setBackground(Color.BLUE);         panelBlue.setBounds(0, 0, 600, 400);         panelBlue.setOpaque(true);         panelGreen.setBackground(Color.GREEN);         panelGreen.setBounds(200, 100, 100, 100);         panelGreen.setOpaque(true);         lpane.add(panelBlue, new Integer(0), 0);         lpane.add(panelGreen, new Integer(1), 0);         frame.pack();         frame.setVisible(true);     }       /**      * @param args the command line arguments      */     public static void main(String[] args) {         new Main();     }  } 

You use setBounds to position the panels inside the layered pane and also to set their sizes.

Edit to reflect changes to original post You will need to add component listeners that detect when the parent container is being resized and then dynamically change the bounds of panel A and B.

like image 196
willcodejavaforfood Avatar answered Sep 20 '22 15:09

willcodejavaforfood