已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在JavaFX中使用布局一、用内置布局窗格一个JavaFx应用可以通过设置每个UI元素的位置和大小来手动地布局用户界面。但是,一个更简单的做法是使用布局窗格。JavaFxSDK提供了多种布局容器类,叫做窗格,它们可简化对一些经典布局的设置和管理,例如行、列、堆叠、平铺等等。当窗口缩放时,布局窗格会自动地根据节点属性重设其包含的所有节点的位置和大小。本话题为JavaFxlayout包中提供的的每个布局窗格都给出了相应的概述和简单的示例。LayoutSample.java文件包含了本话题中UI的源码。LayoutSample.zip文件包含了示例应用的NetBeans工程。BorderPaneBorderPane布局窗格提供了5个放置节点的区域:top,bottom,left,right,和center。图1-1展示了borderpane构建的布局样式。这些区域可以是任意大小,如果应用不需要某个区域,你可以不定义它,然后窗格就不会给这个区域分配空间。图1-1BorderPane示例borderpane可用于这种经典的外观:top:工具栏,bottom:状态栏,left:导航栏,right:附加信息,center:工作区。默认情况下,如果窗口比所有区域所需空间还大,多余的空间将被分配给中间区域。如果窗口比所需空间小,区域可能会重叠。重叠是由区域设置的顺序决定的。例如,如果区域设置的顺序是left,bottom,right,当窗口变得更小时,bottom区域会覆盖left区域,right区域会覆盖bottom区域。如果区域设置的顺序是left,right,bottom,当窗口变得更小时,bottom区域会覆盖left和right区域。例1-1展示了布局示例应用中创建borderpane的代码。创建每个区域用到的布局窗格的函数会在本话题的剩余部分介绍。例1-1创建一个BorderPane1.BorderPaneborder=newBorderPane();2.HBoxhbox=addHBox()3.border.setTop(hbox);4.border.setLeft(addVBox();5.addStackPane(hbox);/在top区域的HBox中添加stackpane6.7.border.setCenter(addGridPane();8.border.setRight(addFlowPane();注意一点,在本例中,borderpane的bottom区域并没有被使用。如果你想要在bottom区域中添加什么,可以使用下面的语句并且替换其中的节点node为你选择的控件。1.border.setBottom(node);HBoxHBox布局窗格可以让你很容易地将一系列节点排列到一行中。图1-2展示了一个HBox窗格的例子.图1-2HBox窗格示例Padding属性可以设置节点到HBox边缘的距离。Spacing可以管理节点之间的距离。Style可用来改变背景色。例1-2为一个工具栏创建了一个包含两个按钮的HBox窗格。例1-2创建一个HBox窗格1.publicHBoxaddHBox()2.HBoxhbox=newHBox();3.hbox.setPadding(newInsets(15,12,15,12);4.hbox.setSpacing(10);5.hbox.setStyle(-fx-background-color:#336699;);6.7.ButtonbuttonCurrent=newButton(Current);8.buttonCurrent.setPrefSize(100,20);9.10.ButtonbuttonProjected=newButton(Projected);11.buttonProjected.setPrefSize(100,20);12.hbox.getChildren().addAll(buttonCurrent,buttonProjected);13.14.returnhbox;15.例1-1中的setTop()函数将这个HBox窗格添加到borderpane的top区域。其结果展示在图1-3中。图1-3BorderPane中的HBoxPaneVBoxVBox布局窗格和HBox很相似,除了这里所有节点是被排列到一个列中的。图1-4展示了一个VBox窗格的示例。图1-4VBoxPane示例Padding可用于设置节点到VBox窗格边界的距离。Spacing可管理节点之间的距离。Margins可在单独的控件周围添加额外的空间。译者注:padding又称内边距、补白或留白,margin又称外边距、边界或额外空白区。它们的概念来源于CSS,即层叠样式表。从一般意义上讲,margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。margin用于布局分开元素使元素与元素互不相干;padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段“呼吸距离”。(参考文章)例1-3创建了一个包含一列选项的VBox窗格。例1-3创建一个VBoxPane1.publicVBoxaddVBox();2.VBoxvbox=newVBox();3.vbox.setPadding(newInsets(10);4.vbox.setSpacing(8);5.6.Texttitle=newText(Data);7.title.setFont(Font.font(Arial,FontWeight.BOLD,14);8.vbox.getChildren().add(title);9.10.Hyperlinkoptions=newHyperlink11.newHyperlink(Sales),12.newHyperlink(Marketing),13.newHyperlink(Distribution),14.newHyperlink(Costs);15.16.for(inti=0;i4;i+)17.VBox.setMargin(optionsi,newInsets(0,0,0,8);18.vbox.getChildren().add(optionsi);19.20.21.returnvbox;22.例1-1中的setLeft()函数将这个VBox窗格添加到了borderpane的left区域。其结果展示在图1-5中。图1-5BorderPane中的VBoxPaneStackPaneStackPane布局窗格能将所有的节点放到一个堆栈中,其中每一个新的节点被添加到前一个节点的上方。这个布局模型能让你很容易地在一个形状或图像上面覆盖一个文本,或者用常用形状互相覆盖来创建复杂的形状。图1-6展示了一个通过在一个带有渐变色背景的矩形上堆放一个问号来创建的帮助图标。图1-6StackPane示例Alignment属性可以管理stackpane中子节点的对齐方式。这个属性影响所有的子节点,所以margin可以为stack中单独的子节点调整位置。例1-4为帮助图标创建一个stackpane例1-4创建一个StackPane1.publicvoidaddStackPane(HBoxhb)2.StackPanestack=newStackPane();3.RectanglehelpIcon=newRectangle(30.0,25.0);4.helpIcon.setFill(newLinearGradient(0,0,0,1,true,CycleMethod.NO_CYCLE,5.newStop6.newStop(0,Color.web(#4977A3),7.newStop(0.5,Color.web(#B0C6DA),8.newStop(1,Color.web(#9CB6CF),);9.helpIcon.setStroke(Color.web(#D0E6FA);10.helpIcon.setArcHeight(3.5);11.helpIcon.setArcWidth(3.5);12.13.TexthelpText=newText(?);14.helpText.setFont(Font.font(Verdana,FontWeight.BOLD,18);15.helpText.setFill(Color.WHITE);16.helpText.setStroke(Color.web(#7080A0);17.18.stack.getChildren().addAll(helpIcon,helpText);19.stack.setAlignment(Pos.CENTER_RIGHT);/子节点右对齐20.StackPane.setMargin(helpText,newInsets(0,10,0,0);/中间的?21.22.hb.getChildren().add(stack);/添加到例1-2中的HBox中23.HBox.setHgrow(stack,Priority.ALWAYS);/将所有多余空间都交给stack24.例1-4中的最后几行代码将stackpane添加到了例1-2中创建的HBox窗格,并且总是将它放于窗格的最右边。结果展示在图1-7中。图1-7HBoxPane中的StackPaneGridPaneGridPane布局窗格能让你创建一个灵活的由行和列组成的网格来放置节点。节点可以被放于任何单元格内,也可以根据需要横跨多个单元格。一个gridpane对于创建表单或者任何以行和列组织的布局很有用。图1-8展示了一个包含了图标、标题、副标题、正文和图表的gridpane,gridLinesVisible属性可设置是否显示网格线,它能标识出行和列以及行列之间的间隔。这个属性对于可视化调试你的GridPane很有用。图1-8GridPane示例Gap属性可用于管理行和列之间的间隔。Padding属性可用于管理节点与网格边缘的距离。Vertical和horizontalalignment属性可用于管理单元格中单独控件的对齐方式。例1-5创建了图1-8中的gridpan。例1-5创建一个GridPane1.publicGridPaneaddGridPane()2.GridPanegrid=newGridPane();3.grid.setHgap(10);4.grid.setVgap(10);5.grid.setPadding(newInsets(0,10,0,10);6.7./Category位于column2,row18.Textcategory=newText(Sales:);9.category.setFont(Font.font(Arial,FontWeight.BOLD,20);10.grid.add(category,1,0);11.12./Title位于column3,row113.TextchartTitle=newText(CurrentYear);14.chartTitle.setFont(Font.font(Arial,FontWeight.BOLD,20);15.grid.add(chartTitle,2,0);16.17./Subtitle位于columns2-3,row218.TextchartSubtitle=newText(GoodsandServices);19.grid.add(chartSubtitle,1,1,2,1);20.21./Houseicon位于column1,rows1-222.ImageViewimageHouse=newImageView(23.newImage(LayoutSample.class.getResourceAsStream(graphics/house.png);24.grid.add(imageHouse,0,0,1,2);25.26./Leftlabel位于column1(bottom),row327.TextgoodsPercent=newText(Goodsn80%);28.GridPane.setValignment(goodsPercent,VPos.BOTTOM);29.grid.add(goodsPercent,0,2);30.31./Chart位于columns2-3,row332.ImageViewimageChart=newImageView(33.newImage(LayoutSample.class.getResourceAsStream(graphics/piechart.png);34.grid.add(imageChart,1,2,2,1);35.36./Rightlabel位于column4(top),row337.TextservicesPercent=newText(Servicesn20%);38.GridPane.setValignment(servicesPercent,VPos.TOP);39.grid.add(servicesPercent,3,2);40.41.returngrid;42.例1-1中的setCenter()函数将这个gridpane添加到了borderpane的center区域。结果展示在图1-9中。图1-9BorderPane中的GridPane当窗口缩放时,gridpane中的节点会根据它们的布局约束进行缩放。FlowPaneFlowPane中的节点会连续地排列,并且会在窗格的边界自动换行(或列)。节点可以垂直地(按列)或水平地(按行)流动。一个垂直flowpane会在窗格的高度边界上包装节点,一个水平flowpane会在窗格的水平边界上包装节点。图1-10展示了一个水平flowpane的例子,里面有多个带有数字的图标。作为对比,如果把它换成垂直flowpane,第一列会包含1-4号图标,第二列中则包含5-8号图标。译者注:包装(wrap),指在窗格的边界上发生自动换行(或换列)。图1-10水平FlowPane示例Gap属性可以管理行和列之间的间隔大小。Padding属性可以管理节点与窗格边界间的距离。例1-6为一系列页面图标创建了一个水平flowpane。例1-6创建一个FlowPane1.publicFlowPaneaddFlowPane()2.FlowPaneflow=newFlowPane();3.flow.setPadding(newInsets(5,0,5,0);4.flow.setVgap(4);5.flow.setHgap(4);6.flow.setPrefWrapLength(170);/偏好的宽度保证了只有两列7.flow.setStyle(-fx-background-color:DAE6F3;);8.9.ImageViewpages=newImageView8;10.for(inti=0;i8;i+)11.pagesi=newImageView(12.newImage(LayoutSample.class.getResourceAsStream(13.graphics/chart_+(i+1)+.png);14.flow.getChildren().add(pagesi);15.16.17.returnflow;18.例1-1中的setRight()函数将这个水平flowpane添加到了borderpane的right区域。其结果展示在图1-11中。图1-11BorderPane中的FlowPaneTilePaneTilepane和flowpane很相似。TilePane布局将所有的节点放于一个网格中,并且每个单元格(或tile)保持一致的大小。节点可以水平方式(按行)排列或以竖直方式(按列)排列。水平布局会在tilepane的宽度边界上包装节点,竖直布局会在高度边界上包装节点。使用prefColumns和prefRows属性可设定窗格的偏好大小。Gap属性可以管理行或列之间的间隔。Padding属性可以管理节点与窗格边界的距离。例1-7创建了一个水平tilepane,形成了与图1-10一样的布局。例1-7创建一个TilePane1.TilePanetile=newTilePane();2.tile.setPadding(newInsets(5,0,5,0);3.tile.setVgap(4);4.tile.setHgap(4);5.tile.setPrefColumns(2);6.tile.setStyle(-fx-background-color:DAE6F3;);7.8.ImageViewpages=newImageView8;9.for(inti=0;i8;i+)10.pagesi=newImageView(11.newImage(LayoutSample.class.getResourceAsStream(12.graphics/chart_+(i+1)+.png);13.tile.getChildren().add(pagesi);14.AnchorPaneAnchorPane布局窗格能让你将节点锚定到窗格的顶部、底部、左侧、右侧或者中间。当窗口缩放时,节点会保持其相对于锚点的位置。节点可被锚定到多个位置,并且同一位置可以锚定多个节点。图1-12展示了一个anchorpane,它带有一个GridPane部分用到的gridpane和一个包含两个按钮的HBox,它们分别被锚定到了窗格的顶部和右下角。图1-12AnchorPane示例例1-8创建了一个anchorpane,其中有一个节点被锚定到了窗格顶部,另一个节点被锚定到了窗格右下角。这里用了例1-5里面创建的gridpane作为top节点。例1-8创建一个AnchorPane1.publicAnchorPaneaddAnchorPane(GridPanegrid)2.AnchorPaneanchorpane=newAnchorPane();3.ButtonbuttonSave=newButton(Save);4.ButtonbuttonCancel=newButton(Cancel);5.6.HBoxhb=newHBox();7.hb.setPadding(newInsets(0,10,10,10);8.hb.setSpacing(10);9.hb.getChildren().addAll(buttonSave,buttonCancel);10.11.anchorpane.getChildren().addAll(grid,hb);/添加例1-5中的gridpane12.AnchorPane.setBottomAnchor(hb,8.0);13.AnchorPane.setRightAnchor(hb,5.0);14.AnchorPane.setTopAnchor(grid,10.0);15.16.returnanchorpane;17.下面的语句将borderpane的center区域替换成了这个anchorpane。1.border.setCenter(addAnchorPane(addGridPane();其结果展示在图1-13中。图1-13BorderPane中的AnchorPane当窗口缩放时,节点会根据它们的锚点保持各自的位置。从图1-14中可以看出来,当窗口变小时,被锚定到窗格底部的按钮移动到了离sales信息更近的位置。图1-14缩放后的AnchorPane二、控制节点的大小和对齐使用JavaFx内置布局窗格的一个主要优点是节点的大小和对齐可以交给窗格来完成。当窗格发生了缩放,节点会依据其偏好的尺寸范围进行缩放。注意,不是所有节点都可以缩放。UI控件和布局窗格可以缩放,但是形状、Text对象、Group对象是不可缩放的,它们在布局中被视为刚体。如果你想要在你的UI中做更多的尺寸控制,你可以直接设置它们的偏好尺寸范围。然后布局窗格会使用你的这些设定决定控件的尺寸。要管理控件的位置,你可以使用布局窗格的对齐属性。本话题针对节点的尺寸控制和对齐控制提供了简单示例。LayoutSizingAligning.java文件包含了本话题中使用的示例源码,LayoutSizingAligning.zip文件包含了这个示例的NetBeans工程。控制节点的大小布局通过调用prefWidth(height)andprefHeight(width)函数来获取节点的偏好尺寸。默认情况下,UI控件会基于其中的内容计算出默认的尺寸,并将它作为偏好尺寸。例如,一个Button对象计算出来的尺寸是由文本的长度、label中使用的字体,以及可能加入的图像的尺寸共同决定的。通常情况下,计算出来的尺寸应该刚好能让控件和label完全显示出来。UI控件也提供了默认的最小尺寸和最大尺寸,这是由控件的特定用途决定的。例如,一个Button对象的最大尺寸在默认情况下被设为其偏好尺寸,因为你通常不希望按钮增长到任意大。但是,一个ScrollPane对象的最大尺寸是没有限制的,因为通常你需要它们增长并填补空间。你可以使用节点默认的尺寸限制,也可以自行设置这些值来达到你想要的效果。例如,图2-1展示了一个borderpane,里面有多个按钮和一个listview,它们都具有默认的大小。图2-1计算出来的尺寸假设你想要的外观是图2-2那样的,其中的UI控件根据你想要的约束调整其大小。图2-2需要的尺寸应用程序经常需要直接为控件设置最小尺寸、偏好尺寸以及最大尺寸的约束。以下部分给出了有关覆盖计算尺寸、自定义外观的提示。把按钮设为相同尺寸你可能遇到过确定每个按钮宽高的问题,并且你可能会将每个按钮的宽高设为这个按钮集合中最大的宽高。实际上更简单的做法是将这些工作交给布局窗格来完成。至于究竟用哪种窗格,这完全是由你想要实现的效果决定的。使用VBox图2-1中的场景为右边的按钮建立了一个VBox布局窗格,并且使用了按钮的计算尺寸。这些按钮已经有了相同的高度,所以我们只需要调整一下宽度。图2-2中的场景使用了一个VBox窗格,VBox窗格在默认情况下会让其宽度和最宽元素的偏好宽度相同,我们充分利用了这个特性。为了让所有的按钮都被缩放到VBox窗格的宽度,每个按钮的最大宽度被设为了Double.MAX_VALUE这个常量,这能让一个控件无限地增长。当然也可以不使用最大值常量,而是将最大宽度设为一个特定值,比如80.0。例2-1展示了如何用一个VBox窗格建立一列具有相同宽度的按钮。例2-1将一列按钮设为相同宽度1.BorderPaneborder=newBorderPane();2.border.setPadding(newInsets(20,0,20,20);3.4.ButtonbtnAdd=newButton(Add);5.ButtonbtnDelete=newButton(Delete);6.ButtonbtnMoveUp=newButton(MoveUp);7.ButtonbtnMoveDown=newButton(MoveDown);8.9.btnAdd.setMaxWidth(Double.MAX_VALUE);10.btnDelete.setMaxWidth(Double.MAX_VALUE);11.btnMoveUp.setMaxWidth(Double.MAX_VALUE);12.btnMoveDown.setMaxWidth(Double.MAX_VALUE);13.14.VBoxvbButtons=newVBox();15.vbButtons.setSpacing(10);16.vbButtons.setPadding(newInsets(0,20,10,20);17.vbButtons.getChildren().addAll(btnAdd,btnDelete,btnMoveUp,btnMoveDown);在本示例程序中,UI中的元素使用了一个borderpane来布局。这一列按钮被置于borderpane的right区域,从而将按钮的宽度限制在最宽按钮的偏好宽度。borderpane的center区域会自动扩展来填充任何可用的空间,所以如果你将这个VBox放在center区域中,VBox窗格和其中的按钮都会自动扩展。使用TilePane图2-1中的场景使用了一个HBox布局窗格来布局底部的按钮,并使用了按钮的计算尺寸。这些按钮有不同的宽高。图2-2中的场景使用了一个水平TilePane布局窗格,它在默认情况下会让每个小格(或cell)具有相同的尺寸,我们充分利用了这个特性。每个小格的尺寸刚好能容纳下窗格中最大节点的偏好尺寸。为了让这些按钮缩放到小格的尺寸,我们只需将它们的最大宽度和最大高度设为Double.MAX_VALUE这个常量。例2-2展示了如何使用一个tilepane来创建一行具有相同宽高的按钮。例2-2将一行按钮设为相同宽高1.ButtonbtnApply=newButton(Apply);2.ButtonbtnContinue=newButton(Continue);3.ButtonbtnExit=newButton(Exit);4.btnExit.setStyle(-fx-font-size:15pt;);5.6.btnApply.setMaxSize(Double.MAX_VALUE,Double.MAX_VALUE);7.btnContinue.setMaxSize(Double.MAX_VALUE,Double.MAX_VALUE);8.btnExit.setMaxSize(Double.MAX_VALUE,Double.MAX_VALUE);9.10.TilePanetileButtons=newTilePane(Orientation.HORIZONTAL);11.tileButtons.setPadding(newInsets(20,10,20,0);12.tileButtons.setHgap(10.0);13.tileButtons.setVGap(8.0);14.tileButtons.getChildren().addAll(btnApply,btnContinue,btnExit);Tilepane中的小格不会在窗口缩放时进行缩放,所以如果按钮被置于tilepane中,它们的大小将不会发生变化。注意一点,如果窗口的宽度变窄,tilepane中按钮会发生位置的变化,但不会变小。将节点保持在偏好大小上当stage缩放时,stage中的布局窗格可能会将或多或少的空间分配给其中的控件。每个布局窗格有各自分配空间的规则,它会根据其中控件的最小尺寸、偏好尺寸、最大尺寸进行分配。通常情况下,最大尺寸为Double.MAX_VALUE的控件会扩展并填充空余的空间,而最大尺寸有限制的控件则不会扩展。例如,一个ListView对象的最大尺寸为无限,如果你想要限制它的高度为它的偏好尺寸,你可以将它的最大尺寸设为Control.USE_PREF_SIZE常数,就像例2-3中展示的那样。例2-3将最大高度设为偏好高度1.ListViewlvList=newListView();2.ObservableListitems=FXCollections.observableArrayList(3.Hotdog,Hamburger,Frenchfries,4.Carrotsticks,Chickensalad);5.lvList.setItems(items);6.lvList.setMaxHeight(Control.USE_PREF_SIZE);默认情况下,按钮会增长到它的偏好大小。但是,如果没有覆盖按钮的最小宽度,它会缩小到只显示三个点(.)。为了防止一个按钮的宽度变得比偏好宽度还要小,可以将它的最小宽度设为偏好宽度,就像例2-4那样。例2-4将最小宽度设为偏好宽度。1.ButtonbtnMoveDown=newButton(MoveDown);2.btnMoveDown.setMinWidth(Control.USE_PREF_SIZE);一个控件的偏好尺寸一开始是基于计算出来的结果的。你可以覆盖默认设置,并设置偏好尺寸为你想要的尺寸。以下语句覆盖了一个listview的偏好宽度。1.lvList.setPrefWidth(150.0);防止缩放如果你不想让一个控件的大小发生变化,可以将它的最小尺寸、最大尺寸和偏好尺寸都设为一样的大小。如果仅仅要防止宽度(或高度)改变,只需将宽度(或高度)的约束尺寸设为相同值。在例2-5中,我们创建了一个所有尺寸约束都是相同宽高的list,那么这个list的大小将不会随着窗口的缩放而缩放。我们还创建了一个所有宽度约束都设为相同值的按钮。例2-5设置尺寸约束来防止缩放1.ListViewlvList=newListView();2.lvList.setMinSize(150.0,Control.USE_PREF_SIZE);3.lvList.setMaxSize(150.0,Control.USE_PREF_SIZE);4.5.ButtonbtnDelete=newButton(Delete);6.btnDelete.setMinWidth(80.0);7.btnDelete.setPrefWidth(80.0);8.btnDelete.setMaxWidth(80.0);对齐内容每个布局窗格都有一个默认的对齐其中节点的方式。例如,在HBox和VBox布局窗格中,节点是顶部对齐和左对齐的。在TilePane和FlowPane中,节点是居中对齐的。窗格本身一般默认是顶部对齐和左对齐的。你可以通过使用窗格的setAlignment()函数来管理节点和窗格的对齐方式。以下是javafx.geometry包中的一些enum类,其中包含了很多控制对齐的常量:HPos-包含了确定水平对齐的值。Pos-包含了确定水平及竖直对齐的值。其中下划线左侧的值确定了竖直对齐方式,下划线右侧的值确定了水平对齐方式。例如,Pos.BOTTOM_LEFT将一个节点在垂直方向上置于底部,水平方向上置于最左边。VPos-包含了确定竖直对齐的值。图2-3是通过例2-6中的代码建立的,如果不指定任何的对齐约束,布局窗格被置于左上角。图2-3默认的位置例2-6创建一个采用默认对齐方式的UI1.GridPanegrid=newGridPane();2.grid.setHgap(10);3.grid.setVgap(12);4.5.HBoxhbButtons=newHBox();6.hbButtons.setSpacing(10.0);7.8.ButtonbtnSubmit=newButton(Submit);9.ButtonbtnClear=newButton(Clear);10.ButtonbtnExit=newButton(Exit);11.btnSubmit.setStyle(-fx-font-size:15pt;);12.13.LabellblName=newLabel(Username:);14.TextFieldtfName=newTextField();15.LabellblPwd=newLabel(Password:);16.PasswordFieldpfPwd=newPasswordField();17.18.hbButtons.getChildren().addAll(btnSubmit,btnClear,btnExit);19.grid.add(lblName,0,0);20.grid.add(tfName,1,0);21.grid.add(lblPwd,0,1);22.grid.add(pfPwd,1,1);23.grid.add(hbButtons,0,2,2,1);24.假设你想要的外观是像图2-4那样的,将布局窗格居中对齐,并且改变控件默认的对齐方式。图2-4需要的位置以下部分提供了一些有关覆盖默认位置的小提示。将Grid居中为了居中例2-6中场景里的grid,可使用如下语句:1.grid.setAlignment(Pos.CENTER);对齐列中的控件在想要实现的布局中,label是右对齐的,field是左对齐的。为了在grid中实现这一点,可使用ColumnConstraints类来定义每个列并设置水平对齐约束。例2-7为例2-6中的grid定义了列。例2-7定义grid中的列1.GridPanegrid=newGridPane();2.grid.setAlignment(Pos.CENTER);3.grid.setHgap(10);4.grid.setVgap(12);5.6.ColumnConstraintscolumn1=newColumnConstraints();7.column1.setHalignment(HPos.RIGHT);8.grid.getColumnConstraints().add(column1);9.10.ColumnConstraintscolumn2=newColumnConstraints();11.column2.setHalignment(HPos.LEFT);12.grid.getColumnConstraints().add(column2);另一个让一列中的控件右对齐的方式是使用一个VBox布局窗格,然后使用setAlignment()函数,就像下面语句中那样:1.VBoxvbox=newVBox;2.vbox.setAlignment(Pos.CENTER_RIGHT);居中按钮按钮被置于一个HBox窗格中,这个窗格在grid中横跨了两列。下列语句将例2-6中grid里的按钮居中对齐:1.hbButtons.setAlignment(Pos.CENTER);HBox窗格的setAlignment()函数会将HBox在其布局空间中居中对齐,并且它也会将其内部的节点居中对齐。你可能更希望不仅这个HBox在这一行中居中,并且其中的按钮还能在底部对齐,就像图2-5中那样。图2-5覆盖默认位置并将按钮向底部对齐为了实现这样的布局,可以将这个HBox置于一个只包含一个小格的内部grid中,并将这个grid置于外层grid的第三行中。然后在内部grid上设置对齐约束来将它居中对齐,并且在HBox中设置一个对齐约束来将其中的内容向底部对齐,就像例2-8中那样。例2-8将按钮居中并向底部对齐1.hbButtons.setAlignment(Pos.BOTTOM_CENTER);2.hbButtons.getChildren().addAll(btnSubmit,btnClear,btnExit);3.4.GridPaneinnergrid=newGridPane();5.innergrid.setAlignment(Pos.CENTER);6.innergrid.add(hbButtons,0,0);7.grid.add(innergrid,0,2,2,1);二、用CSS设定布局窗格的样式布局窗格使用了诸如padding,spacing,和alignment这些属性来管理窗格的外观元素。层叠样式表(CSS)能让你定义一些属性,并将这些属性应用于多个布局窗格上,这可以为你的JavaFx程序提供一个统一的外观。你也可以使用CSS自定义单独的布局窗格。本话题使用了使用内置布局窗格中的示例,来向您展示使用CSS为不同布局窗格定义样式的例子。图3-1展示了我们创建的新样式。图3-1采用自定义样式的布局示例LayoutSampleCSS.java包含了建立这个UI的源码。LayoutSampleCSS.zip包含了这个示例程序的NetBeans工程。创建样式定义不像button、checkbox这些控件,它们都有着各自的样式类.button和.check-box等等,布局窗格没有预定义的样式类。要想为你的布局窗格定义样式,你必须创建一个样式表并定义你想要用的样式类。然后,在你的代码中,当你创建这些窗格时,将合适的样式类应用上去。例如,你如果想要你所有的HBox窗格拥有相同的背景色,padding和spacing属性,可以创建一个名为.hbox的样式类,如例3-1。例3-1HBox窗格的示例样式1.hbox2.-fx-background-c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年征地超长合同(1篇)
- 工会四个制度
- 居委会议事协商制度
- 护理人员技能培训
- 角膜移植的排斥反应
- 2026三河辅警笔试题目及答案
- 2026年山东省春季高考数学《平面向量》专项训练(含答案解析)
- 线上线下整合营销实施方案
- 2026年幼儿园班务汇报
- 2026年幼儿园武术普及
- 2025年北京市公务员笔试真题及答案
- 2026四川省遂宁经创投资集团有限公司招聘工作人员24名笔试模拟试题及答案解析
- 2026年广东省肇庆中学自主招生考试物理试卷真题(含答案详解)
- 2025年四川省党政领导干部政治理论水平考试(理论测试)历年参考题库含答案详解
- 驻定点屠宰场官方兽医工作制度
- 危重患者早期活动与康复护理
- 中国主动脉夹层诊疗指南(2025版)
- 高中英语教招题目及答案
- 叉车培训资料大全
- 福建省部分地市2026届高中毕业班第一次质量检测英语试题及答案
- 2026年时事政治测试题库及答案【有一套】
评论
0/150
提交评论