Java 使用GridBagLayout使JPanel看起来相同

Java 使用GridBagLayout使JPanel看起来相同,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,我有多个JPanel,所有这些都基于三列宽的假设。和一列或多列高。目前我正在为他们使用GridBagLayout 我计划在另一个JPanel中将它们添加到彼此下面。现在的问题是,这些列没有对齐 在保持单个JPanel彼此独立的同时,我能做些什么吗?而不会退回到更固定的布局。 我可以给JPanel提供父容器,并向其中添加元素,同时保持JPanel本身为空(当不处于“独立模式”时)。但我认为这种做法令人厌恶 谢谢你的帮助 编辑: 我的布局类如下所示: public class Layout exte

我有多个JPanel,所有这些都基于三列宽的假设。和一列或多列高。目前我正在为他们使用GridBagLayout

我计划在另一个JPanel中将它们添加到彼此下面。现在的问题是,这些列没有对齐

在保持单个JPanel彼此独立的同时,我能做些什么吗?而不会退回到更固定的布局。 我可以给JPanel提供父容器,并向其中添加元素,同时保持JPanel本身为空(当不处于“独立模式”时)。但我认为这种做法令人厌恶

谢谢你的帮助

编辑: 我的布局类如下所示:

public class Layout extends GridBagLayout {
    public void collocate_line(List<? extends JComponent> compos, final Container container) {
        int currentCol = 0;

        for (final JComponent compo: compos) {
            final GridBagConstraints gbc = new GridBagConstraints(
                    currentCol, this.currentLine, GRID_WIDTH, GRID_HEIGHT,
                    DEFAULT_WEIGHT_X, DEFAULT_WEIGHT_Y, GridBagConstraints.CENTER,
                    GridBagConstraints.BOTH, DEFAULT_INSETS, 0, 0);
            container.add(compo, gbc);
            currentCol++;
        }

        currentLine++;
    }
}
public class ScopePanel extends JPanel implements ActionListener {
    private final ChooseClassPath classPath;
    private final ChooseStubsJava stubsJava;

    public ScopePanel(final IPreparedCommands exec, final ResourceBundle messages) {
        super();

        final Layout gbl = new Layout();
        this.setLayout(gbl);

        this.classPath = new ChooseClassPath(exec, messages, gbl);
        this.add(this.classPath, GUIUtil.mkgbc_fillx(0, 0, GridBagConstraints.REMAINDER, 1));

        this.stubsJava = new ChooseStubsJava(exec, messages, gbl);
        this.add(this.stubsJava, GUIUtil.mkgbc_fillx(0, 2, GridBagConstraints.REMAINDER, 1));
    }
}
元素如下所示:

public class ChooseClassPath extends JPanel {
    public ChooseClassPath(final IPreparedCommands exec, final ResourceBundle messages) {
        this(exec, messages, new Layout());
    }

    public ChooseClassPath(final IPreparedCommands exec, final ResourceBundle messages, final Layout layout) {
        super();

        { // Line 1
            final List<JComponent> line = new ArrayList<JComponent>();

            final JLabel label = new JLabel(messages.getString("label_classpath"));
            line.add(label);

            //...  
            layout.collocate_line(line, this);
        }
    }
}
public类ChooseClassPath扩展了JPanel{
public ChooseClassPath(最终IPreparedCommands exec,最终ResourceBundle消息){
这(exec,messages,newlayout());
}
public ChooseClassPath(最终IPreparedCommands exec、最终ResourceBundle消息、最终布局){
超级();
{//第1行
最终列表行=新的ArrayList();
final JLabel=newjlabel(messages.getString(“label_classpath”);
行。添加(标签);
//...  
布局。并置_线(线,此);
}
}
}
结果是:

确保通过与所有JPanel相同的GirdBagConstraints属性集。
esp属性,如gridwidth、fill、weightx等。此外,JPanel中的内容(如果每个JPanel实例的内容不同)可能会影响网格的单个大小。请考虑使用GrdDead,仅当GridLayout或其他更简单的布局无法满足您的需求时,进入GRIDBAG布局。

您可以发布您的代码吗?您可以做一些事情,但有点混乱。您可以将所有组件放在同一个容器中,或者尝试miglayout,我知道它可以做到这一点(我自己没有使用过)