-1

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

在此处输入图像描述

4

2 回答 2

4

一个布局管理器很少会做你想做的一切。您想在可以/需要的地方开始使用复合布局管理器。

此示例同时使用 aGridLayout和 aGridBagLayout

在此处输入图像描述

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);
        }
    }
}
于 2013-06-13T08:09:46.150 回答
1

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

虽然现在对我来说确切的目的或目标有点模糊,但我希望你能使用我的建议。

于 2013-06-13T08:12:50.533 回答