哪个布局管理器可以用Java进行这种布局?

时间:2013-02-08 19:34:29

标签: java swing grid-layout

我想在java中创建这个布局:

enter image description here

BorderLayout很容易实现NORTH和SOUTH标签。但其余的应该进入CENTER位置。所以我试图将CENTER划分为左右网格,并将左网格划分为3个不同的网格,但它们不会停留在我想要的位置,看起来也很复杂。也许有一种更简单的方法。

有没有人有任何想法?

3 个答案:

答案 0 :(得分:3)

为了解决这个问题,我所做的是这样的:

 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.

以下是代码,它为指定的输出执行上述任务:

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);
    }
}

以下是相同的输出:

NESTED LAYOUT

答案 1 :(得分:2)

BorderLayout为您的外部布局。

NORTHSOUTH是您各自的标签。

应为{p> EASTCENTER分配一个嵌套Panel,您可以为其分配BoxLayout,或单列GridLayout,或另一个BorderLayout 1}}(使用NORTHCENTERSOUTH)放置3 JTextAreas

WEST(或CENTER如果前一步骤中使用EAST)可以使用另一个嵌套Panel完成,分配GridBagLayout或{ {1}}。

查看更多信息here

答案 2 :(得分:1)

因为你需要这个想法,这里是:

  • 左右创造两个panal。

      左侧面板上的
    • 使用BorderLayout.NORTH
    • 添加JTF 左侧面板上的
    • 使用BorderLayout.CENTER
    • 添加JTA 左侧面板上的
    • 使用FlowLayout添加单选按钮

    • 右侧面板上的
    • 使用BorderLayout.NORTH添加JTA1

    • 右侧面板上的
    • 使用BorderLayout.CENTER
    • 添加JTA2 右侧面板上的
    • 添加JTA3 BorderLayout.BOTTOM