使BorderPane区域超越另一个

时间:2015-09-05 19:45:08

标签: javafx javafx-8 scenebuilder

我现在一直在努力让BorderPane地区越过另一个地区......

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

  • TOP区域中的标题
  • LEFT区域中的菜单
  • 内容,取决于页面,在它的中心
  • 在其右侧区域的可选面板

正确的区域是问题所在。单击TOP区域中的“通知按钮”时,它应该显示/消失。到现在为止还挺好。问题是该应用程序不使用RIGHT区域,所以我试图让包含AnchorPane的RIGHT区域越过CENTER区域。应用程序的正常状态没有RIGHT区域,我不想在打开通知时调整整个应用程序的大小。试过几件事,比如:

  • 单击通知按钮时,将CENTER部分发送到Back()并将RIGHT宽度设置为300个想要的像素
  • 将右侧区域发送到前方()
  • 发送整个BorderPane toFront()

它们都不起作用,因为它们都没有显示,或者调整了我不想要的中心部分。当通知菜单显示时,我希望RIGHT漂浮在CENTER区域之上......有没有办法做到这一点?或者可能是另一个想法触发一个显示在CENTER部分上方的容器?当然,我会在每个CENTER窗格中设计面板并使其可见或不可见,但我的应用程序大约有15个不同的中心窗口,因此在修改方面会非常糟糕......

1 个答案:

答案 0 :(得分:1)

我认为您不应该尝试让borderpane为您执行此操作,否则您最终会遇到您不想要的行为,例如当面板可见时调整应用程序的大小时不会调整大小。

请记住,JavaFX确实是3D。你试着将BorderPane包装在AnchorPane,GridPane或ScrollPane中(无论哪个有意义)而不是试图获得正确的插入来做你的事情。例如将ScrollPane(您的滑块)添加到包含的AnchorPane并将其添加到前面并锚定它的顶部,右侧和底部。

这应该会在borderpane上面给你一个右对齐的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);
}

}