Как добавить границу к части GridPane? [Дубликат]

Если вы хотите прочитать обе строки и ints, решение должно использовать два сканера:

Scanner stringScanner = new Scanner(System.in);
Scanner intScanner = new Scanner(System.in);

intScanner.nextInt();
String s = stringScanner.nextLine(); // unaffected by previous nextInt()
System.out.println(s);

intScanner.close();
stringScanner.close();
2
задан Jeet Parekh 1 October 2015 в 17:20
поделиться

2 ответа

Не используйте setGridLinesVisible(true): в документации явно указано, что это только для отладки.

Вместо этого поместите панель во все ячейки сетки (даже пустые ), и создайте панель, чтобы увидеть границы. (Это дает вам возможность очень тщательно контролировать границы, поэтому вы можете избежать двойных границ и т. Д.). Затем добавьте контент в каждую панель. Вы также можете зарегистрировать прослушиватели мыши на панели, что означает, что вам не нужно делать уродливую математику, чтобы выяснить, какая ячейка была нажата.

Рекомендуемый способ применения границы к любому региону - использовать CSS и подход «вложенного фона». В этом подходе вы рисуете два (или более) фоновых залива в регионе, с разными вставками, дающими внешний вид границы. Например:

-fx-background-fill: black, white ;
-fx-background-insets: 0, 1 ;

сначала нарисует черный фон без вставки, а затем над ним будет нарисован белый фон со вставками в 1 пиксель со всех сторон, что даст вид черной границы ширина 1 пиксель. Хотя это может показаться противоречивым, выполнение этого (предположительно) лучше, чем указание границы напрямую. Вы также можете указать последовательность из четырех значений для вставки для для каждой заливки, которые интерпретируются как вставки сверху, справа, внизу и слева соответственно. Таким образом,

-fx-background-fill: black, white ;
-fx-background-insets: 0, 0 1 1 0 ;

имеет черную границу справа и внизу и т. Д.

Я также не уверен SubScene, что вы действительно хотите, если только вы намереваются прикреплять различные камеры к каждой ячейке. Если вам действительно нужна подсессия, сделайте заливку прозрачной, чтобы избежать рисования по краям ячейки. Вы могли бы просто добавить Group непосредственно в каждую ячейку (возможно, вы можете просто добавить круг, в зависимости от того, что вам нужно ...).

Что-то вроде:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.RowConstraints;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class Game2 extends Application{
    @Override
    public void start(final Stage stage) throws Exception {
        int rows = 5;
        int columns = 5;

        stage.setTitle("Enjoy your game");

        GridPane grid = new GridPane();
        grid.getStyleClass().add("game-grid");

        for(int i = 0; i < columns; i++) {
            ColumnConstraints column = new ColumnConstraints(40);
            grid.getColumnConstraints().add(column);
        }

        for(int i = 0; i < rows; i++) {
            RowConstraints row = new RowConstraints(40);
            grid.getRowConstraints().add(row);
        }

        for (int i = 0; i < columns; i++) {
            for (int j = 0; j < rows; j++) {
                Pane pane = new Pane();
                pane.setOnMouseReleased(e -> {
                    pane.getChildren().add(Anims.getAtoms(1));
                });
                pane.getStyleClass().add("game-grid-cell");
                if (i == 0) {
                    pane.getStyleClass().add("first-column");
                }
                if (j == 0) {
                    pane.getStyleClass().add("first-row");
                }
                grid.add(pane, i, j);
            }
        }


        Scene scene = new Scene(grid, (columns * 40) + 100, (rows * 40) + 100, Color.WHITE);
        scene.getStylesheets().add("game.css");
        stage.setScene(scene);
        stage.show();
    }

    public static class Anims {

        public static Node getAtoms(final int number) {
            Circle circle = new Circle(20, 20f, 7);
            circle.setFill(Color.RED);
            Group group = new Group();
            group.getChildren().add(circle);
//            SubScene scene = new SubScene(group, 40, 40);
//            scene.setFill(Color.TRANSPARENT);
            return group;
        }
    }

    public static void main(final String[] arguments) {
        Application.launch(arguments);
    }
}

и css:

.game-grid {
    -fx-background-color: white ;
    -fx-padding: 10 ;
}
.game-grid-cell {
    -fx-background-color: black, white ;
    -fx-background-insets: 0, 0 1 1 0 ;
}
.game-grid-cell.first-row {
    -fx-background-insets: 0, 1 1 1 0 ;
}
.game-grid-cell.first-column {
    -fx-background-insets: 0, 0 1 1 1 ;
}
.game-grid-cell.first-row.first-column {
    -fx-background-insets: 0, 1 ;
}
6
ответ дан James_D 1 September 2018 в 05:09
поделиться

Этот подход был одобрен @James_D в комментарии.

Просто добавьте промежуток H и V ширины одного пикселя и позвольте фоновому цвету панели сетки «сиять» через:

.my-grid-pane {
    -fx-background-color: lightgray;
    -fx-vgap: 1;
    -fx-hgap: 1;
    -fx-padding: 1;
}

Если фоновый цвет панели сетки распространяется снаружи более одного пикселя (произойдет, если его родитель больше, чем он сам), просто оберните сетку в Group!

0
ответ дан Mordechai 1 September 2018 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: