Я добавляю кнопки на панель и хочу нарисовать несколько начальных шашек посередине (обычные правила Отелло).Вот полный поток:
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 за ваши замечания!