javafx如何实现javafxtable滚动条显示

一个JavaFx应用可以通过设置每个UI元素的位置和大小来手动地布局用户界面。但是,一个更简单的做法是使用布局窗格。JavaFx SDK提供了多种布局容器类,叫做窗格,它们可简化对一些经典布局的设置和管理,例如行、列、堆叠、平铺等等。当窗口缩放时,布局窗格会自动地根据节点属性重设其包含的所有节点的位置和大小。

本话题为JavaFx layout包中提供的的每个布局窗格都给出了相应的概述和简单的示例。文件包含了本话题中UI的源码。文件包含了示例应用的NetBeans工程。

默认情况下,如果窗口比所有区域所需空间还大,多余的空间将被分配给中间区域。如果窗口比所需空间小,区域可能会重叠。重叠是由区域设置的顺序决定的。例如,如果区域设置的顺序是 left, bottom, right,当窗口变得更小时,bottom区域会覆盖left区域,right区域会覆盖bottom区域。如果区域设置的顺序是 left, right, bottom,当窗口变得更小时,bottom区域会覆盖leftright区域。

 展示了布局示例应用中创建border pane的代码。创建每个区域用到的布局窗格的函数会在本话题的剩余部分介绍。

注意一点,在本例中,border panebottom区域并没有被使用。如果你想要在bottom区域中添加什么,可以使用下面的语句并且替换其中的节点node为你选择的控件。

HBox 布局窗格可以让你很容易地将一系列节点排列到一行中。 展示了一个 HBox 窗格的例子.

