Сборка шахматной доски JavaFX, установка цвета ячейки сетки - PullRequest
0 голосов
/ 26 мая 2020

Я сделал этот 2-мерный массив. Я думаю, ты поймешь это.

public int[][] table = new int[8][8] ;
    public void initTable()
    {
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (i % 2 != 0)
                {
                    if(j % 2 == 0) {
                        table[i][j] = 1; //black field
                    }
                }
                else if (i % 2 == 0)
                {
                    if(j % 2 != 0)
                    {
                        table[i][j] = 1;
                    }
                }
            }
        }
    }

Я хочу раскрасить ячейки панели сетки. Я пробовал это:

public class GameController {

   @FXML
   private GridPane gridPane;

   @FXML
   private Pane blackPane = new Pane();

   @FXML
   private Pane whitePane = new Pane();;

   private final Game game = new Game();

   public void initGame () {
       blackPane.setStyle("-fx-background-color: #454343;");
       whitePane.setStyle("-fx-background-color: #fafafa;");
       System.out.println("PRESSED");
       for (int i = 0; i < 8; i++) {
           for (int j = 0; j < 8; j++) {
               if (game.table[i][j] == 1) {
                   gridPane.add(blackPane, i, j);
               }
               if (game.table[i][j] == 0) {
                   gridPane.add(whitePane, i, j);
               }
           }
       }
   }
}

Когда я нажимаю кнопку, она вызывает функцию, выводит «НАЖАТИЕ», но не меняет цвет фона на черный или белый.

Что может быть проблемой?

1 Ответ

2 голосов
/ 26 мая 2020

Я сделал небольшой пример того, как вы могли бы это сделать. Возможно, вы сможете найти ошибку в своем коде при анализе моего примера.

Класс контроллера:

package sample;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

public class Controller implements Initializable {

    @FXML
    private GridPane gameFieldGridPane;

    // Choose what u need:
    private Pane[][] paneArray;
    private List<Pane> paneList;


    @Override
    public void initialize(URL location, ResourceBundle resources) {
        paneList = new ArrayList<>();
        paneArray = new Pane[8][8];
    }

    @FXML
    public void handleStartBtnClick() {
        System.out.println("PRESSED");

        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                Pane pane = new Pane();
                paneList.add(pane);
                paneArray[i][j] = pane;

                String blueStyle = "-fx-background-color: blue;",
                        redStyle = "-fx-background-color: red;";

                if (i % 2 == 0) {
                    if (j % 2 == 0) {
                        pane.setStyle(redStyle);
                    } else {
                        pane.setStyle(blueStyle);
                    }
                } else {
                    if (j % 2 != 0) {
                        pane.setStyle(redStyle);
                    } else {
                        pane.setStyle(blueStyle);
                    }
                }

                gameFieldGridPane.add(pane, j, i);
            }
        }
    }

    @FXML
    public void handleMakeBlackBtnClick() {
        changeColorToBlack(paneArray[2][2]);

        // or equivalent:
        // changeColorToBlack(paneList.get(18));
    }

    private void changeColorToBlack(Pane pane) {
        if (pane == null) return;
        pane.setStyle("-fx-background-color: black;");
    }
}

F XML Файл:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>

<VBox alignment="CENTER" spacing="3.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <GridPane fx:id="gameFieldGridPane">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" prefWidth="100.0" />
          <ColumnConstraints hgrow="SOMETIMES" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" prefWidth="100.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints prefHeight="100.0" vgrow="SOMETIMES" />
          <RowConstraints prefHeight="100.0" vgrow="SOMETIMES" />
          <RowConstraints prefHeight="100.0" vgrow="SOMETIMES" />
            <RowConstraints prefHeight="100.0" vgrow="SOMETIMES" />
            <RowConstraints prefHeight="100.0" vgrow="SOMETIMES" />
            <RowConstraints prefHeight="100.0" vgrow="SOMETIMES" />
            <RowConstraints prefHeight="100.0" vgrow="SOMETIMES" />
        </rowConstraints>
      </GridPane>
      <Button onAction="#handleStartBtnClick" text="Start" />
      <Button onAction="#handleMakeBlackBtnClick" text="Make one Pane black" />
   </children>
   <padding>
      <Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
   </padding>
</VBox>

Предварительный просмотр:

preview

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...