Липкие заголовки на JavaFX Gridpane

Мне было интересно, есть ли возможность реализовать Sticky Headers на GridPane в JavaFX, что означает строку GridPane, которая остается на месте, пока вы можете прокручивать оставшиеся строки панели.


person Samarek    schedule 07.05.2018    source источник
comment
По какой-то конкретной причине вы не используете TableView?   -  person Itai    schedule 07.05.2018


Ответы (1)


Это возможно, но вам нужно убедиться, что узлы заголовков являются последними дочерними элементами списка GridPane.children. Это позволяет вам установить свойство translateY узлов заголовка, чтобы оно оставалось в верхней части ScrollPane, обертывая GridPane:

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;
}
person fabian    schedule 07.05.2018
comment
Ты гений @fabian - person Mayur Patel; 26.08.2019