仅允许JavaFX节点的视觉溢出

时间:2018-11-18 03:50:19

标签: java css javafx layout

我有一个非常简单的问题,但找不到我的案子的答案。 我的目标是“仅”允许节点的视觉溢出,并防止像这样调整父节点的大小:

enter image description here

我想允许子元素(右)的视觉溢出,但我想防止父元素的尺寸调整并将其裁剪为黑色矩形(左)。 我知道setClip方法,但是通过这种方式,我得到了情况(#1),其中孩子在视觉上被剪切了。

JavaFX中是否可以允许视觉溢出?

我需要它,因为当嵌套子代溢出时,我无法处理StackPane中节点的居中,但是最好避免对其进行裁剪。我想得到第一种情况,但现在我得到第二种情况: enter image description here

我的问题还有其他解决方法吗?

2 个答案:

答案 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);