Java 为什么swing布局管理器自下而上工作?

Java 为什么swing布局管理器自下而上工作?,java,swing,layout,Java,Swing,Layout,在这方面,我们可以阅读: 最终的结果是,为了确定容器的最佳尺寸,系统在容器层次结构的底部确定容器的尺寸。这些尺寸然后渗透到容器层次结构,最终确定容器的总尺寸 此注释与特定布局管理器无关,但似乎适用于通用布局机制 如果一位经验丰富的Java/Swing程序员能够解释为什么这种方法比自顶向下的方法更好,我将不胜感激 在自顶向下的方法中,顶级容器将告诉其组件: -嘿,你们有WxH像素来自己布局! -然后这些组件最终会告诉它们自己的组件也这样做。根据可用空间,每个组件将决定如何将其子组件向下布置到层次结

在这方面,我们可以阅读:

最终的结果是,为了确定容器的最佳尺寸,系统在容器层次结构的底部确定容器的尺寸。这些尺寸然后渗透到容器层次结构,最终确定容器的总尺寸

此注释与特定布局管理器无关,但似乎适用于通用布局机制

如果一位经验丰富的Java/Swing程序员能够解释为什么这种方法比自顶向下的方法更好,我将不胜感激

在自顶向下的方法中,顶级容器将告诉其组件: -嘿,你们有WxH像素来自己布局! -然后这些组件最终会告诉它们自己的组件也这样做。根据可用空间,每个组件将决定如何将其子组件向下布置到层次结构中。最终,一些组件可能会决定不自行喷漆,以防空间不足

在我看来,这种方法(对于编程人员)更容易理解和维护

有人知道自上而下工作的替代布局管理器吗


谢谢

布局管理器这样工作的原因是,它们必须计算出所管理的容器及其子容器的大小。做到这一点的最好方法是尽可能深入,通过再次向上(自下而上)开始计算它的大小。如果一个容器有其他容器作为子容器,则递归执行此操作

例如:

  • 我们有一个JPanel j1
  • 在j1中有一个JButton
  • j1位于另一个面板j2内

现在计算j2大小的最佳方法是一直到jbutton。它计算出JButton的大小,比如说50 x 50像素。这意味着j1的大小是50 x 50加上它包含的任何子级。假设结果是200x200。在本例中,j2知道它的子对象是200 x 200,并将其大小计算在内。最后,它的大小(对于j2)达到了500 x 500。

布局管理器之所以这样工作,是因为他们必须计算出所管理的容器及其子容器的大小。做到这一点的最好方法是尽可能深入,通过再次向上(自下而上)开始计算它的大小。如果一个容器有其他容器作为子容器,则递归执行此操作

例如:

  • 我们有一个JPanel j1
  • 在j1中有一个JButton
  • j1位于另一个面板j2内

现在计算j2大小的最佳方法是一直到jbutton。它计算出JButton的大小,比如说50 x 50像素。这意味着j1的大小是50 x 50加上它包含的任何子级。假设结果是200x200。在本例中,j2知道它的子对象是200 x 200,并将其大小计算在内。最后它的大小(对于j2)达到了500 x 500。

我想你应该重新阅读这段引用

最终结果是,为了确定容器的最佳大小,系统将确定容器层次结构底部的容器大小。这些尺寸随后渗透到容器层次结构中,最终确定容器的总尺寸

这是关于容器的最佳尺寸。这当然取决于所有子组件的最佳大小,因此最好从下到上进行计算

这就是在
JFrame
上调用
pack
方法时发生的情况


但是,确实,最终子组件只能占用其父组件所允许的空间。这就是
LayoutManager
发挥作用的地方:您在父级上设置布局管理器,它将告诉子级它们的位置和大小(通常考虑子组件指示的首选大小)

我认为您应该重新阅读该引用

最终结果是,为了确定容器的最佳大小,系统将确定容器层次结构底部的容器大小。这些尺寸随后渗透到容器层次结构中,最终确定容器的总尺寸

这是关于容器的最佳尺寸。这当然取决于所有子组件的最佳大小,因此最好从下到上进行计算

这就是在
JFrame
上调用
pack
方法时发生的情况


但是,确实,最终子组件只能占用其父组件所允许的空间。这就是
LayoutManager
发挥作用的地方:您在父级上设置布局管理器,它将告诉子级它们的位置和大小(通常考虑子组件指示的首选大小)

我不一定觉得它们中的任何一个都比另一个好。但最后他们不得不选择一个。版面管理员可以自下而上工作,生成“首选尺寸”,但大多数人也可以自上而下工作,处理固定尺寸的容器(考虑手动调整框架大小时会发生什么)。我不一定觉得其中任何一个都比另一个好。但在一天结束时,他们不得不选择一个。版面管理员可以自下而上工作,生成“首选大小”,但大多数也可以自上而下工作,处理固定大小的容器(考虑手动调整框架大小时会发生什么)。好的,但在层次结构的顶部,我们有一个框架(窗口),其大小(通常)由用户决定。这应该是布局过程的起点,而不是容器的内容。@Davy_Crockett不太清楚。如您所知,如果您做得正确,那么在层次结构顶部的窗口中,您可以调用类似于
frame.pack
的内容。这样,布局管理