【发布时间】:2018-05-07 13:33:00
【问题描述】:
我想知道是否有可能在 JavaFX 中的 GridPane 上实现 Sticky Headers,这意味着 GridPane 的一行保持原位,而您可以滚动浏览窗格的其余行。
【问题讨论】:
-
您不使用
TableView的任何特殊原因?
我想知道是否有可能在 JavaFX 中的 GridPane 上实现 Sticky Headers,这意味着 GridPane 的一行保持原位,而您可以滚动浏览窗格的其余行。
【问题讨论】:
TableView的任何特殊原因?
这是可能的,但您需要确保标头节点是 GridPane.children 列表的最后一个子节点。这允许您将标头节点的translateY 属性设置为保留在包裹GridPane 的ScrollPane 的顶部:
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;
}
【讨论】: