【问题标题】:Sticky Headers on JavaFX GridpaneJavaFX Gridpane 上的粘性标题
【发布时间】:2018-05-07 13:33:00
【问题描述】:

我想知道是否有可能在 JavaFX 中的 GridPane 上实现 Sticky Headers,这意味着 GridPane 的一行保持原位,而您可以滚动浏览窗格的其余行。

【问题讨论】:

  • 您不使用TableView的任何特殊原因?

标签: javafx-8 sticky gridpane


【解决方案1】:

这是可能的,但您需要确保标头节点是 GridPane.children 列表的最后一个子节点。这允许您将标头节点的translateY 属性设置为保留在包裹GridPaneScrollPane 的顶部:

GridPane grid = new GridPane();

// fill grid
Color[] colors = new Color[]{Color.RED, Color.ORANGE, Color.LIGHTGREEN, Color.LIGHTBLUE};
for (int i = 1; i <= 100; i++) {
    grid.add(new Rectangle(50, 50, colors[(2 * i - 2) % colors.length]), 0, i);
    grid.add(new Label(Integer.toString(2 * i - 1)), 0, i);
    grid.add(new Rectangle(50, 50, colors[(2 * i - 1) % colors.length]), 1, i);
    grid.add(new Label(Integer.toString(2 * i)), 1, i);
}

// create & add header
Node[] headers = new Node[] {
    createHeaderNode("H1"),
    createHeaderNode("H2")
};
grid.addRow(0, headers);

ScrollPane scrollPane = new ScrollPane(grid);
scrollPane.setPrefHeight(400);

// keep header in position on top of the viewport
InvalidationListener headerUpdater = o -> {
    final double ty = (grid.getHeight() - scrollPane.getViewportBounds().getHeight()) * scrollPane.getVvalue();
    for (Node header : headers) {
        header.setTranslateY(ty);
    }
};
grid.heightProperty().addListener(headerUpdater);
scrollPane.viewportBoundsProperty().addListener(headerUpdater);
scrollPane.vvalueProperty().addListener(headerUpdater);
private static Label createHeaderNode(String text) {
    Label label = new Label(text);
    label.setMaxWidth(Double.MAX_VALUE);
    label.setStyle("-fx-border-style: solid; -fx-background-color: white;");
    return label;
}

【讨论】:

  • 你是个天才@fabian
猜你喜欢
  • 1970-01-01
  • 2021-03-17
  • 2016-04-30
  • 2018-04-21
  • 2016-07-15
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
相关资源
最近更新 更多