Как удалить предыдущий стиль во время анимации javaFX - PullRequest
0 голосов
/ 23 октября 2018

Я делаю версию Game of Life, но у меня возникают проблемы с удалением цвета фона ячеек, которые должны умирать.


Код (извлечение):

public class Life extends Application {
private static int DIM = 32;
private Cell[][] cell = new Cell[DIM][DIM];
private boolean[][] nextState = new boolean[DIM][DIM];
private Timeline animation = new Timeline(new KeyFrame(Duration.millis(300), e -> step()));
private RadioButton rbLife = new RadioButton("Life");
private RadioButton rbHLife = new RadioButton("HighLife");
private Button step = new Button("Step");
private Button playStop = new Button("Play");
private Button clear = new Button("Clear");
private Slider slRate = new Slider();
private Label rate = new Label("Rate: ");


@Override
public void start(Stage primaryStage) {
    GridPane pane = new GridPane();
    pane.setStyle("-fx-background-color: black");
    for (int i = 0; i < DIM; i++)
        for (int j = 0; j < DIM; j++)
            pane.add(cell[i][j] = new Cell(), j, i);

    BorderPane borderPane = new BorderPane();
    borderPane.setCenter(pane);
    borderPane.setBottom(getHBox());

public void step() {
    for (int i=0; i < DIM; i++) {
        for (int j = 0; j < DIM; j++) {
            computeNextState(i, j);
        }
    }

    for (int i=0; i < DIM; i++) {
        for (int j = 0; j < DIM; j++) {
            cell[i][j].updateState(nextState[i][j], i, j);

        }
    }
}

public boolean[][] computeNextState(int row, int col) {
    int liveCount = 0;
    for (int i = -1; i <= 1; i++)
        for (int j = -1; j <= 1; j++)
            if (cell[(row + i + DIM) % DIM][(col + j + DIM) % DIM].isAlive())
                liveCount++;
            if (cell[row][col].isAlive())
                liveCount--;
            if (rbLife.isSelected()) {
                if (liveCount == 3 || cell[row][col].isAlive() && liveCount == 2) {
                    nextState[row][col] = true;
                }
                else
                    nextState[row][col] = false;
            }
    return nextState;
}

public class Cell extends Pane {
    private char token = ' ';

    public Cell() {
        setStyle("-fx-border-color: white; -fx-border-width: .17;");
        this.setPrefSize(100, 100);
        this.setOnMouseClicked(e -> handleMouseClick());
    }

    public boolean isAlive() {
        if (token == 'a') {
            return true;
        }
        else
            return false;
    }

    public char getToken() {
        return token;
    }

    public void setToken(char c) {
        token = c;
    }

    private void handleMouseClick() {
        setStyle("-fx-background-color: green");
        setToken('a');
    }

    public void updateState(boolean state, int row, int col) {
        if (state == true) {
            setToken('a');
            setStyle("-fx-background-color: green");
        }
        else
            setToken(' ');
            //cell[row][col].setBackground(Background.EMPTY);
    }
}

В updateState () я попытался установить черный, нулевой фон, очистить стиль с помощью getStyleClass (). Clear().

Установка фона на пустой с помощью setBackground () перекрасит их в черный цвет, но тогда ячейки не могут быть перекрашены в зеленый цвет в следующем поколении.Что я здесь упускаю?

Я пропустил части, которые, я думаю, не имеют значения.Спасибо за любые СОВЕТЫ!

1 Ответ

0 голосов
/ 23 октября 2018

В updateState() Я попытался установить черный цвет фона, ноль,

Это не работает, поскольку стили CSS имеют более высокий приоритет, чем свойство background.

очистка стиля с помощью getStyleClass().clear().

Это не работает, поскольку просто очищает классы стилей узла.Тем не менее, вы используете встроенный стиль.


Вы должны установить фон в обоих случаях одинаково:

if (state) {
    setToken('a');
    setStyle("-fx-background-color: green");
} else {
    setToken(' ');
    setStyle("-fx-border-color: white; -fx-border-width: .17;"); // or null if you don't want to revert to the original style
}

или при условии, что вы удалите свойства фона из всех переданных параметровдо setStyle:

private static final FALSE_BACKGROUND = new Background(new BackgroundFill(Color.WHITE, CornerRadii.EMPTY, Insets.EMPTY));
private static final TRUE_BACKGROUND = new Background(new BackgroundFill(Color.GREEN, CornerRadii.EMPTY, Insets.EMPTY));

...

if (state) {
    setToken('a');
    setBackground(TRUE_BACKGROUND);
} else {
    setToken(' ');
    setBackground(FALSE_BACKGROUND);
}
...