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