JavaFX有淡入淡出过渡的麻烦

时间:2017-01-25 02:21:36

标签: css javafx transition fade

我正在开发一款应用。它的视觉结构如下:

  • 只有一个舞台
  • 只有一个场景,其中包含 ApplicationContainer (我自己的类 基本上是一个StackPane,里面有一个BorderPane 菜单栏位于顶部,当前页面位于其中心位置。
  • 多个 ApplicationLayout

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

enter image description here

我已经设法通过将StackPane设置为BorderPane的中心来实现页面之间的fadeIn / fadeOut过渡,将页面添加到页面,最重要的是,添加一个白色的VBox。所以在我进行页面切换之前,我使用这个白色VBox的FadeTransitions。

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

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

但是这次它不起作用,如果我将标题coverer的不透明度设置为除0以外的任何内容,标题中的内容都不显示。

我想要实现的是fadeOut / FadeIn标题的组件而不是橙色的HBox。

编辑:添加了一个最不适合我的例子

Capture2

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

按“登录”按钮会影响Gridpane和Gridpane子视觉不透明度,但事实并非如此。它只打印正确的不透明度值。

1 个答案:

答案 0 :(得分:1)

根据documentation

  

不透明度指定为0到1之间的值。小于0的值被视为0,大于1的值被视为1。

因此,将值设置为30100无效:两者都被视为完全不透明(即它们被钳制在1)。

更换

appWindow.getCenter().setOpacity(30);

appWindow.getCenter().setOpacity(0.3);

将使中心内容部分透明。