为什么在 Swing 中使用空布局是不受欢迎的?

最近,我开始为我工作的公司创建一个程序。就像背景信息一样,我仍然是一名学生和初学者程序员,所以我的解决方案可能不推荐,我不知道该怎么做,但它有效,我不会因此被评判,因为这是一项与编程完全无关的学生工作。

关于该程序的事情是,它将在具有不同屏幕尺寸和分辨率(800x600及以上)的多台不同计算机上运行。为了确保它占用尽可能多的屏幕而不会丢失程序的任何部分,我将布局设置为null,并使用相对值对所有内容进行硬编码。

该程序是kiosk风格的,我首先获取屏幕尺寸值并从那里开始(例如,在我的头顶上,左侧菜单占据了屏幕的八分之一,顶部栏占2%,等等)。我还使用字体指标来确保组件大小正确,并且所有内容都能很好地显示出来。

我的问题是:为什么如此不赞成将布局设为空而不是使用布局管理器?(我在一些论坛上被告知,这是一种可怕的做事方式)我知道布局管理器是如何工作的,并且知道如何使用不同的布局,但是对于这个程序的要求(多个不同的分辨率,自定义按钮形状和位置,更改语言时组件上的文本更改等),我看不到自己使用布局管理器来完成所有操作。

在这种情况下,您更有经验的程序员如何使用布局管理器?当您希望按钮位于特定位置,而其他特定位置的其他组件与任何预定义布局都不匹配时,您会怎么做?


答案 1

如果布局管理器的分层正确,屏幕将重新排列为不同的大小,我们的想法是在所有屏幕尺寸上使用一组布局管理器。

如果您使用 null,则必须自己完成每个屏幕尺寸。不仅如此,如果应用程序可以窗口化,则必须支持它们可能滚动到的所有可能大小。

这有点困难,但布局管理器就是为了做到这一点而设计的。

有一些常见的技巧。BorderLayout是一个很好的布局。有时您可能会在多个级别使用它 - 通常只有2或3个组件。这是因为它非常善于给除一个区域以外的所有区域提供最小所需的区域,并将其他一切都交给中心。

FlowLayout可能很有用,但如果您的组件大小不同,则很棘手。

我不会尝试GridBagLayout,除非你打算编写代码来喂养你的布局管理器(这是一个很好的解决方案!)。

我也不会使用GUI构建器,他们不知道您想要重排布局的整体方式。


答案 2

简而言之:因为你上面解释的所有工作都是由布局管理器完成的(或者至少:应该完成)。

通常情况下,当使用空布局时,它还意味着所有位置和大小都硬编码为单个值,因此根本没有灵活性。这意味着窗口大小,语言,字体大小,显示密度或任何其他相关参数的更改对布局没有影响,并且您会得到通常的丑陋效果:窗口的空白部分;微小的,不可调整大小的列表;标签被切断的按钮;...

听起来你所做的工作真的应该由布局管理器来完成。要么找到一个可以做到这一点的(我个人的建议是MiGLayout,它做了很多,而且易于使用),要么写你自己的。