从上到下堆叠摆动元素

时间:2012-03-12 21:03:02

标签: java swing user-interface layout-manager

考虑下图:

Required Design

我需要开发一个类似于此的swing GUI。我简单地将它们命名为jLabel,但其中有一些图像和jLabel。可见的默认awt背景是JPanel,每个可见的红色背景是一个serperate JPanel。现在我需要它们如上图所示堆叠。我尝试了一些LayoutManagers,但它仍无效。

这里重点是红色div的数量不是恒定的。如果只有一个红色的div,那么它必须显示在顶部,而不是在中心。据我所知GridBagLayout应该可以工作,但它可以使用单个红色jpanel。所有布局管理器都将它们居中,但不是从上到下堆叠它们。

5 个答案:

答案 0 :(得分:3)

即使将锚点设置为NORTH,面板仍将居中。您可以通过添加虚拟面板来填充剩余空间来解决它。就个人而言,我会远离GridBagLayout。

JFrame frame = new JFrame();
JPanel content = new JPanel();
content.setBorder(BorderFactory.createLineBorder(Color.red));
frame.setContentPane(content);
frame.getContentPane().setLayout(new GridBagLayout());
frame.setSize(400, 300);

for (int i = 0; i < 3; i++) {
    JPanel panel = new JPanel();
    panel.add(new JLabel("label1"));
    panel.add(new JLabel("label2"));
    panel.add(new JLabel("label3"));
    panel.setBorder(BorderFactory.createLineBorder(Color.red));
    GridBagConstraints con = new GridBagConstraints();
    con.gridy = i;
    con.gridx = 0;
    con.anchor = GridBagConstraints.NORTHWEST;
    con.ipady = 10;
    frame.getContentPane().add(panel, con);
}

// dummy panel to use up the space (force others to top)
frame.getContentPane().add(
        new JPanel(),
        new GridBagConstraints(0, 3, 1, 1, 1, 1,
                GridBagConstraints.NORTHWEST,
                GridBagConstraints.VERTICAL, new Insets(0, 0, 0, 0), 0,
                0));

frame.setVisible(true);

GroupLayout示例(我最喜欢的布局管理器)。

JFrame frame = new JFrame();
JPanel content = new JPanel();
frame.setContentPane(content);
frame.getContentPane().setLayout(
        new BoxLayout(content, BoxLayout.Y_AXIS));
frame.setSize(400, 300);
GroupLayout gLayout = new GroupLayout(content);
content.setLayout(gLayout);
ParallelGroup hGroup = gLayout.createParallelGroup();
gLayout.setHorizontalGroup(hGroup);
SequentialGroup vGroup = gLayout.createSequentialGroup();
gLayout.setVerticalGroup(vGroup);
for (int i = 0; i < 3; i++) {
    JPanel panel = new JPanel();
    panel.add(new JLabel("label1"));
    panel.add(new JLabel("label2"));
    panel.add(new JLabel("label3"));
    panel.setBorder(BorderFactory.createLineBorder(Color.red));
    hGroup.addComponent(panel);
    vGroup.addComponent(panel, GroupLayout.PREFERRED_SIZE,
            GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE);
    vGroup.addGap(10);
}

frame.setVisible(true);

答案 1 :(得分:2)

答案 2 :(得分:2)

没有人告诉我们所有JComponents必须是可见的,例如

enter image description here

enter image description here

enter image description here

来自代码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class AddComponentsAtRuntime {

    private JFrame f;
    private JPanel panel;
    private JCheckBox checkValidate, checkReValidate, checkRepaint, checkPack;

    public AddComponentsAtRuntime() {
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel = new JPanel(new GridLayout(0, 1));
        f.add(panel, "Center");
        f.add(getCheckBoxPanel(), "South");
        f.setLocation(200, 200);
        f.pack();
        f.setVisible(true);
    }

    private JPanel getCheckBoxPanel() {
        checkValidate = new JCheckBox("validate");
        checkValidate.setSelected(false);
        checkReValidate = new JCheckBox("revalidate");
        checkReValidate.setSelected(false);
        checkRepaint = new JCheckBox("repaint");
        checkRepaint.setSelected(false);
        checkPack = new JCheckBox("pack");
        checkPack.setSelected(false);
        JButton addComp = new JButton("Add New One");
        addComp.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JPanel b = new JPanel(new GridLayout(0, 4));
                b.setBackground(Color.red);
                b.setBorder(new LineBorder(Color.black, 2));
                //b.setPreferredSize(new Dimension(600, 20));
                for (int i = 0; i < 4; i++) {
                    JLabel l = new JLabel("label" + i + 1);
                    b.add(l);
                    if (i == 2) {
                        l.setVisible(false);
                    }
                }
                panel.add(b);
                makeChange();
                System.out.println(" Components Count after Adds :" + panel.getComponentCount());
            }
        });
        JButton removeComp = new JButton("Remove One");
        removeComp.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                int count = panel.getComponentCount();
                if (count > 0) {
                    panel.remove(0);
                }
                makeChange();
                System.out.println(" Components Count after Removes :" + panel.getComponentCount());
            }
        });
        JPanel panel2 = new JPanel();
        panel2.add(checkValidate);
        panel2.add(checkReValidate);
        panel2.add(checkRepaint);
        panel2.add(checkPack);
        checkPack.setSelected(true);
        panel2.add(addComp);
        panel2.add(removeComp);
        return panel2;
    }

    private void makeChange() {
        if (checkValidate.isSelected()) {
            panel.validate();
        }
        if (checkReValidate.isSelected()) {
            panel.revalidate();
        }
        if (checkRepaint.isSelected()) {
            panel.repaint();
        }
        if (checkPack.isSelected()) {
            f.pack();
        }
    }

    public static void main(String[] args) {
        AddComponentsAtRuntime makingChanges = new AddComponentsAtRuntime();
    }
}

答案 3 :(得分:1)

您应该尝试使用MigLayout,它既简单又强大。下面我告诉miglayout增长元素,并填充所有可能的空间,然后在每个元素之后我告诉它去一个新的行(换行)。您可以在MigLayout页面http://www.miglayout.com/上找到示例和教程:

import net.miginfocom.swing.MigLayout;

public class PanelLearning extends JPanel {

public PanelLearning() {
    setLayout(new MigLayout("", "[grow, fill]", ""));

    for (int i = 0; i < 3; i++) {
        JPanel panel = new JPanel();
        panel.add(new JLabel("label1"));
        panel.add(new JLabel("label2"));
        panel.add(new JLabel("label3"));
        panel.setBorder(BorderFactory.createLineBorder(Color.red));
        add(panel, "span, wrap");
    }
}

public static void main(String[] args) {
    JFrame frame = new JFrame("Login");
    frame.setVisible(true);

    frame.setContentPane(new PanelLearning());

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.pack();
}
}

答案 4 :(得分:0)

向面板添加组件时,请确保GridBagConstraints.anchor = GridBagConstraints.NORTH