在java中显示图像或形状的2D网格

时间:2018-02-11 15:10:32

标签: java javafx multidimensional-array grid

我制作了一个包含ASCII字符的2D网格,之前我能够移动一个ascii字符。现在,我希望通过制作一个可视化的#34;它在javafx窗口中的版本。我试过制作2个图像对象,其中一个在其中有一个黑色方块,另一个用白色对象,然后将这两个对象多次放入2D网格中,如下所示:

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

问题是,我知道如何显示它们的唯一方法是为每个索引制作一个imageview对象,如果我想说,想要一个25X25网格,这意味着我必须制作625个imageview对象,显然是荒谬的。

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

HBox gameLayout = new HBox(Grid[1][1], Grid[1][2], Grid[1][3]);

但是这给了我一个" invocationTargetException"。

我的目标是通过专门定位和操纵网格元素来制作蛇。当我将" B"数组元素的值更改为" W"时,我想要方形颜色/ imageView / rectangle /无论要改变什么。 (白色)但我试过的事情要么效率低下,要么就是不能工作。

1 个答案:

答案 0 :(得分:1)

完全不清楚您的异议是创建多个ImageView。由于它们可以引用相同的Image实例,因此这应该非常有效(图像数据不需要复制)。

这似乎工作正常:

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

enter image description here

如果您愿意,可以使用某种Shape(例如Rectangle)执行此操作:

@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++) {
            Rectangle rect = new Rectangle(tileSize, tileSize, grid[y][x]);
            gridPane.add(rect, x, y);
        }
    }
    Scene scene = new Scene(gridPane);
    primaryStage.setScene(scene);
    primaryStage.show();
}

或使用Region

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

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