从顶部到底部堆叠摆动元件

考虑下图:

所需设计

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

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

即使将锚设置为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); 

您可以使用Vertical BoxLayout,例如: http : //www.java-tips.org/java-se-tips/javax.swing/how-to-use-swing-boxlayout.html

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

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

来自代码

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

您应该尝试使用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(); } } 

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