Javafx 窗格和组之间有什么区别?

Javafx 窗格和组之间有什么区别?,javafx,pane,Javafx,Pane,在JavaFX中,窗格和组之间有什么区别?我看不出有什么区别。窗格和组之间的几个重要区别是: 窗格可以有自己的大小,作为一个组,它将接受其子窗格的集体边界,并且不可直接调整大小 当您想将其节点定位在绝对位置时,可以使用窗格 A组不可调整大小(这意味着其大小不受场景图中其父节点的管理),并接受其子节点边界的并集。(因此,换句话说,组的局部边界将是包含所有子节点边界的最小矩形)。如果它大于在其父级中分配的空间,则将对其进行剪裁 相比之下,窗格的大小是可调整的,因此其大小由其父级设置,这从本质上决定

在JavaFX中,
窗格
之间有什么区别?我看不出有什么区别。

窗格和组之间的几个重要区别是:

  • 窗格可以有自己的大小,作为一个组,它将接受其子窗格的集体边界,并且不可直接调整大小
  • 当您想将其节点定位在绝对位置时,可以使用窗格

A
不可调整大小(这意味着其大小不受场景图中其父节点的管理),并接受其子节点边界的并集。(因此,换句话说,
组的局部边界将是包含所有子节点边界的最小矩形)。如果它大于在其父级中分配的空间,则将对其进行剪裁

相比之下,
窗格
的大小是可调整的,因此其大小由其父级设置,这从本质上决定了其边界

这里是一个快速演示。
组位于顶部,而
窗格位于下方。两者都包含一个固定的蓝色正方形(位于
(100100)
)和一个绿色正方形(通过按左/右箭头键移动)。请注意,在开始时,蓝色方框显示在组的左上角,因为组的局部边界从其所有子节点的最左上角开始(即组的局部边界从
(100100)
向右和向下延伸)。当您将绿色矩形移到“屏幕外”时,该组将调整其边界,以尽可能合并更改,而窗格保持不变

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

另外,请注意,该组的设计非常轻巧,不支持很多样式。例如,不能为组设置边框或背景色


有关更多详细信息,请参阅。

我认为还可以使用组将其子节点定位在绝对位置(
layoutX
layoutY
参数起作用)。