How to show / hide / auto hide a node

前端 未结 1 352
误落风尘
误落风尘 2020-12-22 10:39

I am doing a javafx project which if i click the button, the scene is showing, but if the scene is left open for few seconds, the scene will auto hide.

The actual s

1条回答
  •  没有蜡笔的小新
    2020-12-22 11:04

    Here is an mcve version of the code you are following, to get you started :

    import java.io.IOException;
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    
    public class Test1 extends Application  {
    
        @Override
        public void start(Stage primaryStage) {
            try {
                StackPane page = (StackPane) FXMLLoader.load(this.getClass().getResource("test1.fxml"));
                Scene scene = new Scene(page);
                primaryStage.setScene(scene);
                primaryStage.show();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    test1.fxml

    
    
    
    
    
    
    
    
      
        
          
            

    and its controller:

    import javafx.animation.TranslateTransition;
    import javafx.fxml.FXML;
    import javafx.scene.layout.VBox;
    import javafx.util.Duration;
    
    public class Test1Controller {
    
        @FXML private VBox statusContainer;
    
        private TranslateTransition showStatus;
        private TranslateTransition hideStatus;
        private boolean showsStatus = false;
    
        @FXML void initialize() {
    
            showStatus = new TranslateTransition(Duration.millis(250), statusContainer);
            showStatus.setByY(-100.0);
            showStatus.setOnFinished(event -> showsStatus = true);
            hideStatus = new TranslateTransition(Duration.millis(250), statusContainer);
            hideStatus.setByY(100.0);
            hideStatus.setOnFinished(event -> showsStatus = false);
        }
    
       public void toggleStatus() {
            if( showsStatus ) {
                showStatus.stop();
                hideStatus.play();
            }
            else {
                hideStatus.stop();
                showStatus.play();
            }
        }
    }
    

    Edit: you can add auto-hide of the sliding node to the controller:

    public class Test1Controller {
    
        @FXML private VBox statusContainer;
    
        private TranslateTransition showStatus;
        private TranslateTransition hideStatus;
        private boolean showsStatus = false;
        private static final int AUTO_HIDE_DEALY = 5;
    
        @FXML void initialize() {
    
            showStatus = new TranslateTransition(Duration.millis(250), statusContainer);
            showStatus.setByY(-100.0);
            showStatus.setOnFinished(event -> {
                showsStatus = true;
                autoHide();
            });
            hideStatus = new TranslateTransition(Duration.millis(250), statusContainer);
            hideStatus.setByY(100.0);
            hideStatus.setOnFinished(event -> showsStatus = false);
        }
    
        public void toggleStatus() {
            if( showsStatus ) {
                hide();
            }
            else {
                show();
            }
        }
    
        private void show(){
            hideStatus.stop();
            showStatus.play();
        }
    
        private void hide(){
            showStatus.stop();
            hideStatus.play();
        }
    
        private void autoHide() {
            Duration duration = Duration.seconds(AUTO_HIDE_DEALY);
            PauseTransition transition = new PauseTransition(duration);
            transition.setOnFinished(evt ->{
                if( showsStatus ) {
                    hide();
                }
            });
            transition.play();
        }
    }
    

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