Разрешить только визуальное переполнение узла JavaFX - PullRequest
0 голосов
/ 18 ноября 2018

У меня довольно простой вопрос, но я не могу найти ответ на свой случай. Моя цель - «разрешить» только визуальное переполнение узла и предотвратить изменение размера родительского узла, например:

enter image description here

Я хочу разрешить визуальное переполнение дочернего элемента (справа) , но я хочу предотвратить изменение размера родительского элемента и обрезать его как черный прямоугольник (слева) . Мне известен метод setClip, но таким образом я получаю ситуацию (# 1) , где ребенок обрезается визуально.

Возможно ли в JavaFX разрешить визуальное переполнение?

Мне это нужно, потому что я не могу справиться с центрированием узла в StackPane, когда вложенные дочерние объекты переполняются, но было бы хорошо избежать их отсечения. Я хочу получить первую ситуацию, но теперь я получаю вторую: enter image description here

Есть ли другое решение моей проблемы?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Если вы сами установите абсолютную позицию и размер дочерних элементов, вы можете заставить родительский макет игнорировать дочерний элемент, установив свойство managed в false.Неуправляемые узлы не перемещаются / не изменяются в размере родительским узлом и игнорируются при расчете границ макета родительского элемента.

child.setManaged(false); 
0 голосов
/ 18 ноября 2018

Это стандартное поведение для JavaFX Region s:

Каждый регион имеет границы макета, которые определены как (0, 0, ширина, высота).Регион может рисовать за пределами этих границ.Область содержимого Региона - это область, которая занята для макета его дочерних элементов.Эта область по умолчанию такая же, как границы макета области, но может быть изменена либо свойствами границы (либо с помощью 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...