生成 N x N 网格
Generating an N x N grid
在 JavaFX 应用程序中创建 N x N 网格最轻松的方法是什么?
我要寻找的唯一要求是网格的大小始终占用相同数量的 space,所以更多的正方形 = 更小的正方形。我可以为方块设置颜色,我可以分别将鼠标悬停在每个方块上,并能够为每个方块显示一些颜色。
我不知道 'N' 直到程序运行并解析一些数据以计算出我需要多少个正方形,这是在我计算我可以使用的最小 NxN 网格时。
据我所知,我的选择是:
- GridPane - 使用列约束和行约束生成大小并可能添加悬停属性?
- TableView - 更多选项可以让每个单元格数据在悬停时显示,但仍然很难仅添加行和列作为开始。
- 矩形 - 只需生成并绘制每个矩形,同时计算每个正方形的 x 和 y 坐标。这将使颜色和悬停变得容易,但我看不到调整大小如何工作,但我可以为我的应用程序设置特定大小。我还必须计算使每个正方形填满网格区域的最佳尺寸。
我不一定要找人编写解决方案,但如果有人处理过这个问题并且知道一个好方法,我想听听。
不要偏离最初的想法。既然你给出的所有方法都可行,你为什么还要寻找 "painless" 种方法?这是一个使用你的矩形的。 GridMaker.SCREEN_SIZE指的是你必须拥有的屏幕尺寸。
public static Pane makeGrid(int n){
double width = GridMaker.SCREEN_SIZE/n;
Pane p = new Pane();
Rectangle [][] rec = new Rectangle [n][n];
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
rec[i][j] = new Rectangle();
rec[i][j].setX(i * width);
rec[i][j].setY(j * width);
rec[i][j].setWidth(width);
rec[i][j].setHeight(width);
rec[i][j].setFill(null);
rec[i][j].setStroke(Color.BLACK);
p.getChildren().add(rec[i][j]);
}
}
return p;
}
如果您想让窗格改变颜色,只需将鼠标侦听器添加到窗格即可。
p.setOnMouseClicked(new EventHandler <MouseEvent> (){
@Override
public void handle(MouseEvent me){
double posX = me.getX();
double posY = me.getY();
int colX = (int)(posX / width);
int colY = (int) (posY / width);
rec[colX][colY].setFill(Color.RED);
}
});
-- 编辑
1)
2) 对于悬停,您想要什么样的悬停效果?您可以在每个矩形上添加悬停效果,如果您想让我告诉您如何操作,我绝对可以为您编写代码。
在 JavaFX 应用程序中创建 N x N 网格最轻松的方法是什么?
我要寻找的唯一要求是网格的大小始终占用相同数量的 space,所以更多的正方形 = 更小的正方形。我可以为方块设置颜色,我可以分别将鼠标悬停在每个方块上,并能够为每个方块显示一些颜色。
我不知道 'N' 直到程序运行并解析一些数据以计算出我需要多少个正方形,这是在我计算我可以使用的最小 NxN 网格时。
据我所知,我的选择是:
- GridPane - 使用列约束和行约束生成大小并可能添加悬停属性?
- TableView - 更多选项可以让每个单元格数据在悬停时显示,但仍然很难仅添加行和列作为开始。
- 矩形 - 只需生成并绘制每个矩形,同时计算每个正方形的 x 和 y 坐标。这将使颜色和悬停变得容易,但我看不到调整大小如何工作,但我可以为我的应用程序设置特定大小。我还必须计算使每个正方形填满网格区域的最佳尺寸。
我不一定要找人编写解决方案,但如果有人处理过这个问题并且知道一个好方法,我想听听。
不要偏离最初的想法。既然你给出的所有方法都可行,你为什么还要寻找 "painless" 种方法?这是一个使用你的矩形的。 GridMaker.SCREEN_SIZE指的是你必须拥有的屏幕尺寸。
public static Pane makeGrid(int n){
double width = GridMaker.SCREEN_SIZE/n;
Pane p = new Pane();
Rectangle [][] rec = new Rectangle [n][n];
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
rec[i][j] = new Rectangle();
rec[i][j].setX(i * width);
rec[i][j].setY(j * width);
rec[i][j].setWidth(width);
rec[i][j].setHeight(width);
rec[i][j].setFill(null);
rec[i][j].setStroke(Color.BLACK);
p.getChildren().add(rec[i][j]);
}
}
return p;
}
如果您想让窗格改变颜色,只需将鼠标侦听器添加到窗格即可。
p.setOnMouseClicked(new EventHandler <MouseEvent> (){
@Override
public void handle(MouseEvent me){
double posX = me.getX();
double posY = me.getY();
int colX = (int)(posX / width);
int colY = (int) (posY / width);
rec[colX][colY].setFill(Color.RED);
}
});
-- 编辑
1)
2) 对于悬停,您想要什么样的悬停效果?您可以在每个矩形上添加悬停效果,如果您想让我告诉您如何操作,我绝对可以为您编写代码。