【问题标题】:How to draw a grid and paint the grid corners with a point on JavaFX?如何在 JavaFX 上绘制网格并用点绘制网格角?
【发布时间】:2020-03-13 20:07:37
【问题描述】:

我是 JavaFx 的新手,我想知道如何绘制网格,我想在网格角上绘制点。我应该使用网格窗格作为基础还是折线图?使用网格并在其上绘制的最佳类是什么?

【问题讨论】:

  • 取决于您的需要。 Canvas 可能是性能最高的,除非您需要调整大小。如果您需要调整大小,最好扩展Pane 并覆盖layoutChildren 以更新Lines 和Circles。作为儿童放置。

标签: java javafx


【解决方案1】:

我不会使用 GridPane,因为它的子级不能保证大小相同,只能使它们的网格单元格边缘对齐。

但是,TilePane 确实保证其单元格大小相同。然后,您可以使用 Group 将 TilePane 与节点组合在一起,例如 Circles,这些节点使用一些基本数学以网格单元之间的点为中心:

public class Grid
extends Application {
    private int rows = 10;
    private int columns = 10;
    private int spacing = 8;

    @Override
    public void start(Stage stage) {
        TilePane pane = new TilePane(spacing, spacing);
        pane.setPrefColumns(columns);

        Group group = new Group(pane);

        for (int row = 1; row < rows; row++) {
            for (int col = 1; col < columns; col++) {
                Circle point = new Circle(2);
                point.setFill(Color.BLACK);
                // x = ((tilewidth + hgap) * col) - (hgap / 2)
                // y = ((tileheight + vgap) * row) - (vgap / 2)
                point.centerXProperty().bind(
                    pane.tileWidthProperty().add(pane.hgapProperty())
                        .multiply(col)
                        .subtract(pane.hgapProperty().divide(2)));
                point.centerYProperty().bind(
                    pane.tileHeightProperty().add(pane.vgapProperty())
                        .multiply(row)
                        .subtract(pane.vgapProperty().divide(2)));
                group.getChildren().add(point);
            }
        }

        // Example grid content
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < columns; col++) {
                Text text = new Text(String.valueOf(row * rows + col));
                pane.getChildren().add(text);
            }
        }

        stage.setScene(new Scene(group));
        stage.setTitle("Grid");
        stage.show();
    }
}

【讨论】:

  • 如果我想在点击时用一条线连接点,我应该使用什么类? Path, LineTo 类?
  • 你当然可以使用路径,但我认为普通的独立 Line 会更容易。
  • 我可以在 TilePane 中的点之间画线吗?或者我应该创建一个简单的窗格,其中有一个 TilePane 在点之间绘制?
  • 您需要将线条或路径添加到组中,而不是直接添加到 TilePane。 TilePane 类为每个孩子制作一个瓷砖;你不希望你的线条实际上被布置成瓷砖。
  • 好的,谢谢,但我不明白的是,点击时一个点如何知道何时将一条线画到另一个点?我的意思是如何选择几个点并画线?
猜你喜欢
  • 1970-01-01
  • 2019-03-25
  • 2020-12-15
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2017-12-15
  • 2020-10-22
  • 2014-10-09
相关资源
最近更新 更多