Я пытаюсь сделать Connect 4 в JavaFX. У меня несколько проблем с управлением запчастями. Первая проблема: когда я получаю содержимое панели сетки, в конце моего списка есть элемент с именем «группа», который имеет значение NULL, но я не знаю, откуда он взялся, поэтому мне приходится удалять его вручную. И вторая проблема: когда я нажимаю кнопку, часть появляется, но невозможно поместить другую часть друг на друга, и она исчезает в go в другом поле, когда я нажимаю на соответствующую кнопку. Не могли бы вы помочь мне решить эту проблему?
Элемент «группа» в моем списке
public class Connect4 extends Application {
private Stopwatch stopwatch;
private GridPane grid;
public static void main(String[] args) {
launch(args);
}
public Scene connect4() {
BorderPane connect4 = new BorderPane();
//Top
this.stopwatch = new Stopwatch();
this.stopwatch.setFont(font("Segoe UI", FontWeight.BOLD, 25));
this.stopwatch.setPrefHeight(80);
BorderPane.setAlignment(this.stopwatch, Pos.CENTER);
connect4.setTop(this.stopwatch);
//Left
VBox left = new VBox();
left.setPrefWidth(200);
connect4.setLeft(left);
//Center
this.grid = new GridPane();
grid.setPrefSize(600, 700);
grid.setStyle("-fx-grid-lines-visible: true ; -fx-border-width: 5 ; -fx-border-color: blue ; -fx-background-color: white");
ImageView piece;
for (int c = 0; c < 7; ++c) {
for (int r = 0; r < 6; ++r) {
//piece = new ImageView(new Image(new File("redPiece.png").toURI().toString()));
piece = new ImageView();
piece.setDisable(true);
piece.setFitWidth(100);
piece.setFitHeight(100);
grid.add(piece, c, r);
}
}
connect4.setCenter(grid);
//Right
VBox right = new VBox();
right.setPrefWidth(200);
connect4.setRight(right);
//Bottom
HBox colomnSelection = new HBox();
colomnSelection.setAlignment(Pos.CENTER);
colomnSelection.setSpacing(30);
colomnSelection.setPrefHeight(120);
Button rowButton;
RowSelectionAction rowSelectionAction = new RowSelectionAction(this);
for (int c = 0; c < 7; ++c) {
rowButton = new Button(String.valueOf(c + 1));
rowButton.setFont(font("Segoe UI", 15));
rowButton.setPrefWidth(70);
rowButton.setPrefHeight(30);
rowButton.setOnAction(rowSelectionAction);
colomnSelection.getChildren().add(rowButton);
}
BorderPane.setAlignment(colomnSelection, Pos.CENTER);
connect4.setBottom(colomnSelection);
//Scene
return new Scene(connect4, 1100, 800);
}
public GridPane getGrid() {
return this.grid;
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Connect 4");
primaryStage.setScene(connect4());
primaryStage.show();
this.stopwatch.start();
ObservableList<Node> childrens = grid.getChildren();
for (Node node : childrens) {
System.out.println(node);
System.out.println(GridPane.getColumnIndex(node));
}
}
}
public class RowSelectionAction implements EventHandler<ActionEvent> {
Connect4 connect4;
public RowSelectionAction(Connect4 connect4) {
this.connect4 = connect4;
}
@Override
public void handle(ActionEvent actionEvent) {
int colomnNumber = ((Button) (actionEvent.getSource())).getText().charAt(0) - 49;
GridPane grid = this.connect4.getGrid();
ObservableList<Node> childrens = grid.getChildren();
List<Node> columnChildrens = new ArrayList<>();
childrens.remove(42);
for (Node node : childrens) {
if (GridPane.getColumnIndex(node) == colomnNumber) {
columnChildrens.add(node);
}
}
Collections.reverse(columnChildrens);
for (Node node : columnChildrens) {
if (node.isDisable()) {
ImageView piece = new ImageView(new Image(new File("redPiece.png").toURI().toString()));
piece.setDisable(false);
piece.setFitWidth(100);
piece.setFitHeight(100);
this.connect4.getGrid().add(piece, GridPane.getColumnIndex(node), GridPane.getRowIndex(node));
break;
}
}
}
}