制作JPanel并在里面添加多个JPanel

时间:2013-06-13 07:57:22

标签: java swing awt jpanel layout-manager

我需要建立一个类似这个图像的屏幕。我有一个主面板,在该面板中我需要添加多个列2个垂直列和3个水平列。这列是Jpanels。我尝试使用GridLayout,但我没有成功。

enter image description here

2 个答案:

答案 0 :(得分:4)

单个布局管理器可以完成您想要的所有操作。您希望在可能/需要的地方开始使用复合布局管理器。

此示例同时使用GridLayoutGridBagLayout

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class BadLayout21 {

    public static void main(String[] args) {
        new BadLayout21();
    }

    public BadLayout21() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {

            setBorder(new EmptyBorder(10, 10, 10, 10));

            setLayout(new GridBagLayout());

            JPanel leftPane = new JPanel(new GridLayout(2, 0, 0, 4));
            leftPane.add(createPane(Color.RED));
            leftPane.add(createPane(Color.RED));

            JPanel leftMiddlePanel = createPane(Color.BLUE);
            JPanel rightMiddlePanel = createPane(Color.BLUE);

            JPanel rightPane = new JPanel(new GridLayout(2, 0, 0, 4));
            rightPane.add(createPane(Color.GREEN));
            rightPane.add(createPane(Color.GREEN));

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.NORTH;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weightx = 1;
            gbc.insets = new Insets(20, 20, 0, 0);
            add(leftPane, gbc);

            gbc.gridx = 3;
            gbc.anchor = GridBagConstraints.NORTH;
            gbc.insets = new Insets(20, 0, 0, 20);
            add(rightPane, gbc);

            gbc.weightx = 0;
            gbc.gridx = 1;
            gbc.weighty = 1;
            gbc.fill = GridBagConstraints.VERTICAL;
            gbc.anchor = GridBagConstraints.NORTH;
            gbc.insets = new Insets(0, 0, 0, 10);
            add(leftMiddlePanel, gbc);

            gbc.gridx = 2;
            gbc.insets = new Insets(0, 10, 0, 0);
            add(rightMiddlePanel, gbc);

        }

        protected JPanel createPane(Color color) {
            JPanel panel = new JPanel();
            panel.setPreferredSize(new Dimension(25, 25));
            panel.setBackground(color);
            return panel;
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }
}

答案 1 :(得分:1)

我认为将所有面板直接放在一个大面板中会很困难。可以有多种解决方案。就像将主面板分成四个单独(垂直)面板一样,并将最终面板添加到这四个子面板中。或者像怪物一样,从边框布局开始,首先创建一个左子面板,中心子面板和右子面板,每个面板都有自己的布局管理器。在这些子面板中,您可以放置​​最终面板。

虽然目前我的确切目的或目标有点模糊,但我希望你能用我的建议。