java - 为什么我的网格窗格中的节点位置会影响我的网格布局?
问题描述
我正在尝试使用 JavaFX 中的 GridPane 重新创建“蛇”游戏。除了这个特定错误之外,我的代码似乎运行正常,每当我使用我的键将绿色节点(标题为头)遍历到黄色节点(标题为食物)时,网格的行或列似乎缩短了一个单位,导致网格以某种方式崩溃。有没有办法阻止 GridPane 调整大小?下面是我的代码:
package snake;
import java.util.ArrayList;
import java.util.Random;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.TilePane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Modality;
import javafx.stage.Stage;
public class snakemain extends Application {
Random random = new Random();
int posX = random.nextInt(21), posY = random.nextInt(21), foodposX = random.nextInt(24), foodposY = random.nextInt(24);
public static void main(String... args) {
launch(args);
}
public void start(Stage stage) {
//Creates Scene and stage setting + gridpane
stage.setTitle("Snake by Yeldor");
GridPane gridpane = new GridPane();
Random random = new Random();
Scene scene = new Scene(gridpane, 500, 500);
scene.setFill(Color.WHITE);
gridpane.setGridLinesVisible(true);
gridpane.setHgap(20);
gridpane.setVgap(20);
//creates head of snake, Arraylist of snakes body parts, and food consumable for snake
ArrayList<Rectangle> snakeBody = new ArrayList<Rectangle>();
Rectangle head = new Rectangle(20,20,Color.GREEN.brighter().brighter());
//invisible block to manage grid
Rectangle food = new Rectangle(20,20, Color.YELLOW.brighter().brighter());
//adds rectangles to grippane
gridpane.add(head, posX, posY);
gridpane.add(food, foodposX, foodposY);
//makes food non mangaged by the gridpane
scene.setOnKeyPressed(e ->
{
String s = e.getCode().toString();
try {
switch(s) {
case "W": gridpane.getChildren().remove(head);
gridpane.add(head, posX, --posY);
break;
case "A": gridpane.getChildren().remove(head);
gridpane.add(head, --posX, posY);
break;
case "S": gridpane.getChildren().remove(head);
gridpane.add(head, posX, ++posY);
break;
case "D": gridpane.getChildren().remove(head);
gridpane.add(head, ++posX, posY);
break;
}
if (posX == 24 || posY == 24 || posX == -1 || posY == -1) {
missionFailed();
stage.close();
}
}
catch(IllegalArgumentException error) {
missionFailed();
stage.close();
}
});
stage.setScene(scene);
stage.show();
}
void missionFailed() {
Stage failedPopup = new Stage();
failedPopup.setTitle("You Died!");
failedPopup.initModality(Modality.APPLICATION_MODAL);
Button OK = new Button("OK");
Group group = new Group();
Scene miniScene = new Scene(group, 150, 100);
group.getChildren().add(OK);
failedPopup.setScene(miniScene);
failedPopup.show();
OK.setOnMouseClicked(q -> {
failedPopup.close();
});
}
}
解决方案
使用hgap
andvgap
不修改列大小,它会修改列之间的空间。例如,如果您将Rectangle
s 水平相邻放置(相同的行索引,列索引相差 1),则两个节点之间的距离为vgap
; 正好有 2 列被填充并且宽度 != 0。现在将Rectangle
s 移动到同一个单元格,并且只有一个宽度 != 0 的列会导致意外结果。
相反,您应该限制行/列的大小:
// gridpane.setHgap(20);
// gridpane.setVgap(20);
int rows = 500 / 20;
int columns = 500 / 20;
RowConstraints rConstraints = new RowConstraints(20);
ColumnConstraints cConstraints = new ColumnConstraints(20);
for (int i = 0; i < columns; i++) {
gridpane.getColumnConstraints().add(cConstraints);
}
for (int i = 0; i < rows; i++) {
gridpane.getRowConstraints().add(rConstraints);
}
推荐阅读
- git - 先推后拉 - 丢失的更改
- testing - 如何测试 Rust 程序传递给另一个程序的参数?
- wordpress - 使用 wp_dropdown_categories 后重置数据和查询
- windows - git diff 的输出在 powershell 中未正确处理
- php - 使用 PhpSpreadsheet 使用 URL 或 base64 添加图像
- dask - 使用 dask 和 pyarrow 从 hdfs 读取 csv 文件
- node.js - 即使文件存在,readFileSync 也不返回任何数据
- java - 后递增运算符和数组赋值
- django - Django修改发送到模板的空白表单字段
- python - 在 Keras 中绘制单个时期内的损失演变