JavaFX 网格窗格上的粘性标头



我想知道是否有可能在JavaFX中的GridPane上实现粘性标头,这意味着GridPane的一行保留在原位,同时您可以滚动浏览窗格的其余行。

这是可能的,但您需要确保标头节点是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;
}

最新更新