charmae
charmae

Reputation: 1080

Java swing layout

Im having a hard time identifying what layout to be used. help any suggestions.

enter image description here

JPanel mainpanel = new JPanel();

public void addPanel(JPanel panel){
    mainpanel.add(panel);
}

addPanel(A);
addPanel(B);
addPanel(C);
addPanel(D);
addPanel(E);
....

Panels A,B,C,D... are not of fixed sized.

How can I make this possible?

Upvotes: 5

Views: 2894

Answers (5)

Jakub Zaverka
Jakub Zaverka

Reputation: 8874

Depends on what the behaviour should be when the window is resized. But you won't avoid building a tree structure with JPanels.

The top component can have BorderLayout, with one panel in the North and main panel in Center.
The North panel will have X-axis BoxLayout and contain two panels.
Both these panels should have Y-axis BoxLayout and the first one will contain A, C, F and the second one B, D, E.

You should also set preferred sizes for A B C D E and F so that they render with appropriate size.

EDIT:
Here, I created an example:

public class GladysPanel extends JPanel
{
    public GladysPanel(JComponent A, JComponent B, JComponent C, JComponent D, JComponent E, JComponent F, JComponent main){
        super(new BorderLayout());
            JPanel abcdef = new JPanel(new BorderLayout());
                Box ab = new Box(BoxLayout.X_AXIS);
                ab.add(A);
                ab.add(B);
            abcdef.add(ab, BorderLayout.NORTH);
                Box cdef = new Box(BoxLayout.X_AXIS);
                    Box cf = new Box(BoxLayout.Y_AXIS);
                    cf.add(C);
                    cf.add(F);
                    cf.add(Box.createVerticalGlue());
                    Box de = new Box(BoxLayout.Y_AXIS);
                    de.add(D);
                    de.add(E);
                    de.add(Box.createVerticalGlue());
                cdef.add(cf, BorderLayout.WEST);
                cdef.add(de, BorderLayout.EAST);
            abcdef.add(cdef);
        add(abcdef, BorderLayout.NORTH);
        add(main);
    }

    public static void main(String[] args){
        JPanel A = new JPanel();
        A.setOpaque(true);
        A.setBackground(Color.BLUE);
        A.add(new JLabel("A"));
        JPanel B = new JPanel();
        B.setOpaque(true);
        B.setBackground(Color.LIGHT_GRAY);
        B.add(new JLabel("B"));
        JPanel C = new JPanel();
        C.setPreferredSize(new Dimension(0, 100));
        C.setOpaque(true);
        C.setBackground(Color.RED);
        C.add(new JLabel("C"));
        JPanel D = new JPanel();
        D.setOpaque(true);
        D.setBackground(Color.PINK);
        D.add(new JLabel("D"));
        JPanel E = new JPanel();
        E.setOpaque(true);
        E.setBackground(Color.YELLOW);
        E.add(new JLabel("E"));
        E.setPreferredSize(new Dimension(0, 60));
        JPanel F = new JPanel();
        F.setOpaque(true);
        F.setBackground(Color.MAGENTA);
        F.add(new JLabel("F"));
        JPanel main = new JPanel();
        main.setOpaque(true);
        main.setBackground(Color.WHITE);
        main.add(new JLabel("main"));

        GladysPanel panel = new GladysPanel(A, B, C, D, E, F, main);
        JFrame example = new JFrame("Gladys example");
        example.setContentPane(panel);
        example.setSize(300, 300);
        example.setVisible(true);
    }
}

you can omit the setPreferredSize(), I added it only to demonstate behaviour. You can also try to resize the window. The code is much much shorter that when using GridBagLayout.

Upvotes: 1

alkber
alkber

Reputation: 1436

Consider using JGoodies Forms layout. it is highly flexible and easy to use. Any sort of layouting of widgets are possible, vertical stacking , horizontal stacking etc.

http://www.jgoodies.com/freeware/forms/index.html

enter image description here

                   /* B1   Space  B2    Space B3    Space  B4 */
     String col1 = "10dlu, 3dlu, 10dlu, 3dlu 10dlu, 3dlu, 10ldu";
                   /*Width of button */ 
     String row1 = "5dlu";

     FormLayout layout = new FormLayout( col1, row1);

     JPanel panel = new JPanel(layout); 

     panel.setBorder(Borders.DIALOG_BORDER);

     CellConstraints cc = new CellConstraints();

     /* X - stands for column position :: Y - stand for row */  
     panel.add(new JButton("B1"), cc.xy(1, 1));

     panel.add(new JButton("B2"), cc.xy(2, 1));
     .
     .
     . 
     there is one more cc.xyh(1,1,2) where 'h' stands for vertical span or width.   

Yes, you read more about JGoodies forms layout, 'DLU' means dialog units, rather than me explaining all these, kindly visit JGoodies site, download the library and documentation. Trust be, this layout manager is much better, in terms of usability , maintainability and readability.

Upvotes: 3

nIcE cOw
nIcE cOw

Reputation: 24616

Seems like by using GridBagLayout, you can achieve this. Hopefully you can change the JPanel with MAGENTA colour as per your liking :-)

Here is the output :

GRIDBAG LAYOUT TEST

