在vbox

时间:2015-05-12 16:11:24

标签: javafx

有人可以解释一下为什么会出现这种奇怪的行为吗?当我在vbox中有一个组时,孩子中的每个项目都会将兄弟姐妹修改为。

发生以下奇怪行为:

这里的一切正常

everything normal here

这里一切正常

here too everything normal

哎呀,为什么搜索栏会移动???

whoops, why did the searchbar move???

我的应用程序的第一个结构:

root (VBox) //vbox so the menubar has its own space
├───menubar (MenuBar)
└───contentroot (Group)
    ├───searchbar (TextField) //searchbar should always be on the top left
    └───nodeRoot (Group)
        ├───circle1 (Nodes)
        └───circle2 (Nodes)

根是一个vbox,因此菜单栏有自己无可挑剔的空间。搜索栏应始终位于菜单栏正下方的左上角。 nodeRoot应包含每个其他节点。有点像绘图板,我应该能够拖延。

代码:

public void start(Stage primaryStage) throws Exception{
    VBox root = new VBox();

    MenuBar menuBar = new MenuBar(new Menu("File"));
    Group contentRoot = new Group();
    contentRoot.getChildren().add(new TextField("SearchBar"));
    Group nodeRoot = new Group();
    contentRoot.getChildren().add(nodeRoot);

    root.getChildren().addAll(menuBar, contentRoot);

    Circle circle = new Circle(30, Color.RED);
    nodeRoot.getChildren().add(circle);

    Scene scene = new Scene(root, 300, 275);
    primaryStage.setScene(scene);
    primaryStage.show();

    scene.setOnMousePressed(event -> {
        circle.setTranslateX(event.getSceneX() - 15);
        circle.setTranslateY(event.getSceneY() - 15);
    });
}

我猜是为什么会这样: 在我添加菜单栏并将所有内容放入VBox后,问题就开始出现了。这是nodeRoot的兄弟姐妹也改变了。我的猜测是因为VBox是一个Region,行为与扩展的普通组不同。但后来我不明白为什么只有当项目向左或向上移动时才会发生。

有人可以解释为什么会发生这种情况以及如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

来自javadocs for Group

  

一个集团将承担其子女的集体界限,而不是   可直接调整大小。

当您点击场景的顶部或左侧附近时,圆的边界包含负值。由于该组接受了这些边界,因此它也具有负值。 TextField从未设置任何布局边界,因此Group将其定位在(0,0)。因此,文本字段可以最终位于圆圈的下方或右侧。 vbox定位组以便尝试完全包含它,因此如果它包含负x值边界则向右移动,如果它包含负y值边界则向下移动。

如果您使用Pane来包含圈子,而不是Group

Pane contentRoot = new Pane();

它表现得更直观:Pane不会对其子节点的边界进行并集,因此如果圆具有负边界,它只会向左移动和/或在窗格的可见区域上方移动。 / p>