译者注:padding又称内边距、补白或留白,margin又称外边距、边界或额外空白区。它们的概念来源于CSS,即层叠样式表。从一般意义上讲,margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。margin用于布局分开元素使元素与元素互不相干;padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段呼吸距离。(

StackPane 布局窗格能将所有的节点放到一个堆栈中,其中每一个新的节点被添加到前一个节点的上方。这个布局模型能让你很容易地在一个形状或图像上面覆盖一个文本,或者用常用形状互相覆盖来创建复杂的形状。展示了一个通过在一个带有渐变色背景的矩形上堆放一个问号来创建的帮助图标。

Alignment 属性可以管理stack pane中子节点的对齐方式。这个属性影响所有的子节点,所以margin可以为stack中单独的子节点调整位置。

GridPane布局窗格能让你创建一个灵活的由行和列组成的网格来放置节点。节点可以被放于任何单元格内,也可以根据需要横跨多个单元格。一个grid pane对于创建表单或者任何以行和列组织的布局很有用。 展示了一个包含了图标、标题、副标题、正文和图表的grid panegridLinesVisible属性可设置是否显示网格线,它能标识出行和列以及行列之间的间隔。这个属性对于可视化调试你的GridPane很有用。

Gap属性可用于管理行和列之间的间隔。Padding属性可用于管理节点与网格边缘的距离。Verticalhorizontal alignment属性可用于管理单元格中单独控件的对齐方式。

当窗口缩放时,grid pane中的节点会根据它们的布局约束进行缩放。

FlowPane 中的节点会连续地排列,并且会在窗格的边界自动换行(或列)。节点可以垂直地(按列)或水平地(按行)流动。一个垂直flow pane会在窗格的高度边界上包装节点,一个水平flow pane会在窗格的水平边界上包装节点。 展示了一个水平flow pane的例子,里面有多个带有数字的图标。作为对比,如果把它换成垂直flow pane,第一列会包含1-4号图标,第二列中则包含5-8号图标。

译者注:包装(wrap,指在窗格的边界上发生自动换行(或换列)。

Gap属性可以管理行和列之间的间隔大小。Padding属性可以管理节点与窗格边界间的距离。为一系列页面图标创建了一个水平flow pane

Gap属性可以管理行或列之间的间隔。Padding属性可以管理节点与窗格边界的距离。

AnchorPane 布局窗格能让你将节点锚定到窗格的顶部、底部、左侧、右侧或者中间。当窗口缩放时,节点会保持其相对于锚点的位置。节点可被锚定到多个位置,并且同一位置可以锚定多个节点。 展示了一个anchor pane,它带有一个部分用到的grid pane和一个包含两个按钮的HBox,它们分别被锚定到了窗格的顶部和右下角。

 创建了一个anchor pane,其中有一个节点被锚定到了窗格顶部,另一个节点被锚定到了窗格右下角。这里用了 里面创建的grid pane作为top节点。

当窗口缩放时,节点会根据它们的锚点保持各自的位置。从 中可以看出来,当窗口变小时,被锚定到窗格底部的按钮移动到了离sales信息更近的位置。

二、控制节点的大小和对齐

使用JavaFx内置布局窗格的一个主要优点是节点的大小和对齐可以交给窗格来完成。当窗格发生了缩放,节点会依据其偏好的尺寸范围进行缩放。注意,不是所有节点都可以缩放。UI控件和布局窗格可以缩放,但是形状、 Text 对象、Group 对象是不可缩放的,它们在布局中被视为刚体。

如果你想要在你的UI中做更多的尺寸控制,你可以直接设置它们的偏好尺寸范围。然后布局窗格会使用你的这些设定决定控件的尺寸。要管理控件的位置,你可以使用布局窗格的对齐属性。

本话题针对节点的尺寸控制和对齐控制提供了简单示例。文件包含了本话题中使用的示例源码,文件包含了这个示例的NetBeans工程。

布局通过调用 prefWidth(height) and prefHeight(width) 函数来获取节点的偏好尺寸。默认情况下,UI控件会基于其中的内容计算出默认的尺寸,并将它作为偏好尺寸。例如,一个 Button 对象计算出来的尺寸是由文本的长度、label中使用的字体,以及可能加入的图像的尺寸共同决定的。通常情况下,计算出来的尺寸应该刚好能让控件和label完全显示出来。

UI控件也提供了默认的最小尺寸和最大尺寸,这是由控件的特定用途决定的。例如,一个Button对象的最大尺寸在默认情况下被设为其偏好尺寸,因为你通常不希望按钮增长到任意大。但是,一个ScrollPane对象的最大尺寸是没有限制的,因为通常你需要它们增长并填补空间。
你可以使用节点默认的尺寸限制,也可以自行设置这些值来达到你想要的效果。例如, 展示了一个border pane,里面有多个按钮和一个list view,它们都具有默认的大小。

假设你想要的外观是那样的,其中的UI控件根据你想要的约束调整其大小。

应用程序经常需要直接为控件设置最小尺寸、偏好尺寸以及最大尺寸的约束。以下部分给出了有关覆盖计算尺寸、自定义外观的提示。

你可能遇到过确定每个按钮宽高的问题,并且你可能会将每个按钮的宽高设为这个按钮集合中最大的宽高。实际上更简单的做法是将这些工作交给布局窗格来完成。至于究竟用哪种窗格,这完全是由你想要实现的效果决定的。

 中的场景为右边的按钮建立了一个VBox布局窗格,并且使用了按钮的计算尺寸。这些按钮已经有了相同的高度,所以我们只需要调整一下宽度。

 中的场景使用了一个 VBox 窗格,VBox窗格在默认情况下会让其宽度和最宽元素的偏好宽度相同,我们充分利用了这个特性。为了让所有的按钮都被缩放到VBox窗格的宽度,每个按钮的最大宽度被设为了Double.MAX_VALUE这个常量,这能让一个控件无限地增长。当然也可以不使用最大值常量,而是将最大宽度设为一个特定值,比如80.0

 展示了如何用一个VBox窗格建立一列具有相同宽度的按钮。

在本示例程序中,UI中的元素使用了一个border pane来布局。这一列按钮被置于border paneright区域,从而将按钮的宽度限制在最宽按钮的偏好宽度。border panecenter区域会自动扩展来填充任何可用的空间,所以如果你将这个VBox放在center区域中,VBox窗格和其中的按钮都会自动扩展。

 中的场景使用了一个 HBox 布局窗格来布局底部的按钮,并使用了按钮的计算尺寸。这些按钮有不同的宽高。

 中的场景使用了一个水平 TilePane 布局窗格,它在默认情况下会让每个小格(cell)具有相同的尺寸,我们充分利用了这个特性。每个小格的尺寸刚好能容纳下窗格中最大节点的偏好尺寸。

为了让这些按钮缩放到小格的尺寸,我们只需将它们的最大宽度和最大高度设为Double.MAX_VALUE这个常量。展示了如何使用一个tile pane来创建一行具有相同宽高的按钮。

Tile pane中的小格不会在窗口缩放时进行缩放,所以如果按钮被置于tile pane中,它们的大小将不会发生变化。注意一点,如果窗口的宽度变窄,tile pane中按钮会发生位置的变化,但不会变小。

将节点保持在偏好大小上

stage缩放时,stage中的布局窗格可能会将或多或少的空间分配给其中的控件。每个布局窗格有各自分配空间的规则,它会根据其中控件的最小尺寸、偏好尺寸、最大尺寸进行分配。通常情况下,最大尺寸为Double.MAX_VALUE的控件会扩展并填充空余的空间,而最大尺寸有限制的控件则不会扩展。例如,一个ListView 对象的最大尺寸为无限,如果你想要限制它的高度为它的偏好尺寸,你可以将它的最大尺寸设为Control.USE_PREF_SIZE 常数,就像中展示的那样。

默认情况下,按钮会增长到它的偏好大小。但是,如果没有覆盖按钮的最小宽度,它会缩小到只显示三个点(...)。为了防止一个按钮的宽度变得比偏好宽度还要小,可以将它的最小宽度设为偏好宽度,就像那样。

一个控件的偏好尺寸一开始是基于计算出来的结果的。你可以覆盖默认设置,并设置偏好尺寸为你想要的尺寸。以下语句覆盖了一个list view的偏好宽度。

如果你不想让一个控件的大小发生变化,可以将它的最小尺寸、最大尺寸和偏好尺寸都设为一样的大小。如果仅仅要防止宽度(或高度)改变,只需将宽度(或高度)的约束尺寸设为相同值。在中,我们创建了一个所有尺寸约束都是相同宽高的list,那么这个list的大小将不会随着窗口的缩放而缩放。我们还创建了一个所有宽度约束都设为相同值的按钮。

每个布局窗格都有一个默认的对齐其中节点的方式。例如,在 HBox  VBox 布局窗格中,节点是顶部对齐和左对齐的。在TilePane  FlowPane 中,节点是居中对齐的。窗格本身一般默认是顶部对齐和左对齐的。

你可以通过使用窗格的setAlignment()函数来管理节点和窗格的对齐方式。以下是javafx.geometry 包中的一些enum类,其中包含了很多控制对齐的常量:

· Pos 包含了确定水平及竖直对齐的值。其中下划线左侧的值确定了竖直对齐方式,下划线右侧的值确定了水平对齐方式。例如, Pos.BOTTOM_LEFT 将一个节点在垂直方向上置于底部,水平方向上置于最左边。

 是通过  中的代码建立的, 如果不指定任何的对齐约束,布局窗格被置于左上角。

假设你想要的外观是像那样的,将布局窗格居中对齐,并且改变控件默认的对齐方式。

以下部分提供了一些有关覆盖默认位置的小提示。

为了居中中场景里的grid,可使用如下语句:

在想要实现的布局中,label是右对齐的,field是左对齐的。为了在grid中实现这一点,可使用ColumnConstraints 类来定义每个列并设置水平对齐约束。   中的grid定义了列。

另一个让一列中的控件右对齐的方式是使用一个  VBox 布局窗格,然后使用setAlignment()函数,就像下面语句中那样:

按钮被置于一个HBox 窗格中,这个窗格在grid中横跨了两列。下列语句将grid里的按钮居中对齐:

HBox 窗格的setAlignment() 函数会将HBox在其布局空间中居中对齐,并且它也会将其内部的节点居中对齐。你可能更希望不仅这个HBox

在这一行中居中,并且其中的按钮还能在底部对齐,就像中那样。

图 2-5 覆盖默认位置并将按钮向底部对齐

为了实现这样的布局,可以将这个HBox置于一个只包含一个小格的内部grid中,并将这个grid置于外层grid的第三行中。然后在内部grid上设置对齐约束来将它居中对齐,并且在HBox中设置一个对齐约束来将其中的内容向底部对齐,就像中那样。

二、用CSS设定布局窗格的样式

布局窗格使用了诸如padding, spacing, 和 alignment这些属性来管理窗格的外观元素。层叠样式表(CSS)能让你定义一些属性,并将这些属性应用于多个布局窗格上,这可以为你的JavaFx程序提供一个统一的外观。你也可以使用CSS自定义单独的布局窗格。

本话题使用了  中的示例,来向您展示使用CSS为不同布局窗格定义样式的例子。 展示了我们创建的新样式。

 包含了建立这个UI的源码。 包含了这个示例程序的NetBeans工程。

不像buttoncheck box这些控件,它们都有着各自的样式类 .button  .check-box等等,布局窗格没有预定义的样式类。要想为你的布局窗格定义样式,你必须创建一个样式表并定义你想要用的样式类。然后,在你的代码中,当你创建这些窗格时,将合适的样式类应用上去。

例如,你如果想要你所有的HBox窗格拥有相同的背景色,paddingspacing属性,可以创建一个名为 .hbox 的样式类,如 

你可以通过指定窗格的样式类来让所有的HBox使用这个样式。  中设定了两个窗格的样式类。

你可以使用CSS来为所有类型的布局窗格设置背景、边框和padding属性。有些类型的布局窗格可以设置更多的属性。例如,你可以设置 HBox  VBox spacingalignment属性,也可以设置TilePane的旋转方向、偏好行数、偏好列数以及其他的属性。另外,你可以在窗格的背景和边框上使用图像。

详情请查看 ,里面有每种布局窗格的属性列表。 Region 类中的属性可以用于所有布局窗格,因为所有布局窗格都是Region 类的子孙。

设定Scene的样式表

当你准备好了你的样式表,你还必须得将这个样式表添加到你的应用中,然后所有的节点才可以访问这个样式表中的样式。 展示了如何将样式表添加到我们的布局示例程序中。在这个例子中,样式表与程序的类文件位于同一个目录中。

设定布局示例程序的样式

布局示例程序提供了JavaFx layout包中的内置布局窗格的示例。这里我们对这个程序进行样式的设定,从而提供了在不同布局窗格中使用CSS的例子。

为公用属性设定一个样式

所有的布局窗格都有一系列基本的可用CSS管理的属性。这些属性包括背景、边框、内边距(padding)和窗格形状。如果你有一些窗格需要共享这些公共的属性,你可以定义一个样式类并将它应用到每个窗格上。

在自定义布局的示例程序中,一些布局窗格使用了相同的背景色。 中展示的 .pane 样式类被用于设定这个颜色。

Border panes没有中提到的基本样式集之外的跟多样式属性。在布局示例程序中,border pane没有设置样式。但是,如果要为一个border pane设置样式,你可以定义一个样式类并将它设置到这个pane上,这和针对其他pane所采用的做法一样。

除了所有布局窗格都有的基本样式属性外, HBox 窗格还有设置对齐、间隔、高度填充的属性。

对于自定义布局示例,两个 HBox 窗格都有着相同的背景色和间隔。这些属性设定在的样式定义中。

要在 HBox 窗格上使用我们定义的样式,需要将样式类 .hbox 设定到这些窗格上。要覆盖padding属性并设置额外的属性,比如圆角属性,可以使用中定义的样式并为第二个 HBox 窗格设置ID

除了所有窗格共有的基本属性集外, VBox 窗格还有对齐、间隔、宽度填充的属性。

除了所有窗格都有的基本属性,stack panes还有对齐属性。在布局示例程序中,stack pane没有设定样式。但是,你可以通过定义样式类并将它设定到窗格上的方法来为它设定样式,和其他窗格的操作方式一样。

除了所有窗格都有的基本属性,grid panes还有设定行列间间隙、网格对齐以及网格线是否可见的属性。

 中间区域的grid设置了圆角并具有比网格稍小一点的白色背景。 中的 .grid 样式类提供了这样的样式定义,并设置了padding属性和行列间的间隔。

 展示了这个类是如何应用到这个grid上的。

请注意,这个grid并没有使用该程序中其他窗格使用的背景色。但是包含这个gridanchor pane使用了那个背景色。为了阻止grid使用它的父节点的背景色,你必须将grid的背景色设为你想要的颜色。

除了所有布局窗格都有的基本属性集, flow panes 还有对齐、布局方向、行列间间隔的属性,tile pane还有对齐、布局方向、行列间隔、偏好行列数以及偏好宽高。

在布局示例程序中,flow panetile pane都可以用于的右侧区域。这里样式类中的属性集对于两种窗格都是公用的,所以示例程序中用了同一个样式类。中的 .flow-tile 类设置了padding属性和行列间间距的属性。

布局窗格可以通过设置 background image 属性来使用图片当做背景。你可以在一个样式类中设定图片、尺寸、位置以及重复类型。 展示了另一个版本的布局示例UI,其中左侧的 VBox 窗格以及包含SaveCancel按钮的 HBox 窗格都是用了背景图。

 展示了添加背景图片的样式类定义

· 其中的箭头图片小于我们需要的大小,云朵图片大于我们需要的大小,所以我们通过设定 -fx-background-size 属性来进行缩放。

}

按相关度排序 按时间排序

按相关度排序 按回复数排序

全部 文档 代码类 工具类

}

我要回帖

更多关于 javafxtable滚动条显示 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信