生成N x N网格

时间:2015-11-05 00:23:14

标签: java javafx javafx-2 javafx-8

在JavaFX应用程序中创建N x N网格最简单的方法是什么?

我正在寻找的唯一要求是网格的大小总是占用相同的空间量,因此更多的正方形=更小的正方形。我可以为方块设置颜色,我可以单独悬停在每个方格上,并且可以为每个方块显示一些。

在程序运行之前我不会知道'N'并解析一些数据来计算我需要多少总方格,这是我计算可以使用的最小NxN网格时所需的。

据我所知,我的选择是:

  1. GridPane - 使用列约束和行约束生成大小并可能添加悬停属性?
  2. TableView - 有更多选项可以让每个单元格数据在悬停时显示,但仍然很难只添加行和列。
  3. 矩形 - 只需生成并绘制每个矩形,同时计算每个方块的x和y坐标。这样可以很容易地进行颜色和悬停,但我看不出调整大小是如何工作的,但我可以为我的应用程序设置特定的大小。我还必须计算最佳尺寸,以使每个方格填满网格区域。
  4. 我不一定会找人编写解决方案,但如果有人处理了这个问题,并且知道一个好的方法我会听到它。

1 个答案:

答案 0 :(得分:2)

不要偏离原来的想法。当你给出的所有方法都可行时,你为什么要寻找“无痛”的方式?这是使用矩形的一个。 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)Yes, it works for me.

2)对于悬停,你在寻找什么样的悬停效果?你可以在每个矩形上添加悬停效果,如果你想让我告诉你如何,我绝对可以为你编码。