2015-05-12 2 views
0

Может ли кто-нибудь объяснить мне, почему это странное поведение существует? Когда у меня есть группа в vbox, каждый элемент в дочернем элементе, похоже, изменяет братьев и сестер.Странное поведение при наличии группы в 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 так MenuBar имеет свое бесспорное пространство. Строка поиска всегда должна быть сверху слева, непосредственно под меню. Узел node должен содержать все остальные узлы. Своего рода рисунок, который я должен был бы перетащить.

Код:

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 является регионом, поведение отличается от обычной группы, которая расширяется. Но тогда я не понимаю, почему это происходит, только если элемент перемещается влево или вверх.

Может кто-нибудь объяснить, почему это происходит и как я могу это исправить?

ответ

1

От javadocs for Group:

A Group возьмет на себя коллективные рамки своих детей и не непосредственно изменяемыми.

Когда вы нажимаете на верхнюю или левую часть сцены, границы круга включают отрицательные значения. Так как группа берет эти границы, она также принимает отрицательные значения. У TextField никогда не было никаких ограничений на размещение, поэтому Group позиционирует его на (0,0). Следовательно, текстовое поле может оказаться ниже или справа от круга. Vbox позиционирует группу, чтобы попытаться полностью ее содержать, поэтому она смещает ее правильно, если она содержит отрицательные границы x-значения и вниз, если она содержит отрицательные границы y-значения.

Если вы используете Pane содержит круг, вместо Group:

Pane contentRoot = new Pane(); 

он ведет себя более интуитивно: Pane не принимает на объединении границ его дочерних узлов, поэтому если круг имеет отрицательные границы, он просто перемещается влево и/или над видимой областью панели.

+0

Проблема с nodeRoot заключается в том, что я также сделал ее подвижной, поэтому у меня есть «бесконечное» пространство для размещения моих узлов. При использовании панели вместо группы для nodeRoot узлы имеют тенденцию зажиматься при перемещении из панели. Вот почему я использую группу. Или вы знаете какое-либо другое решение? – kadir

+0

Если вы хотите, чтобы он не зажимался, когда он двигался влево, то, я думаю, вопрос в том, как еще вы ожидаете, что он будет себя вести? Если круг имеет отрицательные координаты и вы хотите, чтобы он оставался видимым, то, конечно, текстовое поле должно перемещаться вправо, чтобы его можно было разместить. –

+0

Возможно, я был недостаточно ясен. Вырезание предназначалось не для окна, а при перемещении nodeRoot (в данном случае группа, по вашему предложению, панель). Это связано с тем, что панель не бесконечно большая и имеет некоторые границы. Если я, например, перемещаю панель 300px вправо, узлы в клипе панели не на границах окна, а на левой стороне панели, которая теперь составляет 300 пикселей. – kadir

Смежные вопросы