web-dev-qa-db-fra.com

Quelle est la différence entre un volet et un groupe?

En JavaFX, quelle est la différence entre Pane et Group? Je ne peux faire aucune différence.

17
Florian

Une Group n'est pas redimensionnable (ce qui signifie que sa taille n'est pas gérée par son parent dans le graphe de scène) et prend en charge l'union des limites de ses nœuds enfants. (Ainsi, en d'autres termes, les limites locales d'une Group seront le plus petit rectangle contenant les limites de tous les nœuds enfants). S'il est plus grand que l'espace alloué dans son parent, il sera tronqué.

En revanche, une Pane est redimensionnable; sa taille est donc définie par son parent, qui en détermine essentiellement les limites.

Voici une démo rapide. La Group est en haut et la Pane en dessous. Les deux contiennent un carré bleu fixe à (100,100) et un carré vert qui est déplacé en appuyant sur les touches fléchées gauche/droite. Notez qu'au début, le carré bleu apparaît dans le coin supérieur gauche du groupe, car les limites locales du groupe commencent au point situé le plus en haut à gauche de tous ses nœuds enfants (c'est-à-dire que les limites locales du groupe s'étendent de (100, 100) right et en bas). Lorsque vous déplacez les rectangles verts "hors écran", le groupe ajuste ses limites pour incorporer les modifications, dans la mesure du possible, tandis que le volet reste fixe.

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

La différence essentielle entre Pane et Group est que:

  • Le volet peut avoir sa propre taille, où, en tant que groupe, assumera collectivement les liens de ses enfants et sera non directement redimensionnable. 
  • Le volet peut être utilisé lorsque vous souhaitez positionner ses nœuds en position absolue.
5
ItachiUchiha

Notez également que Group a été conçu pour être très léger et ne prend pas en charge beaucoup de styles. Par exemple, vous ne pouvez pas définir de couleur de bordure ou d'arrière-plan pour le groupe.

Voir cette réponse pour plus de détails.

1
Sergey Grinev