Разница между панелью и группой


Мой вопрос прост : в JavaFX, в чем разница между a Pane и A Group? Я не могу сделать никакой разницы.

3 15

3 ответа:

A Group не подлежит изменению (это означает, что его размер не управляется его родителем в графе сцены) и принимает на себя объединение границ его дочерних узлов. (Другими словами, локальные границы Group будут наименьшим прямоугольником, содержащим границы всех дочерних узлов). Если он больше, чем пространство, которое он выделил в своем родителе, он будет обрезан.

Напротив, a Pane можно изменять, поэтому его размер задается его родителем, который по существу определяет его размер. границы.

Вот краткое демо. Group находится сверху, а Pane внизу. Оба содержат фиксированный синий квадрат в (100,100) и зеленый квадрат, который перемещается нажатием клавиш со стрелками влево/вправо. Обратите внимание, как в начале синий квадрат появляется в верхнем левом углу группы, потому что локальные границы группы начинаются в самой верхней левой точке всех ее дочерних узлов (т. е. локальные границы группы простираются от (100, 100) вправо и вниз). При перемещении зеленых прямоугольников " за пределы экрана", группа корректирует свои границы, чтобы включить изменения, где это возможно, в то время как область остается фиксированной.

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);
    }
}

Единственное важное различие между панелью и группой состоит в том, что:

    Панель
  • может иметь свой собственный размер, где как группа будет принимать коллективные границы своих детей и не являетсянепосредственно изменяемой.
  • Панель
  • можно использовать, если требуется расположить ее узлы в абсолютном положении.

Кроме того, обратите внимание, что группа была разработана, чтобы быть очень легкой и не поддерживает много стилей. Например, вы не можете установить цвет границы или фона для группы.

Смотрите Этот ответ для получения более подробной информации.