淡入淡出过渡的 JavaFX 问题
JavaFX trouble with fade transitions
我目前正在开发一个应用程序。它的视觉结构如下:
- 只有一个阶段。
- 只有一个 Scene 有一个 ApplicationContainer(我自己的 class
基本上是一个 StackPane,里面有一个 BorderPane,还有一个
菜单栏在顶部,当前页面在它的中心)。
- 多个ApplicationLayout的
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.
因此将值设置为 30
或 100
没有任何效果:两者都被视为完全不透明(即它们被限制在 1
)。
正在替换
appWindow.getCenter().setOpacity(30);
和
appWindow.getCenter().setOpacity(0.3);
将使中心内容部分透明。
我目前正在开发一个应用程序。它的视觉结构如下:
- 只有一个阶段。
- 只有一个 Scene 有一个 ApplicationContainer(我自己的 class 基本上是一个 StackPane,里面有一个 BorderPane,还有一个 菜单栏在顶部,当前页面在它的中心)。
- 多个ApplicationLayout的
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.
因此将值设置为 30
或 100
没有任何效果:两者都被视为完全不透明(即它们被限制在 1
)。
正在替换
appWindow.getCenter().setOpacity(30);
和
appWindow.getCenter().setOpacity(0.3);
将使中心内容部分透明。