我有一个非常简单的问题,但找不到我的案子的答案。 我的目标是“仅”允许节点的视觉溢出,并防止像这样调整父节点的大小:
我想允许子元素(右)的视觉溢出,但我想防止父元素的尺寸调整并将其裁剪为黑色矩形(左)。
我知道setClip
方法,但是通过这种方式,我得到了情况(#1),其中孩子在视觉上被剪切了。
JavaFX中是否可以允许视觉溢出?
我需要它,因为当嵌套子代溢出时,我无法处理StackPane
中节点的居中,但是最好避免对其进行裁剪。我想得到第一种情况,但现在我得到第二种情况:
我的问题还有其他解决方法吗?
答案 0 :(得分:1)
这是JavaFX Region
的标准行为:
每个区域都有其布局范围,指定为(0,0,width,height)。区域可能会超出这些范围。区域的内容区域是为其子布局所占用的区域。默认情况下,此区域与Region的布局范围相同,但是可以通过边框的属性(使用BorderStrokes或BorderImages)和填充进行修改。填充可以为负数,以使Region的内容区域可能会超出Region的布局范围,但不会影响布局范围。
这是一个简短的例子:
import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane();
pane.setBackground(new Background(new BackgroundFill(Color.BLACK, null, null)));
pane.setMaxSize(500, 300);
Rectangle rect = new Rectangle(100, 100, Color.FIREBRICK);
rect.setOnMousePressed(this::handleMousePressed);
rect.setOnMouseDragged(this::handleMouseDragged);
pane.getChildren().add(rect);
StackPane root = new StackPane(pane);
primaryStage.setScene(new Scene(root, 600, 400));
primaryStage.show();
}
private Point2D origin;
private void handleMousePressed(MouseEvent event) {
origin = new Point2D(event.getX(), event.getY());
event.consume();
}
private void handleMouseDragged(MouseEvent event) {
Rectangle rect = (Rectangle) event.getSource();
rect.setTranslateX(rect.getTranslateX() + event.getX() - origin.getX());
rect.setTranslateY(rect.getTranslateY() + event.getY() - origin.getY());
event.consume();
}
}
它有一个Rectangle
,其父对象是Pane
,但允许您将Rectangle
拖动到任何地方,甚至在Pane
的边界之外。
答案 1 :(得分:1)
如果您自己设置子级的绝对位置和大小,则可以通过将the managed
property设置为false
来使父级布局忽略子级。非托管节点不会由父节点重新定位/调整大小,在计算父节点的布局范围时会被忽略。
child.setManaged(false);