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

Java 为什么不赞成在Swing中使用空布局?,java,swing,layout,layout-manager,null-layout-manager,Java,Swing,Layout,Layout Manager,Null Layout Manager,最近,我开始为我工作的公司制定一个计划。正如背景信息一样,我还是一名学生,也是一名程序员初学者,所以我的解决方案可能不被推荐,我也不知道如何去做,但它是有效的,我不会因此受到评判,因为这是一份与编程完全无关的学生工作 这个程序的特点是,它将在多台不同的计算机上运行,具有不同的屏幕大小和分辨率(800x600及以上)。为了确保在不丢失程序任何部分的情况下尽可能多地占用屏幕,我将布局设置为null,并使用相对值对所有内容进行硬编码 该程序是kiosk风格的,我首先得到屏幕大小值,然后从那里开始(例如

最近,我开始为我工作的公司制定一个计划。正如背景信息一样,我还是一名学生,也是一名程序员初学者,所以我的解决方案可能不被推荐,我也不知道如何去做,但它是有效的,我不会因此受到评判,因为这是一份与编程完全无关的学生工作

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

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

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


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

如果您正确地对布局管理器进行分层,那么屏幕将重新显示为不同的大小,我们的想法是在所有屏幕大小上使用一组布局管理器

如果你使用null,你将不得不自己做每一个屏幕大小。不仅如此,如果应用程序可以打开窗口,你必须支持他们可能滚动到的每一个可能的大小

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

这里有一些常见的技巧。BorderLayout是一个很好的开始布局。有时您可能会在多个级别上使用它——通常只有2或3个组件。这是因为它真的很擅长给除一个区域以外的所有区域提供所需的最小面积,并将所有其他区域都提供给中心

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

我不会尝试GridBagLayout,除非您计划编写代码来为布局管理器提供信息(这是一个很好的解决方案!)


我也不会使用GUI构建器,因为它们不知道您想要回流布局的总体方式。

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

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


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

你实际上是在使用一个布局——你自己的,所有复杂的位置计算


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

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

我想是这样的,但是这个特定的应用程序无法调整大小,所以这不是问题。我遇到的最大问题是1。我没有找到一种方法让我的按钮准确地定位在我想要的位置。(我可能在这里遗漏了一些东西)我不能让我的按钮具有正确的大小,以在每个分辨率上完全显示整个文本(“longTextOnButton”将变为“longTex…”在更小的分辨率上)您应该能够设置组件的最小尺寸,准确定位可能很棘手,可能需要以不同的方式进行两种不同的布局。另外,有一件事你很快就会学到——当某些东西绝对是一个给定的需求时(比如总是全屏),它可能会改变。尽管如此,还是要以你感觉最舒服的方式来构建它,并不断评估从错误和成功中学习的不同方法,因为这是你在整个职业生涯中构建有用知识的方式,学校只是一个开始。是的,我理解这一点。对于这个特殊的项目,我很确定它不会改变,因为我是建议这样做的人,因为夏天我们的工作不是很忙,所以我通过思考什么是最有用的使用方式来制定我自己的要求,但我知道你来自哪里,我只是事先没有想过。至于我整个职业生涯中的学习,这是我在这个网站上的主要原因,所以我可以通过学习人们所说的话来提高自己,并帮助其他试图学习的人。谢谢对这个伟大的答案做了一些小的修改。请回顾一下。我实际上不知道其他布局经理(这有点愚蠢,但我从未想过)。我只知道JDeveloper中的一些内容,比如CardLayout、BoxLayout、GridLayout、GridBagLayout、FlowLayout等等。我来看看