有人可以解释一下为什么会出现这种奇怪的行为吗?当我在vbox中有一个组时,孩子中的每个项目都会将兄弟姐妹修改为。
发生以下奇怪行为:
这里的一切正常
这里一切正常
哎呀,为什么搜索栏会移动???
我的应用程序的第一个结构:
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,行为与扩展的普通组不同。但后来我不明白为什么只有当项目向左或向上移动时才会发生。
有人可以解释为什么会发生这种情况以及如何解决这个问题吗?
答案 0 :(得分:1)
一个集团将承担其子女的集体界限,而不是 可直接调整大小。
当您点击场景的顶部或左侧附近时,圆的边界包含负值。由于该组接受了这些边界,因此它也具有负值。 TextField
从未设置任何布局边界,因此Group
将其定位在(0,0)
。因此,文本字段可以最终位于圆圈的下方或右侧。 vbox定位组以便尝试完全包含它,因此如果它包含负x值边界则向右移动,如果它包含负y值边界则向下移动。
如果您使用Pane
来包含圈子,而不是Group
:
Pane contentRoot = new Pane();
它表现得更直观:Pane
不会对其子节点的边界进行并集,因此如果圆具有负边界,它只会向左移动和/或在窗格的可见区域上方移动。 / p>