How to make a Text content disappear after some time in JavaFX?

后端 未结 1 1188
悲哀的现实
悲哀的现实 2021-02-06 17:55
b1.setOnAction(new EventHandler() {
        @Override
        public void handle(ActionEvent e) {
            try {
                Class.forName(\"co         


        
1条回答
  •  感情败类
    2021-02-06 18:25

    Use Timelines and/or Transitions.

    This answer is for a previous iteration of the question.

    Sample solution code

    import javafx.animation.*;
    import javafx.application.Application;
    import javafx.scene.*;
    import javafx.scene.control.Label;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    import javafx.util.Duration;
    
    public class BlinkingAndFading extends Application {
        @Override
        public void start(Stage stage) {
            Label label = new Label("Blinking");
            label.setStyle("-fx-text-fill: red; -fx-padding: 10px;");
    
            Timeline blinker = createBlinker(label);
            blinker.setOnFinished(event -> label.setText("Fading"));
            FadeTransition fader = createFader(label);
    
            SequentialTransition blinkThenFade = new SequentialTransition(
                    label,
                    blinker,
                    fader
            );
    
            stage.setScene(new Scene(new StackPane(label), 100, 50));
            stage.show();
    
            blinkThenFade.play();
        }
    
        private Timeline createBlinker(Node node) {
            Timeline blink = new Timeline(
                    new KeyFrame(
                            Duration.seconds(0),
                            new KeyValue(
                                    node.opacityProperty(), 
                                    1, 
                                    Interpolator.DISCRETE
                            )
                    ),
                    new KeyFrame(
                            Duration.seconds(0.5),
                            new KeyValue(
                                    node.opacityProperty(), 
                                    0, 
                                    Interpolator.DISCRETE
                            )
                    ),
                    new KeyFrame(
                            Duration.seconds(1),
                            new KeyValue(
                                    node.opacityProperty(), 
                                    1, 
                                    Interpolator.DISCRETE
                            )
                    )
            );
            blink.setCycleCount(3);
    
            return blink;
        }
    
        private FadeTransition createFader(Node node) {
            FadeTransition fade = new FadeTransition(Duration.seconds(2), node);
            fade.setFromValue(1);
            fade.setToValue(0);
    
            return fade;
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }  
    

    Answers to additional questions

    lambda expression not expected here lambda expressions are not supported in -source 1.7 (use -source 8 or higher to enable lambda expressions)

    You should use Java 8 and not set -source 1.7. If you wish to stick with Java 7 (which I don't advise for JavaFX work), you can replace the Lambda:

    blinker.setOnFinished(event -> label.setText("Fading"));
    

    with:

    blinker.setOnFinished(new EventHandler() {
        @Override
        public void handle(ActionEvent event) {
            label.setText("Fading");
        }
    });
    

    actual and formal argument lists differ in length

    Again, you should use Java 8. But if you wish to use Java 7, replace:

    stage.setScene(new Scene(new StackPane(label), 100, 50));
    

    with:

    StackPane layout = new StackPane();
    layout.getChildren().add(label);
    stage.setScene(new Scene(layout, 100, 50));
    

    Further recommendations

    Good call on not having the text both blink and fade. Blinking text makes for pretty distracting UI, but just fading is fine.

    I don't think I'd recommend fading an error message, at least until the user clicks on it or something like that. What if the user didn't see the error message before it faded away?

    0 讨论(0)
提交回复
热议问题