В JavaFX, в чем разница между Pane
и Group
? Я не могу понять, какая разница.
В чем разница между панелью и группой?
Ответ 1
A Group
не изменяется (что означает, что его размер не управляется его родителем в графе сцены) и принимает объединение границ его дочерних узлов. (Другими словами, локальные границы a Group
будут наименьшим прямоугольником, содержащим границы всех дочерних узлов). Если он больше пространства, выделенного в его родительском объекте, он будет обрезаться.
Напротив, a Pane
является изменяемым по размеру, поэтому его размер задается его родителем, который существенно определяет его границы.
Вот небольшая демонстрация. Group
находится сверху и Pane
ниже. Оба содержат фиксированный синий квадрат в (100,100)
и зеленый квадрат, который перемещается нажатием клавиш со стрелками влево/вправо. Обратите внимание, что в начале синий квадрат появляется в верхнем левом углу группы, поскольку локальные границы группы начинаются в самой верхней левой части всех ее дочерних узлов (т.е. Локальные границы группы простираются от (100, 100)
справа и вниз). Когда вы перемещаете зеленые прямоугольники "off screen", группа корректирует свои границы, чтобы включить изменения, когда это возможно, в то время как панель остается фиксированной.
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class GroupVsPaneDemo extends Application {
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane();
Group group = new Group();
VBox.setVgrow(group, Priority.NEVER);
VBox.setVgrow(pane, Priority.NEVER);
VBox vbox = new VBox(group, pane);
Rectangle rect1 = new Rectangle(100, 100, 100, 100);
Rectangle rect2 = new Rectangle(100, 100, 100, 100);
Rectangle rect3 = new Rectangle(200, 200, 100, 100);
Rectangle rect4 = new Rectangle(200, 200, 100, 100);
rect1.setFill(Color.BLUE);
rect2.setFill(Color.BLUE);
rect3.setFill(Color.GREEN);
rect4.setFill(Color.GREEN);
group.getChildren().addAll(rect1, rect3);
pane.getChildren().addAll(rect2, rect4);
Scene scene = new Scene(vbox, 800, 800);
scene.addEventHandler(KeyEvent.KEY_PRESSED, e -> {
double deltaX ;
switch(e.getCode()) {
case LEFT:
deltaX = -10 ;
break ;
case RIGHT:
deltaX = 10 ;
break ;
default:
deltaX = 0 ;
}
rect3.setX(rect3.getX() + deltaX);
rect4.setX(rect4.getX() + deltaX);
});
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Ответ 2
Несколько важных различий между Pane и Group заключается в следующем:
- Панель может иметь свой собственный размер, где группа будет принимать коллективные границы своих дочерних элементов и не напрямую изменяться.
- Панель может использоваться, когда вы хотите расположить свои узлы в абсолютном положении.
Ответ 3
Кроме того, обратите внимание, что группа была очень легка и не поддерживает много стилей. Например, вы не можете установить границы или цвет фона для группы.
Подробнее см. этот ответ.