如何显示/隐藏/自动隐藏节点

时间:2019-06-21 16:34:52

标签: animation javafx fxml

我正在做一个javafx项目,如果我单击按钮,将显示场景,但是如果将场景打开几秒钟,则场景将自动隐藏。

实际场景是,如果我将其保持打开状态,它将自动隐藏在主场景的下方,就像按下按钮一样。

但是我尝试了很多方法,场景将不会隐藏或向上移动,如果我单击按钮,则场景将在场景向上移动,但不在主场景上。

如果场景不在主场景上,则不会发生任何事情,但是只有当场景在主场景上时,场景才会自动隐藏并向下移动,就像单击按钮时一样,场景从在下面,如果我单击关闭,则场景将隐藏并隐藏,直到再次单击。当我几次不活动(例如移动光标)后单击按钮时,场景将照常运行。

我遵循的代码:Call another FXML within a stage

Testinggg.java

package testinggg;
import java.io.IOException;
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.input.InputEvent;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Testinggg extends Application {
private TestController controller;
@Override
public void start(Stage stage) throws IOException {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("Test.fxml"));
    Parent root = loader.load();
    controller = loader.getController();
    stage.setScene(new Scene(root));
    stage.setFullScreen(true);
    stage.show();
    Duration duration = Duration.seconds(5);
    PauseTransition transition = new PauseTransition(duration);
    transition.setOnFinished(evt -> inactive());
    stage.addEventFilter(InputEvent.ANY, evt -> transition.playFromStart());
    transition.play();
} 
private void inactive(){
    //hide the status until status is open
}
public static void main(String[] args) {
    launch(args);
}
}

TestController.java

package testinggg;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.animation.TranslateTransition;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.VBox;
import javafx.util.Duration;
public class TestController implements Initializable {
@FXML private VBox statusContainer;
private TranslateTransition showStatus;
private TranslateTransition hideStatus;
boolean showsStatus = false;

public void toggleStatus() {
    if( showsStatus ) {
        showStatus.stop();
        hideStatus.play();
    }
    else {
        hideStatus.stop();
        showStatus.play();
    }
}
@Override
public void initialize(URL url, ResourceBundle rb) {
    showStatus = new TranslateTransition(Duration.millis(250), statusContainer);
    showStatus.setByY(-1080.0);
    showStatus.setOnFinished(new EventHandler<ActionEvent>() {
        @Override public void handle(ActionEvent event) {
            showsStatus = true;
        }
    });

    hideStatus = new TranslateTransition(Duration.millis(250), statusContainer);
    hideStatus.setByY(1080.0);
    hideStatus.setOnFinished(new EventHandler<ActionEvent>() {
        @Override public void handle(ActionEvent event) {
            showsStatus = false;
        }
    });
}    
}

对于Test.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>

<?import javafx.scene.web.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.image.*?>
<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="1080.0" prefWidth="1920.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testinggg.TestController">
<children>
  <AnchorPane id="AnchorPane" maxHeight="-Infinity" prefHeight="1080.0" prefWidth="1920.0" StackPane.alignment="TOP_LEFT">
     <children>
        <Button mnemonicParsing="false" onAction="#toggleStatus" prefHeight="1080.0" prefWidth="1920.0" text="Button" />
     </children>
  </AnchorPane>
  <VBox fx:id="statusContainer" maxHeight="1080.0" prefHeight="1080.0" translateY="1080.0" StackPane.alignment="BOTTOM_LEFT">
     <children>
        <AnchorPane prefHeight="668.0" prefWidth="1266.0">
           <VBox.margin>
              <Insets bottom="50.0" left="50.0" right="50.0" top="50.0" />
           </VBox.margin>
           <children>
              <ImageView fitHeight="540.0" fitWidth="1820.0" layoutY="43.0" pickOnBounds="true">
                 <image>
                    <Image url="@../Rainbow%20Poro.png" />
                 </image>
              </ImageView>
              <ImageView fitHeight="44.0" fitWidth="153.0" layoutX="857.0" pickOnBounds="true" preserveRatio="true">
                 <image>
                    <Image url="@../logo.png" />
                 </image>
              </ImageView>
              <ScrollPane layoutY="582.0" prefHeight="391.0" prefViewportHeight="208.0" prefViewportWidth="1266.0" prefWidth="1820.0">
                 <content>
                    <TextArea editable="false" layoutY="460.0" prefHeight="515.0" prefWidth="1804.0" text="Some paragraph here" />
                 </content>
              </ScrollPane>
              <Button layoutX="1775.0" mnemonicParsing="false" onAction="#toggleStatus" text="Close" />
           </children>
        </AnchorPane>
     </children>
  </VBox>
</children>
<stylesheets>
<URL value="@test1.css" />
</stylesheets>
</StackPane>

1 个答案:

答案 0 :(得分:1)

以下是您正在遵循的mcve版代码,以帮助您入门:

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>

及其控制者:

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();
        }
    }
}

enter image description here

编辑:您可以将滑动节点的自动隐藏添加到控制器中:

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();
    }
}