窗格和组之间有什么区别?
What is the difference between a Pane and a Group?
在 JavaFX 中,Pane
和 Group
之间有什么区别?我看不出有什么不同。
Pane 和 Group 之间的几个重要区别是:
- 窗格可以有自己的大小,作为一个组将采用其子项的集体边界并且不能直接调整大小。
- 当您想将其节点定位在绝对位置时,可以使用窗格。
A Group
不可调整大小(这意味着它的大小不受场景图中父节点的管理),并采用其子节点边界的并集。 (因此,换句话说,Group
的局部边界将是包含所有子节点边界的最小矩形)。如果它大于在其父级中分配的 space,它将被剪裁。
相比之下,Pane
是可调整大小的,因此它的大小由其父级设置,这基本上决定了它的边界。
这是一个快速演示。 Group
在上面,Pane
在下面。两者都包含一个位于 (100,100)
的固定蓝色方块和一个通过按 left/right 箭头键移动的绿色方块。请注意,在开始时,蓝色方块是如何出现在组的左上角的,因为组的局部边界从其所有子节点的最左上角开始(即,组的局部边界从 (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);
}
}
另外请注意,Group 设计得非常轻巧,不支持很多样式。例如,您不能为组设置边框或背景颜色。
有关详细信息,请参阅 this answer。
在 JavaFX 中,Pane
和 Group
之间有什么区别?我看不出有什么不同。
Pane 和 Group 之间的几个重要区别是:
- 窗格可以有自己的大小,作为一个组将采用其子项的集体边界并且不能直接调整大小。
- 当您想将其节点定位在绝对位置时,可以使用窗格。
A Group
不可调整大小(这意味着它的大小不受场景图中父节点的管理),并采用其子节点边界的并集。 (因此,换句话说,Group
的局部边界将是包含所有子节点边界的最小矩形)。如果它大于在其父级中分配的 space,它将被剪裁。
相比之下,Pane
是可调整大小的,因此它的大小由其父级设置,这基本上决定了它的边界。
这是一个快速演示。 Group
在上面,Pane
在下面。两者都包含一个位于 (100,100)
的固定蓝色方块和一个通过按 left/right 箭头键移动的绿色方块。请注意,在开始时,蓝色方块是如何出现在组的左上角的,因为组的局部边界从其所有子节点的最左上角开始(即,组的局部边界从 (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);
}
}
另外请注意,Group 设计得非常轻巧,不支持很多样式。例如,您不能为组设置边框或背景颜色。
有关详细信息,请参阅 this answer。