How to show / hide / auto hide a node

前端 未结 1 337
误落风尘
误落风尘 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

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.layout.AnchorPane?>
    <?import javafx.scene.layout.StackPane?>
    <?import javafx.scene.layout.VBox?>
    
    <StackPane id="StackPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" 
    minWidth="-Infinity" prefHeight="300.0" prefWidth="500.0" xmlns="http://javafx.com/javafx/10.0.1" 
    xmlns:fx="http://javafx.com/fxml/1" fx:controller="Test1Controller">
      <children>
        <AnchorPane prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: blue;">
          <children>
            <Button mnemonicParsing="false" onAction="#toggleStatus" text="Status" AnchorPane.leftAnchor="50.0" AnchorPane.topAnchor="100.0" />
          </children>
        </AnchorPane>
        <VBox fx:id="statusContainer" maxHeight="100.0" prefHeight="100.0" style="-fx-background-color: yellow;" translateY="100.0" StackPane.alignment="BOTTOM_LEFT" />
      </children>
    </StackPane>
    

    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)
提交回复
热议问题