为什么在Swing中使用null布局不赞成?

时间:2011-07-06 06:39:15

标签: java swing layout layout-manager null-layout-manager

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

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

该程序是自助终端风格,我首先得到屏幕尺寸值并从那里开始(例如,在我的头顶,左侧菜单占据屏幕的八分之一,顶部栏位于2%,等等。)。我还使用字体度量来确保组件的大小正确并且所有内容都能很好地显示。

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

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

4 个答案:

答案 0 :(得分:14)

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

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

这很难做到,但布局经理的设计就是为了做到这一点。

有一些常见的技巧。 BorderLayout是一个很好的布局。有时您可能会在多个级别使用它 - 通常只有2或3个组件。那是因为除了一个区域以外,所有区域都是最小的所需区域并将其他所有内容交给CENTER。

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

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

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:4)

您实际上正在使用布局 - 您自己的布局,包括所有复杂的位置计算。

您可以将这些逻辑移动到自定义布局管理器类,以平息批评者。

答案 3 :(得分:4)

hmmm技巧应该是通过混合LayoutMangers和使用嵌套JPanels的数量,每个嵌套的JComponents可以有不同的布局,实际上取决于AbsoluteLayout的数量,这允许你创建看起来像使用{{3}}但是对于每个屏幕分辨率和比例具有相同的外观/输出(4:3,16:9,16:10)的GUI。