Дочерние узлы не отображаются при запуске () - PullRequest
0 голосов
/ 18 ноября 2018

Я добавляю кнопки на панель и хочу нарисовать несколько начальных шашек посередине (обычные правила Отелло).Вот полный поток:

public class Board extends Application {

private Game model;

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

@Override
public void start(Stage primaryStage) {
  this.model = new Game();
  BorderPane mainLayout = new BorderPane();
  GridPane layout = new GridPane();
  for(int r=0; r<8; r++) {
    for(int c=0; c<8; c++) {
      OthelloButton b = new OthelloButton(c, r);
      b.setPrefSize(100,100);
      int thisCellContent = this.model.getContents()[r][c];
      if (thisCellContent != Game.EMPTY) b.redrawButton(thisCellContent);
      b.setOnMouseClicked(b::handleButtonClick);
      layout.add(b, c, r);
    }
  }
  primaryStage.setTitle("Othello");
  mainLayout.setCenter(layout);
  primaryStage.setScene(new Scene(mainLayout,500,550));
  primaryStage.show();
}

class OthelloButton extends Button {
  private int x;
  private int y;

  OthelloButton(int xInGrid, int yInGrid) {
    super("");
    this.x = xInGrid; this.y = yInGrid;
    this.setBackground(new Background(new BackgroundFill(Color.GREEN,
        null, new Insets(1.0)) ));
  }

  public int getX() {
    return x;
  }

  public int getY() {
    return y;
  }

  private void handleButtonClick(MouseEvent e){
    model.calculateMoves();
    // don't react to not allowed move
    List<Move> moves = model.nextMove(this.getX(), this.getY());;
   if (moves == null){
     return;
   }
    for (Move move: moves)
    {
      for (Node button: this.getParent().getChildrenUnmodifiable()) {
        OthelloButton castedButton = ((OthelloButton) button);
        if (castedButton.coordinatesEqual(move)) castedButton.redrawButton(model.getCurrentPlayer());
      }
    }
    model.switchPlayer();
    }

  private boolean coordinatesEqual(Move move) {
    return move.x == this.x && move.y == this.y;
  }

  private void redrawButton(int positionContent) {
    if (!this.getChildren().isEmpty())
      this.getChildren().clear();

    if (!(positionContent == Game.EMPTY)) {
      Circle outer = new Circle(getWidth()/2, getHeight()/2, getHeight()/2 - 5);
      outer.setFill(positionContent == Game.PLAYER1? Color.ANTIQUEWHITE: Color.BLACK);
      outer.setStroke(Color.BLACK);
      outer.setStrokeWidth(1.5);
      this.getChildren().add(outer);
    }

  }
}
}

Как видите, метод redrawButton() используется для «установки» проверки на стол и работает, когда я вызываю ее позже при нажатии кнопки.Тем не менее, он не будет рендерить никаких проверок в самом начале приложения.Что может быть проблемой здесь?Заранее спасибо!

РЕДАКТИРОВАТЬ : обновлено описание проблемы, надеюсь, что ход приложения уже ясен.Спасибо @Zephyr и @fabian за ваши замечания!

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