JavaFX FXML新手求助:如何通过循环生成8×8及以上GridPane单元格
不用逐个编写!用循环批量生成GridPane单元格的解决方案
首先明确告诉你:完全不需要逐个编写64个单元格的代码,循环批量生成是最合理的做法,你遇到的问题只是因为Grass类不是JavaFX的Node子类,导致无法直接添加到GridPane中,下面就给你一步步解决这个问题。
问题根源
GridPane.add()方法要求传入的是Node类型的对象(比如Rectangle、Button这些都是Node的子类),但你的Grass类继承自Ground,而Ground只是一个普通的抽象类,并没有继承Node,所以直接Game.add(new Grass(), i, j)会编译报错。
解决方案:两种方式让Grass可以被添加到GridPane
方式一:让Ground继承自Pane(推荐)
把Ground改成继承自Pane(JavaFX的容器类,属于Node子类),这样Grass就自动成为Node的子类,直接可以添加到GridPane中,同时还能方便后续扩展(比如在单元格里添加其他元素)。
修改后的Ground类:
package auto; import javafx.scene.layout.Pane; import javafx.scene.shape.Rectangle; public abstract class Ground extends Pane { protected Rectangle ground; }
修改后的Grass类:
package auto; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; public class Grass extends Ground { public Grass(){ ground = new Rectangle(50,50,Color.GREEN); // 把Rectangle添加到Pane中,这样Pane就能显示这个矩形 this.getChildren().add(ground); } }
方式二:给Grass添加获取Node的方法(如果不想修改Ground的继承结构)
如果不想改变Ground的父类,可以在Grass里添加一个方法,返回内部的Rectangle对象,然后把这个Rectangle添加到GridPane:
修改后的Grass类(新增getGround方法):
package auto; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; public class Grass extends Ground { public Grass(){ ground = new Rectangle(50,50,Color.GREEN); } // 新增方法,返回内部的Rectangle(Node类型) public Rectangle getGround() { return ground; } }
修复控制器的初始化问题
另外注意:你不能在控制器的构造函数里操作Game这个GridPane,因为FXML注入控件的操作是在控制器构造完成之后才进行的,构造函数里Game还是null,会抛出空指针异常。你需要用@FXML注解的initialize方法来完成初始化:
修改后的控制器:
package auto; import javafx.fxml.FXML; import javafx.scene.layout.GridPane; public class FXMLDocumentController { @FXML private GridPane Game; // 这个方法会在FXML加载完成、控件注入后自动执行 @FXML private void initialize() { // 生成8x8的Grass网格 for(int i = 0; i < 8; i++){ for(int j = 0; j < 8; j++){ // 如果用方式一,直接添加Grass对象 Game.add(new Grass(), i, j); // 如果用方式二,添加getGround()返回的Rectangle // Game.add(new Grass().getGround(), i, j); } } } }
额外提示
- 如果要生成更大的网格(比如10×10),只需要修改循环的次数即可,非常灵活。
- 可以给GridPane设置
Hgap和Vgap属性,让单元格之间有间隔,比如在initialize里加:Game.setHgap(2); Game.setVgap(2);,这样网格看起来更美观。
内容的提问来源于stack exchange,提问作者Jhonathan Asimov
相关产品推荐
相关产品推荐

