Как отображать линии сетки объекта GridPane постоянно и без использования метода setGridLinesVisible()?

Можно ли сделать все линии сетки GridPane постоянно видимыми без использования setGridLinesVisible()?

Я знаю, что setGridLinesVisible() предназначен только для целей отладки, и я хочу показать линии сетки для удобства конечного пользователя.

Кроме того, мне нужно работать с контейнером Pane, а не с Canvas.

Моя программа может добавлять, удалять, изменять, перемещать и т. д. формировать объекты и группы в родительском контейнере типа Pane или подтипа Pane.

Спасибо


person RoastedCode    schedule 03.06.2016    source источник
comment
GridPane имеет свойство css -fx-grid-lines-visible   -  person Valya    schedule 18.02.2018


Ответы (4)


Это немного зависит от того, как вы все настроили. Из описания вашего приложения, когда я экспериментировал с подобными вещами, мне всегда было удобно заполнять сетку пустыми Pane, чтобы они действовали как ячейки, а затем манипулировать их содержимым на основе данных в модели. Если вы используете этот подход, вы можете использовать некоторые CSS для размещения границ (например, с использованием вложенных фонов) на «ячейках», что даст эффект линий сетки.

Вот простой пример такого подхода:

import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.scene.Scene;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class GridPaneWithLines extends Application {


    private StackPane createCell(BooleanProperty cellSwitch) {

        StackPane cell = new StackPane();

        cell.setOnMouseClicked(e -> cellSwitch.set(! cellSwitch.get() ));

        Circle circle = new Circle(10, Color.CORNFLOWERBLUE);

        circle.visibleProperty().bind(cellSwitch);

        cell.getChildren().add(circle);
        cell.getStyleClass().add("cell");
        return cell;
    }

    private GridPane createGrid(BooleanProperty[][] switches) {

        int numCols = switches.length ;
        int numRows = switches[0].length ;

        GridPane grid = new GridPane();

        for (int x = 0 ; x < numCols ; x++) {
            ColumnConstraints cc = new ColumnConstraints();
            cc.setFillWidth(true);
            cc.setHgrow(Priority.ALWAYS);
            grid.getColumnConstraints().add(cc);
        }

        for (int y = 0 ; y < numRows ; y++) {
            RowConstraints rc = new RowConstraints();
            rc.setFillHeight(true);
            rc.setVgrow(Priority.ALWAYS);
            grid.getRowConstraints().add(rc);
        }

        for (int x = 0 ; x < numCols ; x++) {
            for (int y = 0 ; y < numRows ; y++) {
                grid.add(createCell(switches[x][y]), x, y);
            }
        }

        grid.getStyleClass().add("grid");
        return grid;
    }

    @Override
    public void start(Stage primaryStage) {
        int numCols = 5 ;
        int numRows = 5 ;

        BooleanProperty[][] switches = new BooleanProperty[numCols][numRows];
        for (int x = 0 ; x < numCols ; x++) {
            for (int y = 0 ; y < numRows ; y++) {
                switches[x][y] = new SimpleBooleanProperty();
            }
        }

        GridPane grid = createGrid(switches);

        StackPane root = new StackPane(grid);
        Scene scene = new Scene(root, 600, 600);
        scene.getStylesheets().add("grid-with-borders.css");
        primaryStage.setScene(scene);
        primaryStage.show();
    }




    public static void main(String[] args) {
        launch(args);
    }
}

и CSS (grid-with-borders.css):

.root {
    -fx-padding: 20 ;
    cell-color: white ;
    cell-border-color: black ;
}
.grid {
    /* 1 pixel border around the top and right of the grid: */
    -fx-background-color: cell-border-color, cell-color ;
    -fx-background-insets: 0, 1 1 0 0 ;
    -fx-padding: 1 ;
}
.cell {
    /* 1 pixel border around the left and bottom of each cell: */
    -fx-background-color: cell-border-color, cell-color ;
    -fx-background-insets: 0, 0 0 1 1 ;
}
person James_D    schedule 03.06.2016
comment
Спасибо, этот подход был одним из первых, что пришло мне в голову, но я думал, что будет готовое решение: p - person RoastedCode; 03.06.2016

Это сработало для меня:

GridPane grid = new GridPane();
grid.setGridLinesVisible(true);

только для отладки!

person Sedrick    schedule 03.11.2016
comment
Вы не можете отобразить линии сетки только с этим кодом. Этот ответ неполный. - person LuminousNutria; 03.12.2018
comment
Какую версию java вы используете. Они могли бы покончить с этим. - person Sedrick; 03.12.2018
comment
Я использую Java 8. В какой версии Java этот код работает сам по себе? - person LuminousNutria; 03.12.2018
comment
Для готового продукта вы должны использовать идеи из ответа Джеймса. - person Sedrick; 03.12.2018

Если вы пытаетесь использовать fxml, вы можете попробовать следующее:

    <GridPane GridPane.columnIndex="1"  GridPane.rowIndex="0" gridLinesVisible="true">
person Jroosterman    schedule 10.04.2017

Для каждого ребенка используйте:

-fx-border-color: black;
-fx-border-width: 0 0 1 1;

Этого можно добиться, например, с помощью метода yourChildNode.setStyle(css).

Если одна ячейка содержит несколько макетов, оберните их в один AnchorPane и примените CSS к AnchorPane.

person nullmn    schedule 20.06.2019