淡入淡出过渡的 JavaFX 问题

JavaFX trouble with fade transitions

我目前正在开发一个应用程序。它的视觉结构如下:

ApplicationLayout 有一个 Header 和一个页脚(页脚尚未实现),看起来像这样:

我通过将 StackPane 设置为 BorderPane 的中心,将页面添加到其中,并在其顶部添加一个白色的 VBox,成功实现了页面之间的淡入/淡出过渡。所以在我进行页面切换之前,我使用这个白色 VBox 的 FadeTransitions。

我不得不这样做,因为 setOpacity() 出于某种原因不会更改文本字段或按钮不透明度。

现在我正在尝试为 header 做完全相同的事情。所以我在顶部设置了一个 StackPane,并在其中添加了 header 并在其顶部添加了一个 "header coverer" ,据说它应该像以前一样做这个技巧(不能修改不透明度 属性 的标题、箭头或描述,因为 CSS 覆盖)。

但是这次它不起作用,如果我将 header 覆盖器的不透明度设置为除 0 以外的任何值,header 中的内容将不会显示。

我想要完成的是淡出/淡入 header 但不是橙色 HBox 的组件。

编辑:添加了一个对我不起作用的最小示例

public class Main extends Application {


    private Boolean buttonPressed = false;


    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {

        BorderPane appWindow = new BorderPane();
        appWindow.setStyle("-fx-alignment: center; -fx-padding: 30 0 0 30");
        appWindow.setBackground(new Background(new BackgroundFill(Color.PERU, null, null)));
        GridPane loginContainer = new GridPane();
        appWindow.setCenter(loginContainer);

        TextField username = new TextField();
        PasswordField password = new PasswordField();
        Label userNameDesc = new Label("Username");
        Label passwordDesc = new Label("Password");
        Button logInBtn = new Button("Log In");

        logInBtn.setTranslateX(100);
        logInBtn.setTranslateY(20);

        logInBtn.setOnAction(event -> {

            if (!buttonPressed) {
                appWindow.getCenter().setOpacity(30);
                buttonPressed = true;
                System.out.println("Opacity set to " + appWindow.getCenter().getOpacity());
            }

            else {
                appWindow.getCenter().setOpacity(100);
                buttonPressed = false;
                System.out.println("Opacity set to " + appWindow.getCenter().getOpacity());
            }

        });

        loginContainer.addColumn(0, userNameDesc, passwordDesc);
        loginContainer.addColumn(1, username, password);
        loginContainer.add(logInBtn, 1, 2);

        Scene scene = new Scene(appWindow, 300, 250);
        stage.setScene(scene);
        stage.show();
    }
}

按下 "Log In" 按钮应该会影响 Gridpane 和 Gridpane childs 的视觉不透明度,但它不会。它只打印正确的不透明度值。

根据 documentation:

Opacity is specified as a value between 0 and 1. Values less than 0 are treated as 0, values greater than 1 are treated as 1.

因此将值设置为 30100 没有任何效果:两者都被视为完全不透明(即它们被限制在 1)。

正在替换

appWindow.getCenter().setOpacity(30);

appWindow.getCenter().setOpacity(0.3);

将使中心内容部分透明。