Java 对齐不同DesignGridLayout的标签列

Java 对齐不同DesignGridLayout的标签列,java,swing,layout-manager,Java,Swing,Layout Manager,考虑使用两个JPanel实例,如下所示: JFrame demoApplicationFrame = new JFrame(); JPanel singleDesignGridLayout1 = new JPanel(); DesignGridLayout layout1 = new DesignGridLayout(singleDesignGridLayout1); layout1.row().grid(new JLabel("Short lbl1")).add(new JTextField(

考虑使用两个
JPanel
实例,如下所示:

JFrame demoApplicationFrame = new JFrame();
JPanel singleDesignGridLayout1 = new JPanel();
DesignGridLayout layout1 = new DesignGridLayout(singleDesignGridLayout1);
layout1.row().grid(new JLabel("Short lbl1")).add(new JTextField(""));
layout1.row().grid(new JLabel("Short lbl2")).add(new JTextField(""));

JPanel singleDesignGridLayout2 = new JPanel();
DesignGridLayout layout2 = new DesignGridLayout(singleDesignGridLayout2);
layout2.row().grid(new JLabel("A bit longer label"))
    .add(new JTextField(""));
layout2.row().grid(new JLabel("Another long label here"))
    .add(new JTextField(""));

demoApplicationFrame.getContentPane().add(singleDesignGridLayout1,
     BorderLayout.NORTH);
demoApplicationFrame.getContentPane().add(singleDesignGridLayout2,
    BorderLayout.SOUTH);
执行该代码将创建此窗口:

是否可以对齐两个面板标签的列

是否可以对齐两个面板标签的列

不,这不是因为在同一容器中使用网格。因此,如果组件放置在不同的面板中,则
DesignGridLayout
无法确保跨面板组件对齐

在这种情况下,您只能寻找变通方法(如果有的话)。要意识到这一点:是的,我们应该这样做。因此,设置固定标签大小也不是一个选项


一些想法 我在考虑这个问题,这不是一个
DesignGridLayout
限制,而是关于布局管理器的工作方式。如果您查看本课的第节,它会说明:

  • 布局管理器主要做两件事:

    • 计算容器的最小/首选/最大尺寸
    • 把容器的孩子们放好
  • 布局管理器根据提供的约束执行此操作 容器的属性(如插图)和子容器上的 最小/首选/最大尺寸。如果孩子本身就是一个容器,那么 它自己的布局管理器用于获取其最小值/首选值/最大值 尺寸和布局

    这意味着,如果一个子组件本身是一个容器,那么它可能有自己的布局管理器来布局自己的子组件。此属性使此容器独立于其祖先(关于布局组件)。如果您有一个“全局”(仅以某种方式命名)布局管理器,它在两个独立的容器中对齐组件,那么它将打破上述约定,因为子容器不会独立于它们的祖先

    我对布局管理器这类东西比较陌生,但我不知道有哪一个布局管理器可以让你做你需要的(或者你觉得你需要的),因为实际上他们不必这样做。如果您真的需要所有这些面板,或者您可以在单个容器中管理所有组件,那么您应该重新考虑。以下列表中可能有更适合您需要的布局管理器:

    • (这不是我最喜欢的,但可能有用)

    有一种不好的方法。可以将所有标签的宽度设置为相等(=标签宽度的最大值)。或者定义相对较大的iPadx是否需要两个面板?您可以使用DesignGridLayout将所有标签和文本字段添加到单个面板中。通过这种方式,我相信您可以看到正确的对齐。@Ehsan:我需要不同的面板,原因有二。1) 它们是由不同的函数动态生成的。当然,我可以返回一个标签组件对列表,但是如果一行包含多个组件呢?2) 我需要在两者之间放置另一个面板,其内容完全不同。您可以使用两个函数将内容添加到相同的DesignGridLayout,而不是在两个不同的函数中生成两个面板(当我需要类似布局的可重用性时,我就是这样做的。我已经向开发人员提交了一份报告,让我们看看他们的意见!添加到书签以保持更新:D@paolofulgonii如果你认为这个功能可能有用,我想你可以在他们的问题跟踪系统上投票(你必须创建一个帐户)Yes@dic19您是对的:任何布局管理器都不可能处理交叉面板约束,这是出于设计。我过去曾试图找到一些解决方法,但没有效果:-(正如您所建议的,一个解决方法是确保所有标签具有相同的首选宽度(即所有标签的最大首选宽度)。真正的问题是要检查你是否真的需要这两个面板,一个在另一个下面。到目前为止,我还没有发现需要这两个面板的情况,但这并不意味着这不可能存在。