在java中显示图像或形状的二维网格

在java中显示图像或形状的二维网格,java,javafx,multidimensional-array,grid,Java,Javafx,Multidimensional Array,Grid,之前我制作了一个ASCII字符的二维网格,在这个网格中我可以移动一个ASCII字符。现在,我想通过在javafx窗口中制作一个“可视化”版本来将其提升到下一个级别。我试过制作两个图像对象,一个内部有一个黑色正方形,一个内部有一个白色正方形,然后将这两个对象多次放入二维网格中,如下所示: Image[][] Grid = { {B,W,B,B,B,B,B,B,B,B,B}, {B,B,B,B,W,W,W,B,B,B,B}, {B,B,B,B,B,B,B,B,B,B,B} };

之前我制作了一个ASCII字符的二维网格,在这个网格中我可以移动一个ASCII字符。现在,我想通过在javafx窗口中制作一个“可视化”版本来将其提升到下一个级别。我试过制作两个图像对象,一个内部有一个黑色正方形,一个内部有一个白色正方形,然后将这两个对象多次放入二维网格中,如下所示:

  Image[][] Grid = {
  {B,W,B,B,B,B,B,B,B,B,B},
  {B,B,B,B,W,W,W,B,B,B,B},
  {B,B,B,B,B,B,B,B,B,B,B}
  };
HBox gameLayout = new HBox(Grid[1][1], Grid[1][2], Grid[1][3]);
问题是,我知道如何显示它们的唯一方法是为每个索引创建一个imageview对象,如果我说想要一个25X25网格,这意味着我必须创建625个imageview对象,这显然是荒谬的

我还尝试简单地将网格索引逐个放入窗格中,如下所示:

  Image[][] Grid = {
  {B,W,B,B,B,B,B,B,B,B,B},
  {B,B,B,B,W,W,W,B,B,B,B},
  {B,B,B,B,B,B,B,B,B,B,B}
  };
HBox gameLayout = new HBox(Grid[1][1], Grid[1][2], Grid[1][3]);
但这给了我一个“invocationTargetException”


我的目标是通过专门瞄准和操纵网格元素来制作snake。当我将“B”数组元素的值更改为“W”(白色)时,我希望方形/图像视图/矩形/任何东西都可以更改,但我尝试的方法要么效率很低,要么就是不起作用。

创建多个
图像视图的目标根本不清楚。因为它们可以引用相同的
图像
实例,所以这应该是相当有效的(图像数据不需要复制)

