java动态执行sql java动态执行方法
本教程详细阐述了如何在JavaFX中管理GridPane的列和行,动态包括添加、设置尺寸约束以及实现自适应布局。我们将探讨ColumnConstraints和RowConstraints的正确使用方法,修正常见错误,并提供实用的代码示例,帮助开发者构建可灵活调整大小的用户界面。JavaFX GridPane与行约束解
在JavaFX应用开发中,GridPane是一个功能强大的布局容器,它允许以网格形式组织UI元素。然而,当需要动态调整列网格的列数或行数,并确保其内容能够自适应窗口大小时,许多开发者会遇到挑战。本节将深入探讨如何正确管理GridPane的尺寸ColumnConstraints和RowConstraints。理解ColumnConstraints和 RowConstraints
ColumnConstraints和RowConstraints是JavaFX中定义用于GridPane中列和行为行的关键对象。它们允许我们指定列的宽度或行的高度,包括固定尺寸、最小/最大尺寸以及百分比尺寸。setPrefWidth(double value) / setPrefHeight(double value):设置列或行的宽度/高度。setMinWidth(double value) / setMinHeight(double value): setMaxWidth(double value) / setMaxHeight(double value): 设置列或行的最大宽度/高度。setPercentWidth(double value) / setPercentHeight(double value): 设置列或行占GridPane总宽/高的百分比。这是实现自适应布局的按键。setHgrow(Priority value) / setVgrow(Priority value): 当GridPane有额外空间时,指定列或行如何增长。动态添加列与行的常见错误区与正确实践
开发者在尝试动态添加列或行时,常犯一个错误,在循环中重复使用同一个ColumnConstraints或RowConstraints对象,然后将其添加到GridPane中。会导致GridPane只添加一次该约束,或者在某些情况下行为异常,因为它要求每个列或行都有一个独立的约束对象。
错误示例分析(古巴问题描述):
立即学习“Java免费学习笔记(深入)”;public void changeGameBoard(ActionEvent event) { if (boardNumber gt; 2) { boardNumber = 50; // 假设要创建50x50的网格 // ... ColumnConstraints column1 = new ColumnConstraints(); RowConstraints row1 = new RowConstraints(); for (int i = 0; i lt; boardNumber; i ) { column1.setPrefWidth(100); // 火焰循环都设置同一个对象的属性 row1.setPrefHeight((100)); // 火焰循环都设置同一个对象的属性 } gameBoard.getColumnConstraints().add(column1); //最终只添加了这一个对象gameBoard.getRowConstraints().add(row1); //最终只添加了这一个对象 gameBoard.setMinSize(500,500); //设置GridPane的最小尺寸}}登录后复制
上述代码的问题提出,column1和row1对象在循环外部只被创建了一次。循环内部只是反复修改了这两个对象的属性,而最终gameBoard.getColumnConstraints().add(column1)和gameBoard.getRowConstraints().add(row1)也只将这两者一个唯一的对象添加了一次。,GridPane有一个列约束和一个行约束,而不是期望的boardNumber个。
正确的做法:动态生成并添加独立的约束对象
要动态创建N行N列的GridPane,我们需要在循环中为每一列和每一行创建新的ColumnConstraints和RowConstraints实例。
以下是一个创建N x N GridPane的示例,其中每列和每行都触发了宽度/高度,从而实现自适应布局:import javafx.application.Application;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.layout.ColumnConstraints;import javafx.scene.layout.GridPane;import javafx.scene.layout.GridPane;import javafx.scene.layout.GridPane javafx.scene.layout.Priority;import javafx.scene.layout.RowConstraints;import javafx.stage.Stage;public class DynamicGridPaneExample extends Application { private GridPane gameBoard; private int currentBoardSize = 3; // 初始网格大小 @Override public void start(Stage PrimaryStage) { gameBoard = new GridPane(); gameBoard.setGridLinesVisible(true); //否观察网格线 // 最初设置一个3x3的网格 setupGameBoard(currentBoardSize); Button resizeButton = new Button(quot;Resize to 5x5quot;); resizeButton.setOnAction(e -gt; { currentBoardSize = 5; setupGameBoard(currentBoardSize); // 重新设置网格 }); Button resizeTo8Button = new Button(quot;Resize to 8x8quot;); resizeTo8Button.setOnAction(e -gt; { currentBoardSize = 8; setupGameBoard(currentBoardSize); // 重新设置网格 }); GridPane root = new GridPane(); root.add(gameBoard, 0, 0); root.add(resizeButton, 0, 1); root.add(resizeTo8Button, 0, 2); //设置根布局的列和行约束,确保gameBoard的功能扩展ColumnConstraints rootCol = new ColumnConstraints(); rootCol.setHgrow(Priority.ALWAY
S); root.getColumnConstraints().add(rootCol); RowConstraints rootRow1 = new RowConstraints(); rootRow1.setVgrow(Priority.ALWAYS); root.getRowConstraints().add(rootRow1); // 其他行的约束可以不设置Vgrow,让它们保持默认高度 Scene scene = new Scene(root, 600, 600);primaryStage.setTitle(“JavaFX Dynamic GridPane”;);primaryStage.setScene(scene);primaryStage.show(); } /** * 根据指定大小设置或重置GridPane的列和行约束。
* @param size 网格的边长(例如,3表示3x3) */ private void setupGameBoard(int size) { // 清除现有的所有列和行约束,为新的配置做准备 gameBoard.getColumnConstraints().clear(); gameBoard.getRowConstraints().clear(); gameBoard.getChildren().clear(); // 清除GridPane中的所有子节点,如果需要双百分比 = 100.0 / size; // 计算每列/行应占人口 for (int i = 0; i lt; size; i ) { ColumnConstraints colConstraints = new ColumnConstraints(); colConstraints.setPercentWidth(percent); // 设置人口宽度 colConstraints.setHgrow(Priority.ALWAYS); // 允许列增长水平gameBoard.getColumnConstraints().add(colConstraints); RowConstraints rowConstraints = new RowConstraints(); rowConstraints.setPercentHeight(percent); // 设置百分比高度 rowConstraints.setVgrow(Priority.ALWAYS); // 允许行垂直增长 gameBoard.getRowConstraints().add(rowConstraints); // 任选:为每个单元格添加一个占位符,便于更好地观察(int j = 0; j lt; size; j ) { Button cellButton = new Button(i quot;,quot; j); cellButton.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); // 按钮填充单元格 gameBoard.add(cellButton, j, i); // 注意:add(Node child, int columnIndex, int rowIndex) } } //设置GridPane的最小尺寸,但主要尺寸由其内容和父容器决定 // gameBoard.setMinSize(size * 100, size * 100); // 如果需要一个基础的最小尺寸 } public static void main
(String[] args) { launch(args); }}登录后复制
代码解析:setupGameBoard(int size) 方法:这是核心逻辑。gameBoard.getColumnConstraints().clear();和 gameBoard.getRowConstraints().clear();:在重新配置网格之前,一定要清除所有现有的约束。这确保了每次调用setupGameBoard时,GridPane都会从一个干净的状态开始。gameBoard.getChildren().clear();:如果你的GridPane中已经放置了UI元素,并且你希望在改变网格大小时重新布局或清除它们,需要调用此方法。double% = 100.0 / size;:计算每个列/行应占的百分比。使用100.0确保浮点数除法。循环创建新实例:在for循环中,每次迭代都创建new ColumnConstraints()和new setPercentWidth() 和 setPercentHeight():这是实现GridPane及其内容窗口大小的关键。当GridPane的父容器或Scene的大小改变时,这些列和行的大小会自动调整。setHgrow(Priority.ALWAYS) 和 setVgrow(Priority.ALWAYS):这些属性告诉布局管理器,当有额外的空间时,这些列或行应该优先生长。这有助于保证它们能够填充可用空间。添加占位符:示例中为每个单元格添加了一个按钮,并设置setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE),这使得按钮能够完全填充其所在的网格单元格,从而绘制地显示网格的伸缩效果。窗口和GridPane的尺寸调整GridPane自身的尺寸: GridPane的实际尺寸通常由其内容(子节点)和其父容器的策略布局共同决定。setMinSize(width, height)、setPrefSize(width,高度)、setMaxSize(宽度, height)可以为GridPane设置最小、首选和最大尺寸。但是,如果GridPane的列和行约束都设置为百分比,并且其父容器允许其增长,那么GridPane需要填充父容器的空间,而setMinSize等属性更多是作作为一种建议或限制。父容器和Scene的尺寸:确保GridPane的父容器(例如,一个VBox、HBox、BorderPane或另一个GridPane)也配置了适当的增长策略(如VBox.setVgrow(gameBoard, Priority.ALWAYS)或ColumnConstraints/RowConstraints的Hgrow/Vgrow)。场景的尺寸(在Stage中设置)决定了窗口的整体大小。当窗口大小改变时,场景会重新布局其根节点,重点影响到内部所有子节点的布局。
通过结合使用点数约束和Priority.ALWAYS,可以构建出高度响应式和先进的JavaFX界面。
总结与事项注意为每个列/行创建独立约束:在动态生成GridPane时,务必在循环中为每个列和行创建new ColumnConstraints()和new RowConstraints()实例。使用百分比约束实现:setPercentWidth()和setPercentHeight()是实现GridPane内部模块格自适应窗口大小的按键。清除现有约束:在重新配置GridPane的列和行,始终调用gameBoard.getColumnConstraints().clear()和gameBoard.getRowConstraints().clear()。考虑子节点清理:如果改变网格大小意味着旧的UI元素不再需要,请调用gameBoard.getChildren().clear()。父容器的布局影响: GridPane的最终尺寸和行为也受到其父容器的布局策略影响。确保父容器也允许GridPane增长或收缩。setHgrow和setVgrow: 使用这些属性来指定当有额外空间时,哪些列或行优先应该占用这些空间。
通过遵循这些原则,您将能够高效灵活地管理JavaFX GridPane的动态布局,创建响应用户交互和窗口大小变化的现代化应用。
就是JavaFX GridPane动态列与行管理及无线布局教程的内容详细,更多请关注乐哥常识网相关文章!
