在JavaFX中使用布局.doc
《在JavaFX中使用布局.doc》由会员分享,可在线阅读,更多相关《在JavaFX中使用布局.doc(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流在JavaFX中使用布局.精品文档.在JavaFX中使用布局一、用内置布局窗格一个JavaFx应用可以通过设置每个UI元素的位置和大小来手动地布局用户界面。但是,一个更简单的做法是使用布局窗格。JavaFx SDK提供了多种布局容器类,叫做窗格,它们可简化对一些经典布局的设置和管理,例如行、列、堆叠、平铺等等。当窗口缩放时,布局窗格会自动地根据节点属性重设其包含的所有节点的位置和大小。本话题为JavaFx layout包中提供的的每个布局窗格都给出了相应的概述和简单的示例。LayoutSample.java文件包含了本话题中UI的源码。Lay
2、outSample.zip文件包含了示例应用的NetBeans工程。BorderPaneBorderPane布局窗格提供了5个放置节点的区域:top, bottom, left, right, 和 center。图 1-1展示了border pane构建的布局样式。这些区域可以是任意大小,如果应用不需要某个区域,你可以不定义它,然后窗格就不会给这个区域分配空间。图 1-1 Border Pane 示例border pane可用于这种经典的外观:top:工具栏,bottom:状态栏,left:导航栏,right:附加信息,center:工作区。默认情况下,如果窗口比所有区域所需空间还大,多余的空
3、间将被分配给中间区域。如果窗口比所需空间小,区域可能会重叠。重叠是由区域设置的顺序决定的。例如,如果区域设置的顺序是 left, bottom, right,当窗口变得更小时,bottom区域会覆盖left区域,right区域会覆盖bottom区域。如果区域设置的顺序是 left, right, bottom,当窗口变得更小时,bottom区域会覆盖left和right区域。例 1-1展示了布局示例应用中创建border pane的代码。创建每个区域用到的布局窗格的函数会在本话题的剩余部分介绍。例 1-1 创建一个 Border Pane1. BorderPane border = new B
4、orderPane();2. HBox hbox = addHBox()3. border.setTop(hbox);4. border.setLeft(addVBox();5. addStackPane(hbox); / 在top区域的HBox中添加stack pane6. border.setCenter(addGridPane();7. border.setRight(addFlowPane();注意一点,在本例中,border pane的bottom区域并没有被使用。如果你想要在bottom区域中添加什么,可以使用下面的语句并且替换其中的节点node为你选择的控件。1. border.
5、setBottom(node);HBoxHBox布局窗格可以让你很容易地将一系列节点排列到一行中。图 1-2展示了一个HBox窗格的例子.图 1-2 HBox 窗格示例Padding 属性可以设置节点到HBox边缘的距离。 Spacing 可以管理节点之间的距离。Style可用来改变背景色。例 1-2为一个工具栏创建了一个包含两个按钮的HBox窗格。例 1-2 创建一个 HBox 窗格1. public HBox addHBox() 2. HBox hbox = new HBox();3. hbox.setPadding(new Insets(15, 12, 15, 12);4. hbox.s
6、etSpacing(10);5. hbox.setStyle(-fx-background-color: #336699;);6. Button buttonCurrent = new Button(Current);7. buttonCurrent.setPrefSize(100, 20);8. Button buttonProjected = new Button(Projected);9. buttonProjected.setPrefSize(100, 20);10. hbox.getChildren().addAll(buttonCurrent, buttonProjected);1
7、1. return hbox;例 1-1中的setTop()函数将这个HBox窗格添加到border pane的top区域。其结果展示在图 1-3中。图 1-3 Border Pane 中的 HBox PaneVBoxVBox布局窗格和HBox很相似,除了这里所有节点是被排列到一个列中的。图 1-4展示了一个VBox窗格的示例。图 1-4 VBox Pane示例Padding 可用于设置节点到VBox窗格边界的距离。 Spacing可管理节点之间的距离。 Margins 可在单独的控件周围添加额外的空间。译者注:padding又称内边距、补白或留白,margin又称外边距、边界或额外空白区。它
8、们的概念来源于CSS,即层叠样式表。从一般意义上讲,margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。margin用于布局分开元素使元素与元素互不相干;padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段“呼吸距离”。(参考文章)例 1-3创建了一个包含一列选项的VBox窗格。例 1-3 创建一个VBox Pane1. public VBox addVBox(); 2. VBox vbox = new VBox();3. vbox.setPadding(new Insets(10);4. vbox.setSpacing(8);5. Te
9、xt title = new Text(Data);6. title.setFont(Font.font(Arial, FontWeight.BOLD, 14);7. vbox.getChildren().add(title);8. Hyperlink options = new Hyperlink 9. new Hyperlink(Sales),10. new Hyperlink(Marketing),11. new Hyperlink(Distribution),12. new Hyperlink(Costs);13. for (int i=0; i4; i+) 14. VBox.setM
10、argin(optionsi, new Insets(0, 0, 0, 8);15. vbox.getChildren().add(optionsi);16. return vbox;例 1-1中的setLeft()函数将这个VBox窗格添加到了border pane的left区域。其结果展示在图 1-5中。图 1-5 Border Pane 中的 VBox PaneStackPaneStackPane布局窗格能将所有的节点放到一个堆栈中,其中每一个新的节点被添加到前一个节点的上方。这个布局模型能让你很容易地在一个形状或图像上面覆盖一个文本,或者用常用形状互相覆盖来创建复杂的形状。图 1-6展
11、示了一个通过在一个带有渐变色背景的矩形上堆放一个问号来创建的帮助图标。图 1-6 Stack Pane 示例Alignment 属性可以管理stack pane中子节点的对齐方式。这个属性影响所有的子节点,所以margin可以为stack中单独的子节点调整位置。例 1-4为帮助图标创建一个stack pane例 1-4 创建一个 Stack Pane1. public void addStackPane(HBox hb) 2. StackPane stack = new StackPane();3. Rectangle helpIcon = new Rectangle(30.0, 25.0);
12、4. helpIcon.setFill(new LinearGradient(0,0,0,1, true, CycleMethod.NO_CYCLE,5. new Stop6. new Stop(0,Color.web(#4977A3),7. new Stop(0.5, Color.web(#B0C6DA),8. new Stop(1,Color.web(#9CB6CF),);9. helpIcon.setStroke(Color.web(#D0E6FA);10. helpIcon.setArcHeight(3.5);11. helpIcon.setArcWidth(3.5);12. Text
13、 helpText = new Text(?);13. helpText.setFont(Font.font(Verdana, FontWeight.BOLD, 18);14. helpText.setFill(Color.WHITE);15. helpText.setStroke(Color.web(#7080A0); 16. stack.getChildren().addAll(helpIcon, helpText);17. stack.setAlignment(Pos.CENTER_RIGHT); / 子节点右对齐18. StackPane.setMargin(helpText, new
14、 Insets(0, 10, 0, 0); / 中间的 ?19. hb.getChildren().add(stack); / 添加到 例 1-2 中的HBox中20. HBox.setHgrow(stack, Priority.ALWAYS); / 将所有多余空间都交给stack例 1-4中的最后几行代码将stack pane添加到了例 1-2中创建的HBox窗格,并且总是将它放于窗格的最右边。结果展示在图 1-7中。图 1-7 HBox Pane 中的 Stack PaneGridPaneGridPane布局窗格能让你创建一个灵活的由行和列组成的网格来放置节点。节点可以被放于任何单元格内,
15、也可以根据需要横跨多个单元格。一个grid pane对于创建表单或者任何以行和列组织的布局很有用。图 1-8展示了一个包含了图标、标题、副标题、正文和图表的grid pane,gridLinesVisible属性可设置是否显示网格线,它能标识出行和列以及行列之间的间隔。这个属性对于可视化调试你的GridPane很有用。图 1-8 Grid Pane示例Gap属性可用于管理行和列之间的间隔。Padding属性可用于管理节点与网格边缘的距离。Vertical和horizontal alignment属性可用于管理单元格中单独控件的对齐方式。例 1-5创建了图 1-8中的grid pan。例 1-5
16、 创建一个 Grid Pane1. public GridPane addGridPane() 2. GridPane grid = new GridPane();3. grid.setHgap(10);4. grid.setVgap(10);5. grid.setPadding(new Insets(0, 10, 0, 10);6. / Category 位于 column 2, row 17. Text category = new Text(Sales:);8. category.setFont(Font.font(Arial, FontWeight.BOLD, 20);9. grid.
17、add(category, 1, 0); 10. / Title 位于 column 3, row 111. Text chartTitle = new Text(Current Year);12. chartTitle.setFont(Font.font(Arial, FontWeight.BOLD, 20);13. grid.add(chartTitle, 2, 0);14. / Subtitle 位于 columns 2-3, row 215. Text chartSubtitle = new Text(Goods and Services);16. grid.add(chartSubt
18、itle, 1, 1, 2, 1);17. / House icon 位于 column 1, rows 1-218. ImageView imageHouse = new ImageView(19. new Image(LayoutSample.class.getResourceAsStream(graphics/house.png);20. grid.add(imageHouse, 0, 0, 1, 2); 21. / Left label 位于 column 1 (bottom), row 322. Text goodsPercent = new Text(Goodsn80%);23.
19、GridPane.setValignment(goodsPercent, VPos.BOTTOM);24. grid.add(goodsPercent, 0, 2); 25. / Chart 位于 columns 2-3, row 326. ImageView imageChart = new ImageView(27. new Image(LayoutSample.class.getResourceAsStream(graphics/piechart.png);28. grid.add(imageChart, 1, 2, 2, 1); 29. / Right label 位于 column
20、4 (top), row 330. Text servicesPercent = new Text(Servicesn20%);31. GridPane.setValignment(servicesPercent, VPos.TOP);32. grid.add(servicesPercent, 3, 2);33. return grid;例 1-1中的setCenter()函数将这个grid pane添加到了border pane的center区域。 结果展示在图 1-9中。图 1-9 Border Pane中的Grid Pane当窗口缩放时,grid pane中的节点会根据它们的布局约束进行
21、缩放。FlowPaneFlowPane中的节点会连续地排列,并且会在窗格的边界自动换行(或列)。节点可以垂直地(按列)或水平地(按行)流动。一个垂直flow pane会在窗格的高度边界上包装节点,一个水平flow pane会在窗格的水平边界上包装节点。图 1-10展示了一个水平flow pane的例子,里面有多个带有数字的图标。作为对比,如果把它换成垂直flow pane,第一列会包含1-4号图标,第二列中则包含5-8号图标。译者注:包装(wrap),指在窗格的边界上发生自动换行(或换列)。图 1-10 水平 Flow Pane 示例Gap属性可以管理行和列之间的间隔大小。Padding属性可
22、以管理节点与窗格边界间的距离。例 1-6为一系列页面图标创建了一个水平flow pane。例 1-6 创建一个 Flow Pane1. public FlowPane addFlowPane() 2. FlowPane flow = new FlowPane();3. flow.setPadding(new Insets(5, 0, 5, 0);4. flow.setVgap(4);5. flow.setHgap(4);6. flow.setPrefWrapLength(170); / 偏好的宽度保证了只有两列7. flow.setStyle(-fx-background-color: DAE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JavaFX 使用 布局
限制150内