如何在 JavaFX 中操作 GridPane 的子项?
How can I manipulate childrens of a GridPane in JavaFX?
我使用 JavaFX 制作了一个棋盘,并将所有图块设置为 GridPane 的子项,有没有一种方法可以访问这些图块并使用 GridPane 索引更改它们的属性?
我尝试通过图块矩阵访问它来更改一个图块的颜色 属性,但它不会更改 GridPane 中显示的图块。
.getChildren() 方法 returns 一个节点列表,一旦它成为节点,我就无法访问 tile 对象的方法。
这是我的瓷砖 Class:
package chess.Board;
import static chess.Chess.TILE_W;
import static chess.Chess.TILE_Y;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
public class Tile extends Rectangle{
private final int width = TILE_W;
private final int height = TILE_Y;
private final int x;
private final int y;
private Color color;
public void setColor(Color color) {
this.color = color;
}
public Color getColor(){
return this.color;
}
public Tile(Color c, int x, int y){
this.color = c;
this.x = x;
this.y = y;
setFill(c);
setHeight(this.height);
setWidth(this.width);
relocate(x*TILE_W, y*TILE_Y);
}
}
这是我的看板 class:
package chess.Board;
import static chess.Chess.HEIGHT;
import static chess.Chess.TILE_W;
import static chess.Chess.TILE_Y;
import static chess.Chess.WIDTH;
import javafx.scene.Parent;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
public class Board {
private Tile[][] tilesMatrix;
private void setMatrix(){
Tile[][] tilesCreator = new Tile[WIDTH][HEIGHT];
for(int y = 0; y < HEIGHT; y++){
for(int x = 0; x < WIDTH; x++){
if(y%2 == 0){
if(x%2 == 0)
tilesCreator[x][y] = new Tile(Color.ANTIQUEWHITE, x, y);
else
tilesCreator[x][y] = new Tile(Color.DARKGREEN, x, y);
}
else{
if(x%2 == 0)
tilesCreator[x][y] = new Tile(Color.DARKGREEN, x, y);
else
tilesCreator[x][y] = new Tile(Color.ANTIQUEWHITE, x, y);
}
}
}
this.tilesMatrix = tilesCreator;
}
public Tile[][] getMatrix(){
return this.tilesMatrix;
}
public Parent getBoard(){
GridPane board = new GridPane();
board.setPrefSize(WIDTH*TILE_W, HEIGHT*TILE_Y);
for(int y = 0; y < HEIGHT; y++)
for(int x = 0; x < WIDTH; x++)
board.add(getMatrix()[x][y], x, y);
return board;
}
public Board(){
setMatrix();
}
}
可以通过矩阵访问图块,但使用 getChildren() 也可以:您只需将节点类型转换为图块。除非您更改 Tile 的 fill 属性(从 Shape 继承),否则 Tile 的颜色不会改变。 Tile 的构造函数确实调用了 setFill(),但 setColor() 没有。
我使用 JavaFX 制作了一个棋盘,并将所有图块设置为 GridPane 的子项,有没有一种方法可以访问这些图块并使用 GridPane 索引更改它们的属性?
我尝试通过图块矩阵访问它来更改一个图块的颜色 属性,但它不会更改 GridPane 中显示的图块。
.getChildren() 方法 returns 一个节点列表,一旦它成为节点,我就无法访问 tile 对象的方法。
这是我的瓷砖 Class:
package chess.Board;
import static chess.Chess.TILE_W;
import static chess.Chess.TILE_Y;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
public class Tile extends Rectangle{
private final int width = TILE_W;
private final int height = TILE_Y;
private final int x;
private final int y;
private Color color;
public void setColor(Color color) {
this.color = color;
}
public Color getColor(){
return this.color;
}
public Tile(Color c, int x, int y){
this.color = c;
this.x = x;
this.y = y;
setFill(c);
setHeight(this.height);
setWidth(this.width);
relocate(x*TILE_W, y*TILE_Y);
}
}
这是我的看板 class:
package chess.Board;
import static chess.Chess.HEIGHT;
import static chess.Chess.TILE_W;
import static chess.Chess.TILE_Y;
import static chess.Chess.WIDTH;
import javafx.scene.Parent;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
public class Board {
private Tile[][] tilesMatrix;
private void setMatrix(){
Tile[][] tilesCreator = new Tile[WIDTH][HEIGHT];
for(int y = 0; y < HEIGHT; y++){
for(int x = 0; x < WIDTH; x++){
if(y%2 == 0){
if(x%2 == 0)
tilesCreator[x][y] = new Tile(Color.ANTIQUEWHITE, x, y);
else
tilesCreator[x][y] = new Tile(Color.DARKGREEN, x, y);
}
else{
if(x%2 == 0)
tilesCreator[x][y] = new Tile(Color.DARKGREEN, x, y);
else
tilesCreator[x][y] = new Tile(Color.ANTIQUEWHITE, x, y);
}
}
}
this.tilesMatrix = tilesCreator;
}
public Tile[][] getMatrix(){
return this.tilesMatrix;
}
public Parent getBoard(){
GridPane board = new GridPane();
board.setPrefSize(WIDTH*TILE_W, HEIGHT*TILE_Y);
for(int y = 0; y < HEIGHT; y++)
for(int x = 0; x < WIDTH; x++)
board.add(getMatrix()[x][y], x, y);
return board;
}
public Board(){
setMatrix();
}
}
可以通过矩阵访问图块,但使用 getChildren() 也可以:您只需将节点类型转换为图块。除非您更改 Tile 的 fill 属性(从 Shape 继承),否则 Tile 的颜色不会改变。 Tile 的构造函数确实调用了 setFill(),但 setColor() 没有。