Java 布局管理器,用于垂直和水平排列大小可变的组件

Java 布局管理器,用于垂直和水平排列大小可变的组件,java,swing,user-interface,layout,jpanel,Java,Swing,User Interface,Layout,Jpanel,我正在尝试创建一个相当基本的面板,用于在数据库中添加/编辑用户。为了实现这一点,我想在左侧为不同的字段设置一些标签,并在右侧为该字段设置相应的控件。(因此,左侧可能会显示“用户名”、“用户类型”、“到期日期”等,而相关的右侧则会有一个文本面板、一个下拉列表和一个日历小部件。) 我遇到的问题是,我希望它们水平排列(标签及其关联的“控制区域”应在同一条线上开始),垂直排列(所有标签应在同一条垂直线上开始,所有控制区域应在同一条垂直线上开始)。一些控制区域比其他控制区域大或小,尽管;许多只包含一个文本

我正在尝试创建一个相当基本的面板,用于在数据库中添加/编辑用户。为了实现这一点,我想在左侧为不同的字段设置一些标签,并在右侧为该字段设置相应的控件。(因此,左侧可能会显示“用户名”、“用户类型”、“到期日期”等,而相关的右侧则会有一个文本面板、一个下拉列表和一个日历小部件。)

我遇到的问题是,我希望它们水平排列(标签及其关联的“控制区域”应在同一条线上开始),垂直排列(所有标签应在同一条垂直线上开始,所有控制区域应在同一条垂直线上开始)。一些控制区域比其他控制区域大或小,尽管;许多只包含一个文本面板,而其他的则有单选按钮、日历小部件等与之关联的东西

此外,所需字段的类型经常更改,并且根据上下文(例如,是创建新用户还是编辑旧用户,以及控制用户的权限级别),可能会排除其中一些字段。所以,我想要的东西,将在很大程度上安排自己-如果我必须设置位置非常手动,我希望事情会打破部分被排除

我想看到的是一个布局管理器,它基本上可以让我在一个灵活的网格上设置坐标,然后自动调整网格大小,为每个元素提供最小的空间,同时保持网格线笔直。这样,我就可以简单地保留控件及其关联标签的列表,并以编程方式构建面板,以便始终将标签/控件分配给相同的行

不过,我还没有弄明白如何使用任何布局管理器来实现这一点:
GridLayout
似乎要求所有内容的大小都相同,
BoxLayout
希望垂直或水平排列,但不能同时排列两者。因此,我不断发现要么我的行排列整齐,但没有垂直对齐,要么错误的标签与错误的控件对齐


有什么建议吗?

GridBagLayout
是实现这一点的最简单方法。它不是最直观的布局管理器:添加时需要为每个组件指定“约束”。有很多方法可以指定相对于上一个组件的位置,但我倾向于使用显式的
gridx
gridy
值,以确保您确切地知道事情的发展方向。您可以使用一个方法添加标签和组件并移动到下一行,以便包含此逻辑:

private final JPanel pane = new JPanel(new GridBagLayout());
private final GridBagConstraints c = new GridBagConstraints();

private void addLabelledComponent(String label, Component component) {
    c.gridx = 0;
    pane.add(new JLabel(label), c);
    c.gridx = 1;
    pane.add(component, c);
    c.gridy++;
}

有关定义对齐、填充、跨行和跨列等更多详细信息,请参阅。

GridBagLayout
是实现这一点的最简单方法。它不是最直观的布局管理器:添加时需要为每个组件指定“约束”。有很多方法可以指定相对于上一个组件的位置,但我倾向于使用显式的
gridx
gridy
值,以确保您确切地知道事情的发展方向。您可以使用一个方法添加标签和组件并移动到下一行,以便包含此逻辑:

private final JPanel pane = new JPanel(new GridBagLayout());
private final GridBagConstraints c = new GridBagConstraints();

private void addLabelledComponent(String label, Component component) {
    c.gridx = 0;
    pane.add(new JLabel(label), c);
    c.gridx = 1;
    pane.add(component, c);
    c.gridy++;
}

有关定义对齐、填充、跨行和跨列等更多详细信息,请参见。

这里有一个示例,如您所见,有两个正常大小的行,一个中等大小的行和一个较大(较高)的行,顺序不同,我想这与您想要做的类似

行的高度由
GridBagConstraints
ipady
属性决定,您可以阅读和

我没有经常使用
GridBagLayout
,因此可能有一些东西可以跳过或改进,但就本例而言,下面是代码的输出:


我希望你现在有一个想法,如果你仍然有疑问,问另一个(更具体的)问题,包括你的

这里有一个例子,你可以看到,有两个正常大小的行,一个中等大小的行和一个较大(较高)的行,顺序不同,我认为这与你想要做的类似

行的高度由
GridBagConstraints
ipady
属性决定,您可以阅读和

我没有经常使用
GridBagLayout
,因此可能有一些东西可以跳过或改进,但就本例而言,下面是代码的输出:


我希望您现在已经有了这样的想法,如果您仍然有疑问,请提出另一个(更具体的)问题,包括您的

听起来您可能想要一个或使用多个,我假设对于使用多个,我假设您的意思是使用嵌套面板来获得功能的不同部分,对吗?但是,我如何使一个经理下的组件与另一个经理下的组件对齐?是的,你是对的。你能发布你想要的图片或ASCII艺术吗?通过图片或其他东西更容易理解和给出建议:)@Frakcool我的ASCII艺术技能非常糟糕,但我能够找到,这与我的想象非常接近。。。但那一排只有一排,而这一排可能有好几排,因此,让标签保持对齐是非常重要的。我建议使用seen这样的东西,它使用
GroupLayout
——但是请注意,使用@Frakcool建议的
GridBagLayout
创建同样的东西会更容易。听起来您可能需要一个或多个标签。我假设使用多个标签,我想你的意思是用嵌套面板来获得功能的不同部分,对吗?但是,我如何使一个经理下的组件与另一个经理下的组件对齐?是的,你是对的。你能发布你想要的图片或ASCII艺术吗?更容易找到