在java中显示图像或形状的二维网格
之前我制作了一个ASCII字符的二维网格,在这个网格中我可以移动一个ASCII字符。现在,我想通过在javafx窗口中制作一个“可视化”版本来将其提升到下一个级别。我试过制作两个图像对象,一个内部有一个黑色正方形,一个内部有一个白色正方形,然后将这两个对象多次放入二维网格中,如下所示:在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} };
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有一种叫做“循环”的东西,对吗?