2

I want to make this layout in java:

enter image description here

NORTH and SOUTH labels are easy to implement by BorderLayout. But The rest should be into the CENTER Location. So I tried to divide the CENTER into left and right grids, and divide the left grid into 3 different grids, but they dont stay where I want, also looks so complicated. Maybe there is an easier way.

Does anyone have any idea?

oliholz
  • 7,447
  • 2
  • 43
  • 82
Alex Jj
  • 1,343
  • 10
  • 19
  • 30

3 Answers3

3

To solve the situation, what I did is something like this :

 1. The content pane will have the BorderLayout, the top JLabel and
    the bottom JLabel will go to their respective places using the   
    BorderLayout's PAGE_START and PAGE_END constraints. Now the   
    CENTER area is occupied by the BasePanel.
 2. The BasePanel will have GridLayout (1 Rows, 2 Columns), with two
    JPanel, left and right.
 3. Here right JPanel will have a GridLayout (3 Rows, 1, Columns
    , 10 HorizontalGap, 10 VerticalGap).
 4. Left JPanel will have GridBagLayout with two JPanels one for
    GRID 0, 0 and other for GRID 0, 1.
 5. The JPanel at Grid 0, 0 will have GridBagLayout, for JTextField
    and the JLabel.
 6. The JPanel at Grid 0, 1 will have BorderLayout one for
    JTextArea and one for another JPanel with GridLayout having 
    2 JRadioButtons.

Here is the code, which performs the above tasks for a specified output :

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

/**
 * Created with IntelliJ IDEA.
 * User: Gagandeep Bali
 * Date: 2/10/13
 * Time: 1:23 PM
 * To change this template use File | Settings | File Templates.
 */
public class LayoutExample
{
    private JTextField tField;
    private JTextArea tArea1;
    private JTextArea tArea2;
    private JTextArea tArea3;
    private JTextArea tArea4;

    private JRadioButton leftRButton;
    private JRadioButton rightRButton;

    private GridBagConstraints gbc;

    private Random random;

    public LayoutExample()
    {
        gbc = new GridBagConstraints();
        random = new Random();
    }


