布局管理器(一)

布局管理器(一),第1张

在第9章中,我们了解了Swing组件集合中的各种d出窗口以及选择器类。在本章中,我们将会了解AWT与Swing布局管理器

然而由于本书关注于Swing组件集合,我们不能仅是简单的使用。我们需要理解AWT与Swing布局管理器。事实上,比起五个Swing布局管理器中的三个,我们更经常使用的是五个AWT布局管理器中的四个。AWT布局管理器是FlowLayout,BorderLayout,GridLayout,CardLayout以及GridBagLayout。Swing布局管理器是BoxLayout,OverlayLayout,ScrollPaneLayout,ViewportLayout以及SpringLayout。还有一个管理器就是JRootPane.RootLayout,我们在第8章中进行描述。

除了布局管理器,我们还有了解一些助手类:GridBagLayout的限制类GridBagConstraints,BoxLayout与OverlayLayout管理器所用的SizeRequirements类,以及与SpringLayout管理器相关联的Spring与SpringLayout.Constraints类。

10.1 布局管理器职责

每一个容器,例如JPanel或是Container,都有一个布局管理器。布局管理器定位组件,无论平台或屏幕尺寸。

布局管理器避免了我们自己计算组件位置的需要,这几乎是一个不可完成的任务,因为每一个组件所需要的尺寸依据我们的程序所部署的平台以及当前的观感而不同。甚至对于一个简单的布局,确定组件尺寸并计算绝对位置所需要代码也要几百行,特别是如果我们关注于当用户调整窗口尺寸时所发生的情况,则所需要的代码会更多。布局管理器为我们处理这些事情。他会询问容器中的每一个组件需要多少空间,然后依据所用平台的组件尺寸,可用空间,以及布局管理器的规则在屏幕上尽最好可能来安排组件。

为了确定组件需要多少空间,布局管理器调用组件的getMinimumSize(),getPreferredSize()以及getMaximumSize()方法。这些方法报告一个组件要正确显示所需要的最小,适当,以及最大空间。所以每一个组件必须了解其空间需求。然后布局管理器使用组件的空间需求来调整组件尺寸并在屏幕上进行安排。除了布局管理器的设置之外,我们的Java程序不需要担心平台依赖的位置。

注意,布局管理器会忽略一些组件;并没有布局管理器显示所有内容的要求。例如,使用BorderLayout的Container也许会包含30或40个组件;然而,BorderLayout至多显示其中的五个。类似的,CardLayout也许会管理多个组件,但是每次只显示一个。

除了忽略组件,布局管理器会对组件的最小,适当以及最大尺寸进行所需要的处理。他可以忽略其中任意或是所有的尺寸。布局管理器忽略适当的尺寸也是有道理的,毕竟,更好的方法就是“如果合适,就给我这个尺寸”。然而,布局管理器也可以忽略最小尺寸。有时,并没有合理的选择,因为也许容器并没有足够的空间以组件的最小尺寸来显示。如何处理这种情况则留给布局管理者的判断力。

10.2 LayoutManager接口

LayoutManager接口定义了布局Container内的Component对象的管理器的职责。正如在前面所解释的,决定Container中每一个组件的位置与尺寸是布局管理器的职责。我们不要直接调用LayoutManager接口中的方法;对于大部分来说,布局管理器在幕后完成他们的工作。一旦我们创建了LayoutManager对象并且通知容器来使用(通过调用setLayout(manager)),我们就完成了相应的工作。系统会在需要的时候调用布局管理器的相应方法。类似于任意的接口,LayoutManager指定了布局管理器必须实现的方法,但是没有约束LayoutManager如何来完成这些工作。

如果我们要编写一个新的布局管理器,那么LayoutManager接口本身是最重要的。我们先来描述这个接口是因为他是所有的布局管理器所基于的基础。我们也会描述LayoutManager2接口,他会为某些布局管理器使用。

10.2.1 探讨LayoutManager接口

LayoutManager接口由五个方法组成:


如果我们要创建我们自己的类来实现LayoutManager,我们必须定义所有的五个方法。正如我们将要看到的,一些方法并不需要做任何事情,但是我们必须包含一个具有相应签名的桩。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/2082359.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-07-22
下一篇 2022-07-22

发表评论

登录后才能评论

评论列表(0条)

保存