And here is the code :

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

 public class GridBagLayoutTest
 {


    //defining the constructor
    public GridBagLayoutTest() 
    {

        JFrame maFrame = new JFrame("The main screen"); //creating main Jframe
        maFrame.setLocationByPlatform(true); //centering frame

        JPanel headPanel = new JPanel(); //creating the header panel

        Container container = maFrame.getContentPane();
        container.setLayout(new GridBagLayout()); //setting layout of main frame
        GridBagConstraints cns = new GridBagConstraints(); //creating constraint
        cns.gridx = 0;
        cns.gridy = 0;
        //cns.gridwidth = 3;
        //cns.gridheight = 4;
        cns.weightx = 0.5;
        cns.weighty = 0.2;
        cns.anchor = GridBagConstraints.FIRST_LINE_START;
        cns.fill = GridBagConstraints.BOTH;        
        headPanel.setBackground(Color.BLUE);
        container.add(headPanel, cns);

        JPanel panel = new JPanel();
        panel.setBackground(Color.CYAN);
        cns = new GridBagConstraints();
        cns.gridx = 1;
        cns.gridy = 0;
        //cns.gridwidth = 7;
        //cns.gridheight = 4;
        cns.weightx = 0.5;
        cns.weighty = 0.2;
        cns.anchor = GridBagConstraints.FIRST_LINE_END;
        cns.fill = GridBagConstraints.BOTH;
        container.add(panel, cns);

        JPanel panel1 = new JPanel();
        panel1.setBackground(Color.RED);
        cns = new GridBagConstraints();
        cns.gridx = 0;
        cns.gridy = 1;
        //cns.gridwidth = 2;
        cns.gridheight = 2;
        cns.weightx = 0.5;
        cns.weighty = 0.3;
        cns.anchor = GridBagConstraints.LINE_START;
        cns.fill = GridBagConstraints.BOTH;
        container.add(panel1, cns);     

        JPanel panel2 = new JPanel();
        panel2.setBackground(Color.PINK);
        cns = new GridBagConstraints();
        cns.gridx = 1;
        cns.gridy = 1;
        //cns.gridwidth = 2;
        //cns.gridheight = 2;
        cns.weightx = 0.5;
        cns.weighty = 0.2;
        cns.anchor = GridBagConstraints.LINE_END;
        cns.fill = GridBagConstraints.BOTH;
        container.add(panel2, cns);                 

        JPanel panel4 = new JPanel();
        panel4.setBackground(Color.ORANGE);
        cns = new GridBagConstraints();
        cns.gridx = 1;
        cns.gridy = 2;
        //cns.gridwidth = 2;
        //cns.gridheight = 2;
        cns.weightx = 0.5;
        cns.weighty = 0.2;
        cns.anchor = GridBagConstraints.LINE_END;
        cns.fill = GridBagConstraints.BOTH;
        container.add(panel4, cns); 

        JPanel mainPanel = new JPanel();
        mainPanel.setBackground(Color.WHITE);
        mainPanel.setLayout(new GridBagLayout());
        cns = new GridBagConstraints();
        cns.gridx = 0;
        cns.gridy = 4;
        cns.gridwidth = 2;
        cns.gridheight = 2;
        cns.weightx = 1.0;
        cns.weighty = 0.3;
        cns.anchor = GridBagConstraints.LAST_LINE_START;
        cns.fill = GridBagConstraints.BOTH;
        container.add(mainPanel, cns); 

        JPanel panel3 = new JPanel();
        panel3.setBackground(Color.MAGENTA);
        cns = new GridBagConstraints();
        cns.gridx = 0;
        cns.gridy = 0;
        //cns.gridwidth = 2;
        //cns.gridheight = 2;
        cns.weightx = 0.5;
        cns.weighty = 0.2;
        cns.anchor = GridBagConstraints.FIRST_LINE_START;
        cns.fill = GridBagConstraints.BOTH;
        mainPanel.add(panel3, cns); 

        JPanel bottomPanel = new JPanel();
        bottomPanel.setBackground(Color.WHITE);
        cns = new GridBagConstraints();
        cns.gridx = 0;
        cns.gridy = 1;
        //cns.gridwidth = 2;
        //cns.gridheight = 2;
        cns.weightx = 1.0;
        cns.weighty = 0.2;
        cns.anchor = GridBagConstraints.LAST_LINE_START;
        cns.fill = GridBagConstraints.BOTH;
        mainPanel.add(bottomPanel, cns); 

        //JButton button = new JButton("BUTTON");
        //headPanel.add(button);

        maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //setting the default close operation of JFrame
        maFrame.pack();
        maFrame.setVisible(true); //making the frame visible
    }

    //defining the main method
    public static void main(String[] args) 
    {
        Runnable runnable = new Runnable()
        {
            public void run()
            {
                new GridBagLayoutTest(); //instantiating the class
            }
        };
        SwingUtilities.invokeLater(runnable);       
    }
}

Upvotes: 5

erogol
erogol

Reputation: 13614

Grid layout might be fit into this shape. Just look to the java swing documentation.

Upvotes: 2

Shawn Shroyer
Shawn Shroyer

Reputation: 923

I would say, create a temporary panel for ACF, then BDE, then create one to combine ACF and BDE, then add the last temp panel and your main panel onto the frame with BorderLayout NORTH and SOUTH

Upvotes: 2

Related Questions