这似乎很管用:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class TiledBoard extends Application {

    private final int tileSize = 30 ;

    @Override
    public void start(Stage primaryStage) {

        Image b = createImage(Color.BLACK);
        Image w = createImage(Color.WHITE);


        Image[][] grid = {
            {b,w,b,b,b,b,b,b,b,b,b},
            {b,b,b,b,w,w,w,b,b,b,b},
            {b,b,b,b,b,b,b,b,b,b,b}
        };

        GridPane gridPane = new GridPane();

        // for visualizing the different squares:
        gridPane.setHgap(2);
        gridPane.setVgap(2);
        gridPane.setStyle("-fx-background-color: grey;");

        for (int y = 0 ; y < grid.length ; y++) {
            for (int x = 0 ; x < grid[y].length ; x++) {
                ImageView imageView = new ImageView(grid[y][x]);
                imageView.setFitWidth(tileSize);
                imageView.setFitHeight(tileSize);
                gridPane.add(imageView, x, y);
            }
        }
        Scene scene = new Scene(gridPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private Image createImage(Color color) {
        WritableImage image = new WritableImage(1, 1);
        image.getPixelWriter().setColor(0, 0, color);
        return image ;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
或使用
区域

@Override
public void start(Stage primaryStage) {

    Color b = Color.BLACK;
    Color w = Color.WHITE;


    Color[][] grid = {
        {b,w,b,b,b,b,b,b,b,b,b},
        {b,b,b,b,w,w,w,b,b,b,b},
        {b,b,b,b,b,b,b,b,b,b,b}
    };

    GridPane gridPane = new GridPane();

    // for visualizing the different squares:
    gridPane.setHgap(2);
    gridPane.setVgap(2);
    gridPane.setStyle("-fx-background-color: grey;");

    for (int y = 0 ; y < grid.length ; y++) {
        for (int x = 0 ; x < grid[y].length ; x++) {
            Region rect = new Region();
            rect.setMinSize(tileSize, tileSize);
            rect.setPrefSize(tileSize, tileSize);
            rect.setMaxSize(tileSize, tileSize);
            rect.setBackground(new Background(new BackgroundFill(grid[y][x], CornerRadii.EMPTY, Insets.EMPTY)));
            gridPane.add(rect, x, y);
        }
    }
    Scene scene = new Scene(gridPane);
    primaryStage.setScene(scene);
    primaryStage.show();
}
@覆盖
公共无效开始(阶段primaryStage){
颜色b=颜色。黑色;
颜色w=颜色。白色;
颜色[][]网格={
{b,w,b,b,b,b,b,b,b,b,b,b},
{b,b,b,b,w,w,w,b,b,b,b},
{b,b,b,b,b,b,b,b,b,b,b,b}
};
GridPane GridPane=新建GridPane();
//要可视化不同的方块:
gridPane.setHgap(2);
gridPane.setVgap(2);
gridPane.setStyle(“-fx背景色:灰色;”);
对于(int y=0;y

其中哪一个更好实际上取决于您还想用它们做些什么。

创建多个
ImageView
s的目的根本不清楚。因为它们可以引用相同的
图像
实例,所以这应该是相当有效的(图像数据不需要复制)

这似乎很管用:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class TiledBoard extends Application {

    private final int tileSize = 30 ;

    @Override
    public void start(Stage primaryStage) {

        Image b = createImage(Color.BLACK);
        Image w = createImage(Color.WHITE);


        Image[][] grid = {
            {b,w,b,b,b,b,b,b,b,b,b},
            {b,b,b,b,w,w,w,b,b,b,b},
            {b,b,b,b,b,b,b,b,b,b,b}
        };

        GridPane gridPane = new GridPane();

        // for visualizing the different squares:
        gridPane.setHgap(2);
        gridPane.setVgap(2);
        gridPane.setStyle("-fx-background-color: grey;");

        for (int y = 0 ; y < grid.length ; y++) {
            for (int x = 0 ; x < grid[y].length ; x++) {
                ImageView imageView = new ImageView(grid[y][x]);
                imageView.setFitWidth(tileSize);
                imageView.setFitHeight(tileSize);
                gridPane.add(imageView, x, y);
            }
        }
        Scene scene = new Scene(gridPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private Image createImage(Color color) {
        WritableImage image = new WritableImage(1, 1);
        image.getPixelWriter().setColor(0, 0, color);
        return image ;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
或使用
区域

@Override
public void start(Stage primaryStage) {

    Color b = Color.BLACK;
    Color w = Color.WHITE;


    Color[][] grid = {
        {b,w,b,b,b,b,b,b,b,b,b},
        {b,b,b,b,w,w,w,b,b,b,b},
        {b,b,b,b,b,b,b,b,b,b,b}
    };

    GridPane gridPane = new GridPane();

    // for visualizing the different squares:
    gridPane.setHgap(2);
    gridPane.setVgap(2);
    gridPane.setStyle("-fx-background-color: grey;");

    for (int y = 0 ; y < grid.length ; y++) {
        for (int x = 0 ; x < grid[y].length ; x++) {
            Region rect = new Region();
            rect.setMinSize(tileSize, tileSize);
            rect.setPrefSize(tileSize, tileSize);
            rect.setMaxSize(tileSize, tileSize);
            rect.setBackground(new Background(new BackgroundFill(grid[y][x], CornerRadii.EMPTY, Insets.EMPTY)));
            gridPane.add(rect, x, y);
        }
    }
    Scene scene = new Scene(gridPane);
    primaryStage.setScene(scene);
    primaryStage.show();
}
@覆盖
公共无效开始(阶段primaryStage){
颜色b=颜色。黑色;
颜色w=颜色。白色;
颜色[][]网格={
{b,w,b,b,b,b,b,b,b,b,b,b},
{b,b,b,b,w,w,w,b,b,b,b},
{b,b,b,b,b,b,b,b,b,b,b,b}
};
GridPane GridPane=新建GridPane();
//要可视化不同的方块:
gridPane.setHgap(2);
gridPane.setVgap(2);
gridPane.setStyle(“-fx背景色:灰色;”);
对于(int y=0;y

其中哪一个更好实际上取决于您还想用它们做什么。

调用TargetException
通常在其堆栈跟踪中包含比典型更深入的关键信息,您最好从中查找这些信息注意不同的
图像视图
可以引用相同的
图像
,所以你的幼稚方法可能不像你想象的那么可笑。你也可以从中借鉴一些东西。@James\u D我对你的观点感到困惑。正如您在网格中看到的,我多次使用相同的图像(B和W)。问题是为了显示每个网格元素,我必须通过为每个索引创建一个imageView对象来单独“打印”每个网格元素,这在我看来确实很可笑。你知道Java有一种叫做“循环”的东西,对吗?
InvocationTargetException
通常在其stacktrace中包含比典型信息更深的关键信息,您最好从中查找这些信息注意不同的
ImageView
s可以引用相同的
图像
,所以你的幼稚方法可能不像你想象的那么可笑。你也可以从中借鉴一些东西。@James\u D我对你的观点感到困惑。正如您在网格中看到的,我多次使用相同的图像(B和W)。问题是,为了显示每个网格元素,我必须通过为每个索引创建一个imageView对象来单独“打印”每个网格元素,这对我来说很可笑。你知道Java有一种叫做“循环”的东西,对吗?