    private void displayGUI()
    {
        JFrame frame = new JFrame("Nested Layout Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = getPanel();
        contentPane.setLayout(new BorderLayout(5, 5));
        JLabel topLabel = new JLabel(
                        "PAGE_START Label", JLabel.CENTER);
        contentPane.add(topLabel, BorderLayout.PAGE_START);

        JPanel basePanel = getPanel();
        basePanel.setLayout(new GridLayout(1, 2));

        JPanel leftPanel = getPanel();
        leftPanel.setLayout(new GridBagLayout());
        leftPanel.setBorder(
                BorderFactory.createEmptyBorder(
                        10, 10, 10, 10));
        JLabel fieldLabel = new JLabel("Label", JLabel.CENTER);
        tField = new JTextField(20);

        JPanel topPanel = getPanel();
        topPanel.setLayout(new GridBagLayout());
        topPanel.add(fieldLabel, getConstraints(
                            0, 0, 1, 1
                , GridBagConstraints.HORIZONTAL, 0.3f, 0.1f));
        topPanel.add(tField, getConstraints(
                            1, 0, 2, 1
                , GridBagConstraints.HORIZONTAL, 0.7f, 1.0f));
        leftPanel.add(topPanel, getConstraints(
                        0, 0, 1, 1
                        , GridBagConstraints.BOTH, 1.0f, 0.40f));

        JPanel middlePanel = getPanel();
        middlePanel.setLayout(new BorderLayout(5, 5));
        tArea1 = new JTextArea(10, 10);
        middlePanel.add(tArea1, BorderLayout.CENTER);
        JPanel radioPanel = getPanel();
        radioPanel.setLayout(new GridLayout(1, 2, 5, 5));
        leftRButton = new JRadioButton("Left", false);
        rightRButton = new JRadioButton("Right", false);
        radioPanel.add(leftRButton);
        radioPanel.add(rightRButton);
        middlePanel.add(radioPanel, BorderLayout.PAGE_END);
        leftPanel.add(middlePanel, getConstraints(
                               0, 1, 1, 2
                             , GridBagConstraints.BOTH, 1.0f, 0.60f));
        basePanel.add(leftPanel);

        JPanel rightPanel = getPanel();
        rightPanel.setLayout(new GridLayout(0, 1, 10, 10));
        rightPanel.setBorder(
                BorderFactory.createEmptyBorder(
                                    10, 10, 10, 10));
        tArea2 = new JTextArea(10, 10);
        tArea3 = new JTextArea(10, 10);
        tArea4 = new JTextArea(10, 10);
        rightPanel.add(tArea2);
        rightPanel.add(tArea3);
        rightPanel.add(tArea4);
        basePanel.add(rightPanel);
        contentPane.add(basePanel, BorderLayout.CENTER);

        JLabel bottomLabel = new JLabel(
                "PAGE_END Label", JLabel.CENTER);
        contentPane.add(bottomLabel, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel getPanel()
    {
        JPanel panel = new JPanel();
        panel.setOpaque(true);
        panel.setBackground(new Color(random.nextFloat()
                            , random.nextFloat(), random.nextFloat()
                                                , random.nextFloat()));
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        return panel;
    }

    private GridBagConstraints getConstraints(
                            int x, int y, int w, int h, int fillValue
                                        , float weightx, float weighty)
    {
        //GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.fill = fillValue;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = w;
        gbc.gridheight = h;
        gbc.weightx = weightx;
        gbc.weighty = weighty;

        return gbc;
    }

    public static void main(String... args)
    {
        Runnable runnable = new Runnable(){
                @Override
                public void run()
                {
                    new LayoutExample().displayGUI();
                }
        };
        EventQueue.invokeLater(runnable);
    }
}

Here is the output of the same :

NESTED LAYOUT

nIcE cOw
  • 24,468
  • 7
  • 50
  • 143
  • as always with nested containers, the problem is the proper alignment (f.i. the upper border of the textfield is not aligned with the upper corner of the right textarea and its right border is not aligned with the right corner of the textarea below) The time to fix those (over and over again) is better invested in learning a really good layoutManager which can handle complex layouts in one panel and then use it always. My 0.02 cents :-) – kleopatra Feb 10 '13 at 11:11
  • Removed some alignment issues with the `JTextField` and `JTextArea` thingy. Used `GridBagLayout` instead of using `FlowLayout`. – nIcE cOw Feb 10 '13 at 15:25
2

BorderLayout for your outer layout.

NORTH and SOUTH are your respective labels.

EAST or CENTER should be assigned a nested Panel, which you assign a BoxLayout, or a single-column GridLayout, or another BorderLayout (using NORTH, CENTER and SOUTH) where you put your 3 JTextAreas.

WEST (or CENTER if EAST was used in prior step) can be done with another nested Panel, assigned either a GridBagLayout or a GroupLayout.

See more information here.

JoshDM
  • 4,939
  • 7
  • 43
  • 72
1

as you need the idea, here it is:

  • create two panal left,right.

    • on left panel add JTF with BorderLayout.NORTH
    • on left panel add JTA with BorderLayout.CENTER
    • on left panel add radio button with FlowLayout

    • on right panel add JTA1 with BorderLayout.NORTH

    • on right panel add JTA2 with BorderLayout.CENTER
    • on right panel add JTA3 with BorderLayout.BOTTOM
Arpit
  • 12,767
  • 3
  • 27
  • 40
  • 2
    To add to this, take advantage of prefferedSizes so you can ensure they fit correctly. –  Feb 08 '13 at 19:45
  • @Legend _take advantage of preferredSizes_ - what does that mean? – kleopatra Feb 10 '13 at 11:04
  • I'm well aware of the api (btw: the doc you linked to is extremely dated) - but that doesn't answer the question in my comment: what do you **mean** by _take advantage of preferredSizes_ – kleopatra Feb 10 '13 at 12:37
  • @kleopatra i don't know about Legend but what i think is if i'm using any layout then i just use the preffSize to assures that my components are placed well even if they are tried to re sized.i use setSize when i need to set the size on the basis of programme input. – Arpit Feb 10 '13 at 14:18
  • that's about what I suspected - it's [wrong to setXXSize](http://stackoverflow.com/q/7229226/203657) – kleopatra Feb 10 '13 at 14:26
  • 1
    i already read this and removed the last line of my ans :) but it will take time to adopt this in practice. i never thought of it. – Arpit Feb 10 '13 at 14:36
  • use a suitable LayoutManager which allows the fine-grained control that you need - my current personal favorite is MigLayout, but any of the BigThree (Mig, JGoodies FormLayout, DesignGrid) is worth trying out. – kleopatra Feb 10 '13 at 14:44