【问题标题】:JavaFX trouble with fade transitionsJavaFX 的淡入淡出问题
【发布时间】:2017-01-25 02:21:35
【问题描述】:

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

  • 只有一个阶段
  • 只有一个 Scene 有一个 ApplicationContainer(我自己的类 基本上是一个 StackPane,里面有一个 BorderPane,里面有一个 MenuBar 位于顶部,当前页面位于其中心)。
  • 多个ApplicationLayout

ApplicationLayout 有一个页眉和一个页脚(页脚尚未实现),如下所示:

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

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

现在我正在尝试对标题做同样的事情。所以我设置了一个 StackPane 到顶部,并在它上面添加了标题和一个“标题覆盖器”,它应该像以前一样做这个技巧(不能修改标题、箭头或描述的 opacity 属性因为 CSS 覆盖)。

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

我想要完成的是淡出/淡入标题的组件,而不是橙色的 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();
    }
}

按下“登录”按钮应该会影响 Gridpane 和 Gridpane 子项的视觉不透明度,但不会。它只是打印正确的不透明度值。

【问题讨论】:

  • 你能用简单的方法创建一个minimal reproducible example,即没有“封面”。如果我淡出带有按钮和文本字段的容器,则按钮和文本字段都可以很好地淡出。您应该不需要您描述的任何解决方法。
  • @James_D 刚刚添加了一个对我不起作用的最小示例
  • 这并不是您所描述的真正示例(没有淡入淡出过渡等),但它不会做您想要的,因为您设置的不透明度值超出了界限。

标签: css javafx transition fade


【解决方案1】:

根据documentation

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

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

替换

appWindow.getCenter().setOpacity(30);

appWindow.getCenter().setOpacity(0.3);

将使中心内容部分透明。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多