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.
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With