当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX中操纵GridPane的子对象?

艾学海
2023-03-14

我用JavaFX做了一个国际象棋棋盘,并把所有的方格设置为GridPane的子方格,有没有办法用GridPane索引来访问这些方格并改变它们的属性?

我尝试通过磁贴矩阵访问一个磁贴来更改磁贴的颜色属性,但它不会更改 GridPane 中显示的磁贴。

的。getChildren()方法返回一个节点列表,一旦tile对象成为节点,我就无法访问它的方法。

这是我的磁贴类:

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);

}

}

这是我的董事会课:

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();

}

}

共有1个答案

万修然
2023-03-14

通过矩阵访问磁贴是可以的,但使用 getChildren() 也是可以的:你只需要键入将节点转换为磁贴。除非更改磁贴(继承自 Shape)的填充属性,否则磁贴的颜色不会更改。Tile 的构造函数调用 setFill(),但 setColor() 不调用。

 类似资料:
  • 这是我的JavaFX控制器 所以我的问题是,在javaFX上下文中,处理<code>未来</code>结果的习惯用法是什么? 我知道我可以做,线程将阻塞,直到操作完成,但我会阻塞Application线程。我正在考虑在完成时进行回调,我发现了,哪种类型通过thenAccep执行此操作,但基于此答案,线程仍将被阻塞,这违反了Future的要点,就像答案中提到的那样。 在我的例子中,可调用的结果(在我

  • 如何使用< code>GridPane上的权重设置行/列大小? 例如,如果我想要五行,其中三行是未知的固定大小,一行占用剩余空间的三分之一,另一行占用剩余空间的三分之二(见下图),我该如何实现呢? 我查看了使用,其中两个有但这只允许平均共享剩余空间。 我尝试使用百分比,因为我在文档< code >中看到,如果widthPercent(或heightPercent)值的总和大于100,这些值将被视为

  • 我不明白为什么设置Label.setAlignment(Pos.CENTER_RIGHT)不会影响标签的对齐,然后将其添加到GridPane中?唯一的方法似乎是通过网格(例如列约束)或将标签添加到具有正确对齐的HBox。 为什么将标签的对齐方式设置为CENTER_RIGHT不起作用?我可以看到API说:“指定当标签中有空白时,标签中的文本和图形应该如何对齐。但是,如何在标签中获取空白区域?

  • 我是JavaFx新手,我在FXMl中创建了两个gridPane,我想用JavaFx做同样的事情。 我想创建一个扩展GridPane的类,所以当我调用我的类时,我将得到与fxml PS中相同的结果:如果您使用的是SceneBuilder,请检查网格线是否可见,以便可以看到所有GridPane谢谢

  • 我已经创建了两个Javafx网格窗格,我希望它们处于相同的位置,第二个网格窗格必须位于第一个网格窗格旁边的相同位置。因为我跑步时一个接一个。这是我的代码:

  • 我是JavaFx新手。我在FXML中创建了一个网格窗格。我想将该网格窗格设置为下图。我尝试了以下答案,并尝试了更多的CSS元素。但这些都没有帮助我做到这一点。 用于GridPane、VBox、VBox的JavaFX CSS类 使用CSS在GridPane中居中显示子项 向GridPane JavaFX添加边框 我是否也使用了错误的方法?我可以使用GridPane实现这一点,还是TableView很