Я хочу изменить цвет случайной кнопки, подождите 1 сек c, затем верните ее в значение по умолчанию, в цикле for - PullRequest
0 голосов
/ 14 января 2020

Я хочу создать код, в котором с каждой итерацией я получаю случайное число, и на основе этого числа кнопка меняет свой цвет на светло-зеленый, затем через одну секунду она возвращается к значению по умолчанию, но моя проблема в том, что for () не будет ждать, пока кнопка изменится, и она начнет свою новую итерацию. Пока это мой код:

for(int i=0; i<n; i++) {
     int x = rand.nextInt(4) + 1;
        switch(x) {
            case 1: {
                System.out.println("b1");
                button1.setStyle("-fx-background-color: lightgreen; -fx-border-color: black;");

                PauseTransition wait = newPauseTransition(Duration.seconds(1));
                wait.setOnFinished(event -> {
                button1.setStyle("");
            });
            wait.play();
        }
        break;
        case 2: {
            System.out.println("b2");
            button2.setStyle("-fx-background-color: lightgreen; -fx-border-color: black;");

            PauseTransition wait = new PauseTransition(Duration.seconds(1));
            wait.setOnFinished(event -> {
                button2.setStyle("");
            });
            wait.play();
        }
        break;
        ...
}

Как мне сделать так, чтобы l oop не блокировал обновления пользовательского интерфейса? Я видел кое-что о создании новой темы для l oop, но я не могу понять, как это сделать и где использовать Platform.runLater.

1 Ответ

1 голос
/ 14 января 2020

Может быть, следующий код делает то, что вы хотите. Он использует временную шкалу для случайного выбора кнопки каждую секунду и установки для кнопки зеленого цвета, в то время как для любой кнопки, для которой ранее был установлен ее цвет, восстанавливается цвет по умолчанию.

snapshot

import javafx.animation.*;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.Duration;

import java.util.Random;

public class RandomLighting extends Application {
    private static final int NUM_BUTTONS = 4;
    private static final Duration LIGHT_DURATION = Duration.seconds(1);
    private static final HBox buttons = new HBox(10);

    private static final String LIT_STYLE = "-fx-base: lightgreen;";
    private static Random random;

    private Button litButton;

    @Override
    public void init() {
        random = new Random(42);
    }

    @Override
    public void start(Stage stage) {
        buttons.setPadding(new Insets(10));
        for (int i = 0; i < NUM_BUTTONS; i++) {
            buttons.getChildren().add(new Button("" + (i + 1)));
        }

        Timeline lightAnimation = new Timeline(
                new KeyFrame(Duration.ZERO, 
                        event -> lightButton(chooseRandomButton())
                ),
                new KeyFrame(LIGHT_DURATION)
        );
        lightAnimation.setCycleCount(Timeline.INDEFINITE);

        stage.setScene(new Scene(buttons));
        stage.show();

        lightAnimation.play();
    }

    private Button chooseRandomButton() {
        ObservableList<Node> candidates = buttons.getChildren();
        return (Button) candidates.get(random.nextInt(candidates.size()));
    }

    private void lightButton(Button button) {
        if (litButton == button) {
            return;
        }

        if (litButton != null) {
            litButton.setStyle(null);
        }

        litButton = button;

        if (litButton != null) {
            button.setStyle(LIT_STYLE);
        }
    }

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