使 BorderPane 区域覆盖另一个区域

Make a BorderPane region go over another

为了让 BorderPane 区域覆盖另一个区域,我已经尝试了好几天...

问题如下:我的应用程序设置在 BorderPane 根目录中,With:

正确的区域是问题所在。单击 TOP 区域中的 "notification button" 时,它应该 appear/disappear。到目前为止,一切都很好。问题是该应用程序不使用 RIGHT 区域,因此我试图使包含 AnchorPane 的 RIGHT 区域越过 CENTER 区域。应用程序的正常状态是没有 RIGHT 区域,我不想在打开通知时调整整个应用程序的大小。尝试了几件事,例如:

None 它们都有效,因为它们要么不显示,要么调整我不想要的中心部分的大小。当显示通知菜单时,我希望 RIGHT 漂浮在 CENTER 区域上方......有什么办法吗?或者也许是另一个触发显示在 CENTER 部分上方的容器的想法?当然,我会在每个 CENTER 窗格中设计面板并使其可见或不可见,但我的应用程序大约有 15 个不同的中心 windows 所以在修改方面真的很糟糕......

我认为您不应该尝试让边框面板为您执行此操作,否则您最终会出现您不希望的行为,例如在面板可见时调整应用程序大小时中心不调整大小。

请记住,JavaFX 确实是 3D 的。您如何尝试将 BorderPane 包装在 AnchorPane、GridPane 或 ScrollPane(以有意义的为准)内,而不是尝试获取正确的插入来执行您的操作。例如向包含的 AnchorPane 添加一个 ScrollPane(您的 Slider)并将其放在前面并将其固定在顶部、右侧和底部。

这应该会在您的边框面板顶部为您提供一个右对齐的 ScrollPane。

当然,如果你想让它看起来像动画幻灯片,你可以试试这个:https://gist.github.com/jewelsea/1437374 或这个: http://blog.physalix.com/javafx2-borderpane-which-slides-in-and-out-on-command/

这里有一个非常粗略的例子来展示这个想法:

public class JavaFXApplication2 extends Application {
ScrollPane slider;
AnchorPane root;

@Override
public void start(Stage primaryStage) {
    Button btn = new Button();
    btn.setText("Slide in");
    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            root.getChildren().add(slider);
            AnchorPane.setRightAnchor(slider, 0.);
            AnchorPane.setTopAnchor(slider, 0.);
            AnchorPane.setBottomAnchor(slider, 0.);
            slider.toFront();
        }
    });


    Label l = new Label();
    l.setText("Test Label to Show inside content");

    Label l2 = new Label();
    l2.setText("Peek-a-Boo");

    slider = new ScrollPane();
    slider.setStyle("-fx-border-color: orangered;");
    slider.setContent(l2);

    root = new AnchorPane();
    root.getChildren().add(btn);
    root.getChildren().add(l);

    AnchorPane.setRightAnchor(l, 0.);
    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}