为什么在Swing中使用null布局被认为是不好的?

16

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

关于这个程序的问题是,它将在多台具有不同屏幕尺寸和分辨率(800x600及以上)的计算机上运行。为了确保最大限度地利用屏幕而不失去程序的任何部分,我将布局设置为 null 并使用相对值硬编码了所有内容。

该程序是类似自助服务终端式的,并且我首先获取屏幕尺寸值然后开始设计(例如,从我脑海中出来的例子是左侧菜单占据屏幕的八分之一,顶部栏2%等)。我还使用字体指标确保各组件的大小正确并且一切显示得漂亮。

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

在像这样的情况下,您更有经验的程序员如何使用布局管理器?当您想让一个按钮出现在特定的位置而其他组件出现在另一个特定的位置,而这些不真正匹配任何预定义的布局时,您会怎么做呢?

4个回答

16
如果你正确地分层布局管理器,屏幕将自动重新调整大小,为此想法是在ALL屏幕尺寸上使用单一的布局管理器集合。
如果你使用null,你必须自己处理每个屏幕尺寸。不仅如此,如果应用程序可以窗口化,你还必须支持他们可能滚动到的每一个可能的尺寸。
这有点难以做到,但布局管理器就是为了解决这个问题而设计的。
有一些常见的技巧。BorderLayout是一个很好的布局开始。有时你可能会在多个级别使用它--通常只有2个或3个组件。因为它非常擅长给除了一个区域外的所有区域提供最小的所需区域,并将其他所有东西都给中心。
FlowLayout可能有用,但如果你的组件大小不同就会很棘手。
我不会尝试GridBagLayout,除非你打算编写代码来提供给你的布局管理器(这也是一个非常好的解决方案!)。
我也不会使用GUI构建器,因为他们不知道你希望重新调整布局的总体方式。

我明白了,但是这个特定的应用程序无法调整大小,所以这不是问题。我遇到的最大问题是:1.我找不到一种方法来确切地定位我的按钮位置;2.(我可能漏掉了什么)我无法使我的按钮大小适合每个分辨率完全显示整个文本(“longTextOnButton”在较小的分辨率上会变成“longTex…”)。 - Jumbala
1
你应该能够为你的组件设置最小尺寸,而精确定位可能很棘手,可能需要在不同方式下进行几种布局。另外,你很快就会学到一件事情--当某些事情绝对肯定是必需的要求时(比如始终全屏),它可能会改变。尽管如此,按照你最舒适的方式建造它,并继续评估不同的方法,从你的错误和成功中学习,因为这是你整个职业生涯中获得有用知识的方式,学校只是一个开始。 - Bill K
是的,我明白了。对于这个特定的项目,我很确定它不会改变,因为我建议这样做,因为在夏季我们并不是非常忙,所以我通过思考最有用的使用方式来制定自己的要求,但我理解你的观点,只是之前没有考虑到。至于我的整个职业生涯的学习,这就是我在这个网站上的主要原因,我可以通过学习别人的经验来提高自己,并帮助那些也在学习的人。谢谢! - Jumbala
1
对这个非常好的答案进行了一些小编辑。请查看并评估它们。 - Andrew Thompson

8
简而言之:因为你上面提到的所有工作都应该由布局管理器完成(或者至少应该这样做)。
通常,当使用空布局时,所有位置和大小都被硬编码为单个值,因此不具备任何灵活性。这意味着窗口大小、语言、字体大小、显示密度或任何其他相关参数的更改对布局没有影响,从而导致窗口出现空白部分、无法调整大小的列表、标签被裁剪的按钮等常见问题。
听起来你的工作应该由布局管理器完成。要么找一个可以完成这项工作的布局管理器(我个人建议使用MiGLayout,它功能强大且易于使用),要么自己编写一个。

我其实不知道还有其他的布局管理器(这有点傻,但我从未想过)。我只知道JDeveloper中的像CardLayout、BoxLayout、GridLayout、GridBagLayout和FlowLayout等。我会查看你建议的链接中的其他布局管理器。谢谢!这应该可以让我在尚未创建的其他窗口/未来应用程序中更轻松地处理布局问题。 - Jumbala
@Adam:是的,不幸的是内置的布局管理器很有限。它们要么太简单而无法用于复杂布局(大多数情况下),要么太复杂而无法被理智的开发人员使用(GridBagLayout)。我并不经常做UI工作,但在我找到MiGLayout之前,我讨厌做任何布局,现在这个任务从“可怕”降至“略微烦人”;-) - Joachim Sauer
我会采纳你的建议并尝试使用MiGLayout!我也讨厌做UI工作,因为我不太擅长艺术,而且我觉得这很繁琐。再次感谢! - Jumbala

4
你实际上使用了一个布局 - 你自己的布局,带有所有复杂的位置计算。你可以将这些逻辑移动到自定义布局管理器类中,以平息批评者的不满。

我没有想过那种方式。如果我最终不改用更喜欢的布局,我可能会这样做。这样我将来可能能在其他项目中使用它。 - Jumbala
问题可能在于您将其视为“布局”,而不是只使用一个。合理的屏幕将有一堆它们与不同的面板和组件交互。并非所有情况都适用于同一尺寸。 - Bill K

4
这个技巧应该是通过混合LayoutMangers和使用嵌套的JPanels来实现的,每个JPanel可以具有不同的布局或不具有布局,这取决于JComponents的数量,这使您可以创建类似于使用AbsoluteLayout布局但对于每个屏幕分辨率和比例(4:3、16:9、16:10)的GUI输出外观相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接