Временно изменить цвет кнопки при нажатии - PullRequest
0 голосов
/ 20 апреля 2019

Мне нужно временно изменить цвет фона нажатой кнопки на 0,5 секунды, а затем вернуть его к исходному цвету.

Я пытался использовать pausetransition, но я действительно новичок в java и не уверен, как правильно его использовать. Сейчас самое лучшее, что я могу сделать, - это заставить кнопку остаться на новом цвете при нажатии.

       Color[] colors = new Color[]{Color.DARKORCHID,Color.SALMON,Color.SPRINGGREEN,Color.GOLD};
        Color randomColor = colors[(new Random().nextInt(4))]; 
        button.setBackground(new Background(new BackgroundFill(randomColor,null,null)));
        grid.add(button, column, row);
         button.setOnAction(new EventHandler<ActionEvent>(){
          public void handle(ActionEvent e){
             Button b = (Button)e.getSource();
             Button save = b;
             b.setBackground(new Background(new BackgroundFill(Color.LIGHTGRAY,null,null)));
          }
        });
}

Сейчас это просто изменение цвета на серый. Если бы я мог понять, как заставить цвет временно изменить ИЛИ даже изменить обратно при повторном нажатии. Другая часть моей проблемы заключается в том, что все кнопки имеют разные цвета. Любые советы или помощь будут оценены.

1 Ответ

1 голос
/ 20 апреля 2019

Для каждого Button, который вы создаете, вам нужно создать PauseTransition с продолжительностью полсекунды, который вернет фон к исходному. Когда вы нажимаете Button, вы меняете фон на серый и перезагружаете PauseTransition. Это сделает так, чтобы фон перевернулся через полсекунды после последнего щелчка. Вот небольшой пример:

import java.util.Random;
import javafx.animation.Animation.Status;
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        GridPane root = new GridPane();
        root.setAlignment(Pos.CENTER);
        root.setHgap(10);
        root.setVgap(10);
        root.setPadding(new Insets(10));

        fillGrid(root);

        primaryStage.setScene(new Scene(root, 500, 300));
        primaryStage.show();
    }

    private static void fillGrid(GridPane grid) {
        Background[] backgrounds = {
            new Background(new BackgroundFill(Color.DARKORCHID, null, null)),
            new Background(new BackgroundFill(Color.SALMON, null, null)),
            new Background(new BackgroundFill(Color.SPRINGGREEN, null, null)),
            new Background(new BackgroundFill(Color.GOLD, null, null))
        };
        Background greyBg = new Background(new BackgroundFill(Color.GREY, null, null));

        Random rand = new Random();
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                Background original = backgrounds[rand.nextInt(backgrounds.length)];

                Button button = new Button(String.format("(%d,%d)", i, j));
                button.setBackground(original);

                PauseTransition transition = new PauseTransition(Duration.seconds(0.5));
                transition.setOnFinished(event -> button.setBackground(original));

                button.setOnMouseClicked(event -> {
                    event.consume();
                    button.setBackground(greyBg);
                    transition.playFromStart();
                });

                grid.add(button, j, i);
            }
        }
    }

}
...