Swing的顶层容器,swing容器中包含的类
第10章讨论AWT和Swing中的布局管理器。在这一章中,我们将学习一些建立在这些布局管理器上的容器和其他不需要布局管理器的容器。
我们的讨论从Box类开始,我们将找到使用BoxLayout Manager创建单行或单列组件的最佳方式。接下来,我们将了解JSplitPane容器,它类似于一个只有两个组件的特殊盒子。JSplitPane提供了一个分隔条,用户可以拖动它来调整组件的大小,以满足各自的需求。
然后我们将讨论JTabbedPane容器。它的工作方式类似于由CardLayout布局管理器管理的容器。不同的是,容器的内置标签允许我们从一张卡移动到另一张卡。我们还可以使用JTabbedPane创建多个屏幕,属性页对话框用于用户输入。
最后讨论的两个高级Swing容器是JScrollPane和JViewport。这两个组件都提供了在有限的屏幕上显示大量组件的能力。JScrollPane在显示区域添加了滚动条,这样我们就可以在小区域内移动大组件。实际上,JScrollPane使用JViewport来划分不可见的组件。
让我们开始了解第一个容器,Box类。
11.1箱式分类
作为JComponent类的一个子类,Box类是一个特殊的Java容器,借助BoxLayout管理器创建单行或单列组件。Box的行为类似于JPanel(或Panel),但是有一个不同的默认布局管理器BoxLayout。在box之外使用Boxlayout有些麻烦,Box简化了BoxLayout的使用。我们可以通过三个步骤将BoxLayout管理器与容器关联起来:手动创建容器,创建布局管理器,然后将管理器与容器关联起来。当我们创建Box的实例时,我们同时执行这三个步骤。此外,我们可以使用名为Box.filler of box的内联类来更好地将组件放置在容器中。
创建一个盒子
我们有三种创建Box的方法,一个构造函数和两个静态工厂方法:
请注意,Box类不是设计来作为JavaBean组件使用的。在IDE中使用这个容器非常笨拙。
未使用的构造函数需要布局管理器主坐标的方向。这个方向由BoxLayout的两个常量指定:X_AXIS或Y_AXIS,它们分别用于创建水平或垂直框。我们不需要手动指定方向,我们可以简单地通过提供的工厂方法:createHorizontalBox()或createVerticalBox()创建具有所需方向的盒子。
使用JLabel、JTextField和JButton填充一个水平和垂直的框展示了BoxLayout的灵活性,如图11-1所示。
对于水平容器,标签和按钮以它们的最佳宽度显示,因为它们的最大尺寸与最佳尺寸相同。文本使用剩余的空间。
在垂直容器中,标签和按钮的大小也是它们的最佳大小,因为它们的最大大小仍然与它们的最佳大小相同。文本的高度填充标签和按钮未使用的高度,其宽度与容器的宽度相同。
用于创建图11-1所示屏幕的源代码如清单11-1所示。
如表11-1所示,Box只有两个属性。尽管layout属性从其父类容器继承setLayout(LayoutManager)方法,但如果在Box对象上调用该方法,该类将引发AWTError。一旦在其构造函数中设置了BoxLayout manager,就可以再次更改它,并且不能更改它的方向。
文件:摇摆台11 1.png
11.1.3使用盒子。文件编档员
类框有一个内联类框。Filler,它可以帮助我们创建不可见的组件,以便使用BoxLayout布局管理器在容器中更好地布局组件。通过直接操纵所创建组件的最小、最大和最佳尺寸,我们可以创建可以增长以填充未使用空间或保持固定尺寸的组件,从而使屏幕更容易被用户接受。
注意,从技术上讲,使用Box。Filler并不局限于使用BoxLayout布局管理器的容器。我们可以在任何使用组件的地方使用它。只有组件是不可见的。
我们不需要用盒子。直接填充类。Box类的一些静态方法可以帮助我们创建合适的填充组件。工厂方法允许我们根据类型对组件进行分类,而不是根据最小、最大或最佳尺寸。我们将在接下来的两节中学习这些方法。
如果我们对类定义感兴趣,那么类定义的方框。填充物如下所示。类似于Box类,Box。Filler最初不是作为JavaBean组件使用的。
11.1.4创建扩展区域
如果组件具有较小的最小尺寸和最佳尺寸,并且最大尺寸大于屏幕尺寸,则该组件可以在一个或两个方向上扩展,以占据容器中组件之间未使用的空间。对于Box,或者更确切地说,布局管理器是BoxLayout的容器,扩展出现在布局管理器最初选择的方向(BoxLayout。x轴或BoxLayout。y _轴)。对于水平框,扩展会影响组件的宽度。对于垂直框,膨胀反映在组件的高度上。
通常,这种扩展组件的名称是glue。两种类型的粘附力是方向无关粘附力和方向相关粘附力。以下框工厂方法用于创建胶合元件:
一旦我们创建了glue,就可以像其他组件一样,通过Container.add(Component)或其他add()方法将其添加到容器中。Glue允许我们在容器内对齐组件,如图11-2所示。
我们可以向任何布局管理器考虑组件的最小尺寸、最大尺寸和最佳尺寸的容器添加胶合组件,例如BoxLayout。例如,图11-3展示了当我们在最后一个JMenu之前添加一个粘合组件到JMenuBar时的样子。因为JMenuBar的布局管理器是BoxLayout(实际上是一个子类javax . swing . plaf . basic . defaultmenulayout),所以这个操作可以把最后一个菜单推到工具栏的右边,类似于Motif/CDE风格的帮助菜单。
注意,我们建议避免这种粘合组件的功能,以在菜单栏上设置菜单。事实上,JMenuBar的public void sethelpmenu(jmenu menu)会实现这种行为而不会抛出错误。当然,我们很多人还在等待这种操作。
11.1.5创建固定区域
因为粘合的组件将扩展以填充可用空间,如果我们想要组件之间的固定距离,我们需要创建一个固定组件,或支柱。当我们这样做时,我们需要指定支柱的尺寸。支柱可以是二维的,要求我们指定构件的宽度或调试;或者它可以是一维的,要求我们指定宽度或高度。
注意,虽然createGule()方法创建的与方向无关的粘合组件在我们修改容器方向时没有副作用,但创建固定区域会在修改坐标时导致布局问题。(想象拖动菜单栏)这是因为组件有最小尺寸。除非我们真的需要一个二维的空组件,否则不推荐使用createRigidArea()方法。
图11-4显示了一些固定部件。注意,我们可以改变不同组件之间的固定距离,容器末端的固定组件没有影响。用户调整屏幕后,组件之间的固定距离将保持不变,如图11-4所示。
11.2 JSplitPane类
与Box容器类似,JSplitPane容器允许我们在单行或单列中显示组件。但是,Box可以包含任意数量的组件,而JSplitPane只能用于显示两个组件。组件的大小可以变化,并由可移动的分隔器分隔。该分区允许用户通过拖动该分区来调整所包含组件的大小。图11-5显示了垂直和水平分割面板,以及移动分隔条前后的外观。
创建JSplitPane
JSplitPane有五个构造函数。通过这些构造函数,我们可以初始化包含的组件对的方向,设置continuousLayout属性或初始化容器的组件对。
除非另有说明,否则默认方向是水平的。方向可以通过JSplitPane的常量VERTICAL_SPLIT或HORIZONTAL_SPLIT来指定。continuousLayout属性设置确定当用户拖动分隔条时分隔面板如何响应。当设置为false(默认值)时,拖动时仅重绘分隔符。当设置为true时,当用户拖动分隔线时,JSplitPane将在分隔线的每一侧调整组件的大小并重新绘制组件。
注意如果方向是JSplitPane。VERTICAL_SPLIT,我们可以把上分量看成左分量,下分量看成右分量。
如果我们使用无参数构造函数,分隔符面板中的初始组件集由按钮组成(两个JButton组件)。的其他两个构造函数显示初始的两个组件已设置。奇怪的是,其他两个构造函数在默认情况下并不在容器中提供组件。要在JSplitPane中添加或修改组件,请参考后面的“修改JSplitPane组件”一节。
JSplitPane属性
表11-2显示了JSplitPane的17个属性。
设置方向
除了在构造函数中初始化方向,我们还可以通过将direction属性更改为JSplitPane来修改JSplitPane方向。VERTICAL_SPLIT或JSplitPane。水平_分割。如果我们尝试将该属性修改为不等效的设置,将会引发IllegalArgumentException。
不建议在运行时动态修改方向,因为会让用户困惑。但是,如果我们使用的是可视化开发工具,我们可以在创建JSplitPane后显示设置方向属性。可视化编程没有做的时候,我们一般在创建JSplitPane的时候初始化方向。
修改JSplitPane组件
有四个读写属性可以用来处理JSplitPane中组件的不同位置:bottom component、left component、right component和topComponent。其实这四个属性代表了两种内部组件:左组件和上组件是一个;右边较低的部分代表另一个。
我们应该使用与我们的JSplitPane的方向兼容的属性。使用不恰当的属性方法会让程序员很难维持生活。想象一下,在创建用户界面后,六个月后看到下面的代码:
如果我们查看代码,基于变量名和setXXXComponent()方法的使用,我们可能会认为屏幕包含一个左边的按钮和一个右边的按钮。然而,实例化的JSplitPane具有垂直方向,创建的接口如图11-6所示。使用的变量是按钮的标签,而不是它们的位置。
如果setTopComponent()和setBottomComponent()方法使用更好的变量名,代码将更容易理解:
移动JSplitPane分隔符
最初,分隔符显示在上部组件的下方,或者以适当的大小显示在左侧组件的右侧。在任何时候,我们都可以通过调用JSplitPane的restToPreferredSizes()方法来重置分离位置。如果要编程定位分隔符,可以通过setdividerrocation(new location)修改dividerLocation属性。该属性可以修改一个int位置,以指示距顶部或左侧的绝对距离,或者将其设置为一个介于0.0和1.0之间的double值,以指示JSplitPane容器宽度的百分比。
请注意,如果属性设置为0.0和1.0范围之外的双精度值,将引发IllegalArgumentException。
如果我们想设置分隔符的位置,我们必须等到组件被实现。本质上,这意味着组件必须是可见的。有许多方法可以做到这一点,最直接的方法是将HierarchyListener与JSplitPane相关联,并在HierarchyEvent成为SHOWING_CHANGED类型时进行侦听。下面的代码片段演示了这一操作,将分隔符位置更改为75%。
虽然我们可以使用double值来设置dividerLocation属性,但我们将只能获得一个标识绝对位置的int值。
调整组件大小并使用可扩展分隔符。
在JSplitPane中调整组件的大小有一些限制。JSplitPane将考虑每个包含组件的最小大小。如果拖动分隔符将组件缩小到小于其最小大小,则滚动面板将不允许用户拖动分隔符超出此最小大小。
请注意,我们可以在任何位置编程分隔符,甚至使组件小于其最小尺寸。然而,这不是一个好主意,因为组件的最小尺寸是有原因的。
如果组件的最小维度对于JSplitPane来说太大,我们需要修改组件的最小维度,这样分隔符就可以使用组件的空间。对于AWT组件,修改标准组件的最小大小需要子类派生。对于Swing组件,我们可以简单地通过一个新的维度调用JComponent的setMinimumSize()方法。但是,最小尺寸的设置要合理。如果我们明确减小它的最小尺寸,组件将无法正常工作。
让一个组件比其他组件占用更多空间有一个更好的方法:将JSplitPane的onTouchExpandable属性设置为true。当该属性为true时,分隔符上将添加一个图标,以便用户可以完全折叠两个组件之一,为另一个组件指定所有空间。在图11-7的方框中,图标是上下箭头的组合。
图11-7显示了这个图标是如何显示的(由Ocean look and feel渲染),并演示了当分隔符上的向上箭头被选中以将下面的组件展开到最大尺寸时的样子。再次单击分隔符上的图标将使组件返回到其先前的位置。单击分隔符上图标以外的位置将定位分隔符,以便折叠组件处于最佳大小。
请注意,没有简单的方法来修改扩展分隔符的图标或分隔符的呈现方式。这两个方面都由BasicSplitPaneDivider子类定义,并在BasicSplitPaneUI子类的createDefaultDivider()方法中为特定的外观类型创建。我们可以简单地修改分隔符周围的边框,这是一个自定义边框。
lastDividerLocation属性允许我们或系统查询前一个分隔符的位置。当用户选择maximizer图标来取消JSplitPane中组件的最小化时,JSplitPane使用该属性。
小心,小心那些最小尺寸基于容器尺寸或其初始尺寸的组件。将这些属性放入JSplitPane可能需要我们手动设置组件的最小或最佳大小。在JSplitPane中使用时,最常引起问题的组件是JTextArea和JScrollPane。
调整JSplitPane大小
如果JSplitPane中有其包含的组件的最佳大小不需要的额外空间,将根据resizeWeight属性设置分配该空间。该属性的初始设置是0.0,这意味着右边或下面的组件将获得额外的空间。将此设置更改为1.0会将所有空间分配给左侧或上部组件。0.5将面板分隔在两个组件之间。图11-8显示了这些变化的影响。
11.2.3监视JSplitPane属性的变化
JSplitPane类定义了以下常量来帮助监视边界属性的变化:
连续布局属性
分割线_位置_属性
DIVIDER_SIZE_PROPERTY
最后_除法器_位置_属性
一键式可扩展属性
方向_属性
调整大小_重量_属性
监视用户何时移动分隔符的一种方法是监视lastDividerLocation属性的更改。清单11-2中的例子将PropertyChangeListener与JSplitPane相关联,从而显示当前分隔符位置、当前最后位置和先前最后位置。分隔符上方和下方的组件是OvalPanel类(在第4章中讨论),绘制它们是为了填充组件的维度。该组件帮助演示将continuousLayout属性设置为true的效果状态。
如下面的示例输出所示,当我们运行前面的程序时,我们会注意到lastDividerLocation属性的变化,以反映分隔符的拖动。当用户停止拖动分隔符时,最后一个设置被设置为dividerLocation属性的上一个设置,而不是用户开始拖动时的初始设置。当用户拖动分隔符时,当前值变成最后一个值,然后是上一个值。
当前:11最后:-1先前最后:0当前:12最后:11先前最后:-1当前:12最后:12先前最后:11当前:12最后:11先前最后:12当前:15最后:12先前最后:11当前:15最后:15先前最后:12当前:15最后:12先前最后:15当前:15最后:112先前最后:15先前最后:15当前:12先前最后:12先前最后:12当前:112 L最后:112先前最后:112先前最后:112先前最后:15当前:112最后
请注意,PropertyChangeListener不支持JSplitPane类的BOTTOM、DIVIDER、LEFT、RIGHT和TOP常量。相反,它们是add (component component,object constraints)方法使用的内部约束。
11.2.4自定义JSplitPane类型
每个可安装的Swing外观都提供了不同的JSplitPane外观,以及组件的默认UIResource值集。图11-9显示了JSplitPane容器的外观,其中预装了外观类型:Motif、Windows和Ocean。
表11-3显示了JSplitPane可用的UIResource相关属性的集合。对于JSplitPane组件,有25种不同的属性,包括3种特定于分隔符的属性。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。